From: <geo...@us...> - 2009-11-23 09:15:13
|
Revision: 3280 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3280&view=rev Author: geoffthemedio Date: 2009-11-23 09:14:54 +0000 (Mon, 23 Nov 2009) Log Message: ----------- -Made planets appear on sidepanel in systems the player doesn't currently have vision into, if the player has seen those planets previously. -Removed System::FindObjects functions, for reasons similar to other FindObjects functions in previous commits. -Added bug: New fleets don't appear in FleetWnd on turn they're created. Will attempt to fix later... Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/BuildDesignatorWnd.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/System.h trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -1317,9 +1317,13 @@ // ...and ( contain a friendly fleet *or* not contain a hostile fleet ) bool blocked = false; - std::vector<const Fleet*> fleets = system->FindObjects<Fleet>(); - for (std::vector<const Fleet*>::const_iterator it = fleets.begin(); it != fleets.end(); ++it) { - const Fleet* fleet = *it; + std::vector<int> fleet_ids = system->FindObjectIDs<Fleet>(); + for (std::vector<int>::const_iterator it = fleet_ids.begin(); it != fleet_ids.end(); ++it) { + const Fleet* fleet = GetObject<Fleet>(*it); + if (!fleet) { + Logger().errorStream() << "Empire::UpdateSupplyUnobstructedSystems couldn't get fleet with id " << *it; + continue; + } // check if this empire owns this fleet. if (fleet->OwnedBy(m_id)) { Modified: trunk/FreeOrion/UI/BuildDesignatorWnd.cpp =================================================================== --- trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/UI/BuildDesignatorWnd.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -951,7 +951,7 @@ return; } - std::vector<const Planet*> planets = sys->FindObjects<Planet>(); + std::vector<int> planets = sys->FindObjectIDs<Planet>(); if (planets.empty()) { this->SelectPlanet(UniverseObject::INVALID_OBJECT_ID); @@ -963,10 +963,12 @@ int best_planet_id = UniverseObject::INVALID_OBJECT_ID; // id of selected planet double best_planet_pop = -99999.9; // arbitrary negative number, so any planet's pop will be better - for (std::vector<const Planet*>::iterator it = planets.begin(); it != planets.end(); ++it) { - const Planet* planet = *it; - if (!planet) + for (std::vector<int>::iterator it = planets.begin(); it != planets.end(); ++it) { + const Planet* planet = GetObject<Planet>(*it); + if (!planet) { + Logger().errorStream() << "BuildDesignatorWnd::SetDefaultPlanet couldn't get planet with id " << *it; continue; + } int planet_id = planet->ID(); if (!m_side_panel->PlanetSelectable(planet_id)) continue; Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -1972,25 +1972,24 @@ { // get fleets for specified system and empire // need to know what fleets to put in the Wnd, given the specified system and empire. - std::vector<const Fleet*> wnd_fleets; if (const System* system = GetUniverse().Objects().Object<System>(m_system_id)) { // get all fleets in system. - std::vector<const Fleet*> all_system_fleets = system->FindObjects<Fleet>(); + std::vector<int> all_system_fleets = system->FindObjectIDs<Fleet>(); // transfer appropriately owned fleets - for (std::vector<const Fleet*>::const_iterator it = all_system_fleets.begin(); it != all_system_fleets.end(); ++it) { - const Fleet* wnd_fleet = *it; - if (wnd_fleet->OwnedBy(m_empire_id)/* || m_empire_id == ALL_EMPIRES*/) - wnd_fleets.push_back(wnd_fleet); + for (std::vector<int>::const_iterator it = all_system_fleets.begin(); it != all_system_fleets.end(); ++it) {\ + int fleet_id = *it; + const Fleet* wnd_fleet = GetObject<Fleet>(fleet_id); + if (!wnd_fleet) { + Logger().errorStream() << "FleetWnd::FleetWnd couldn't get fleet with id " << fleet_id; + continue; + } + if (wnd_fleet->OwnedBy(m_empire_id)) + m_fleet_ids.insert(fleet_id); } } - // convert from Fleet* to int fleet's object id - for (std::vector<const Fleet*>::const_iterator it = wnd_fleets.begin(); it != wnd_fleets.end(); ++it) - m_fleet_ids.insert((*it)->ID()); - - Init(selected_fleet_id); } @@ -2115,11 +2114,15 @@ if (const System* system = GetUniverse().Objects().Object<System>(m_system_id)) { // get fleets to show from system, based on required ownership m_fleet_ids.clear(); - std::vector<const Fleet*> system_fleets = system->FindObjects<Fleet>(); - for (std::vector<const Fleet*>::const_iterator it = system_fleets.begin(); it != system_fleets.end(); ++it) { - const Fleet* fleet = *it; + std::vector<int> system_fleets = system->FindObjectIDs<Fleet>(); + for (std::vector<int>::const_iterator it = system_fleets.begin(); it != system_fleets.end(); ++it) { + int fleet_id = *it; + const Fleet* fleet = GetObject<Fleet>(fleet_id); + if (!fleet) { + Logger().errorStream() << "FleetWnd::Refresh couldn't get fleet with id " << fleet_id; + continue; + } if (m_empire_id == ALL_EMPIRES || fleet->OwnedBy(m_empire_id)) { - int fleet_id = fleet->ID(); m_fleet_ids.insert(fleet_id); AddFleet(fleet_id); } Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -203,7 +203,9 @@ { SetName("PopulationPanel"); - const UniverseObject* obj = GetUniverse().Objects().Object(m_popcenter_id); + const UniverseObject* obj = GetObject(m_popcenter_id); + if (!obj) + obj = GetEmpireKnownObject(m_popcenter_id, HumanClientApp::GetApp()->EmpireID()); const PopCenter* pop = dynamic_cast<const PopCenter*>(obj); if (!pop) throw std::invalid_argument("Attempted to construct a PopulationPanel with an object id is not a PopCenter"); @@ -372,7 +374,8 @@ void PopulationPanel::Update() { const PopCenter* pop = GetPopCenter(); - const UniverseObject* obj = GetUniverse().Objects().Object(m_popcenter_id); + const UniverseObject* obj = GetObject(m_popcenter_id); + if (!obj) obj = GetEmpireKnownObject(m_popcenter_id, HumanClientApp::GetApp()->EmpireID()); if (!pop || !obj) { Logger().errorStream() << "PopulationPanel::Update couldn't get PopCenter or couldn't get UniverseObject"; @@ -418,7 +421,9 @@ const PopCenter* PopulationPanel::GetPopCenter() const { - const UniverseObject* obj = GetUniverse().Objects().Object(m_popcenter_id); + const UniverseObject* obj = GetObject(m_popcenter_id); + if (!obj) + obj = GetEmpireKnownObject(m_popcenter_id, HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "PopulationPanel tried to get an object with an invalid m_popcenter_id"; return 0; @@ -453,8 +458,10 @@ { SetName("ResourcePanel"); - const UniverseObject* obj = GetUniverse().Objects().Object(m_rescenter_id); + const UniverseObject* obj = GetObject(m_rescenter_id); if (!obj) + obj = GetEmpireKnownObject(m_rescenter_id, HumanClientApp::GetApp()->EmpireID()); + if (!obj) throw std::invalid_argument("Attempted to construct a ResourcePanel with an object_id that is not an UniverseObject"); const ResourceCenter* res = dynamic_cast<const ResourceCenter*>(obj); if (!res) @@ -611,7 +618,9 @@ if (!s_expanded_map[m_rescenter_id]) { Resize(GG::Pt(Width(), icon_height)); - const UniverseObject* obj = GetUniverse().Objects().Object(m_rescenter_id); + const UniverseObject* obj = GetObject(m_rescenter_id); + if (!obj) + obj = GetEmpireKnownObject(m_rescenter_id, HumanClientApp::GetApp()->EmpireID()); const ResourceCenter* res = dynamic_cast<const ResourceCenter*>(obj); if (res) { @@ -722,11 +731,10 @@ // draw details depending on state of ownership and expanded / collapsed status // determine ownership - /*const UniverseObject* obj = GetUniverse().Object(m_rescenter_id); - if(obj->Owners().empty()) + /*const UniverseObject* obj = GetObject(m_rescenter_id); + if (obj->Owners().empty()) // uninhabited - else - { + else { if(!obj->OwnedBy(HumanClientApp::GetApp()->EmpireID())) // inhabited by other empire else @@ -759,7 +767,9 @@ m_multi_icon_value_indicator->ClearToolTip(METER_CONSTRUCTION); - const UniverseObject* obj = GetUniverse().Objects().Object(m_rescenter_id); + const UniverseObject* obj = GetObject(m_rescenter_id); + if (!obj) + obj = GetEmpireKnownObject(m_rescenter_id, HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "BuildingPanel::Update couldn't get object with id " << m_rescenter_id; return; @@ -779,7 +789,7 @@ if (owners.empty()) { owner = OS_NONE; // uninhabited } else { - if(!obj->OwnedBy(HumanClientApp::GetApp()->EmpireID())) + if (!obj->OwnedBy(HumanClientApp::GetApp()->EmpireID())) owner = OS_FOREIGN; // inhabited by other empire else owner = OS_SELF; // inhabited by this empire (and possibly other empires) @@ -1115,7 +1125,9 @@ void MilitaryPanel::Update() { - const UniverseObject* obj = GetUniverse().Objects().Object(m_planet_id); + const UniverseObject* obj = GetObject(m_planet_id); + if (!obj) + obj = GetEmpireKnownObject(m_planet_id, HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "MilitaryPanel::Update coudln't get object with id " << m_planet_id; return; @@ -1326,13 +1338,14 @@ return; } - const ObjectMap& objects = GetUniverse().Objects(); for (std::size_t i = 0; i < m_icons.size(); ++i) { assert(m_icons[i]); double sum = 0.0; for (std::size_t j = 0; j < m_object_ids.size(); ++j) { - const UniverseObject* obj = objects.Object(m_object_ids[j]); + const UniverseObject* obj = GetObject(m_object_ids[j]); + if (!obj) + obj = GetEmpireKnownObject(m_object_ids[j], HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "MultiIconValueIndicator::Update coudln't get object with id " << m_object_ids[j]; continue; @@ -1478,7 +1491,9 @@ m_projected_maxes.clear(); m_projected_currents.clear(); - const UniverseObject* obj = GetUniverse().Objects().Object(m_object_id); + const UniverseObject* obj = GetObject(m_object_id); + if (!obj) + obj = GetEmpireKnownObject(m_object_id, HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "MultiMeterStatusBar couldn't get object with id " << m_object_id; return; @@ -1533,7 +1548,10 @@ GG::Connect(m_expand_button->ClickedSignal, &BuildingsPanel::ExpandCollapseButtonPressed, this); // get owners, connect their production queue changed signals to update this panel - if (const UniverseObject* planet = GetUniverse().Objects().Object(m_planet_id)) { + const UniverseObject* planet = GetObject(m_planet_id); + if (!planet) + planet = GetEmpireKnownObject(m_planet_id, HumanClientApp::GetApp()->EmpireID()); + if (planet) { const std::set<int>& owners = planet->Owners(); for (std::set<int>::const_iterator it = owners.begin(); it != owners.end(); ++it) { if (const Empire* empire = Empires().Lookup(*it)) { @@ -1621,8 +1639,9 @@ } m_building_indicators.clear(); - const ObjectMap& objects = GetUniverse().Objects(); - const Planet* plt = objects.Object<Planet>(m_planet_id); + const Planet* plt = GetObject<Planet>(m_planet_id); + if (!plt) + plt = GetEmpireKnownObject<Planet>(m_planet_id, HumanClientApp::GetApp()->EmpireID()); if (!plt) { Logger().errorStream() << "BuildingsPanel::Update couldn't get planet with id " << m_planet_id; return; @@ -1633,14 +1652,15 @@ // get existing / finished buildings and use them to create building indicators for (std::set<int>::const_iterator it = buildings.begin(); it != buildings.end(); ++it) { - const Building* building = objects.Object<Building>(*it); + int object_id = *it; + const Building* building = GetObject<Building>(object_id); + if (!building) + building = GetEmpireKnownObject<Building>(object_id, HumanClientApp::GetApp()->EmpireID()); if (!building) { - Logger().errorStream() << "BuildingsPanel::Update couldn't get building with id: " << *it << " on planet " << plt->Name(); - const UniverseObject* obj = objects.Object(*it); - Logger().errorStream() << "... trying to get object as generic UniverseObject: " << (obj ? obj->Name() : " unavailable!"); + Logger().errorStream() << "BuildingsPanel::Update couldn't get building with id: " << object_id << " on planet " << plt->Name(); continue; } - BuildingIndicator* ind = new BuildingIndicator(GG::X(indicator_size), *it); + BuildingIndicator* ind = new BuildingIndicator(GG::X(indicator_size), object_id); m_building_indicators.push_back(ind); } @@ -1788,7 +1808,7 @@ { SetBrowseModeTime(GetOptionsDB().Get<int>("UI.tooltip-delay")); - if (const Building* building = GetUniverse().Objects().Object<Building>(m_building_id)) + if (const Building* building = GetObject<Building>(m_building_id)) GG::Connect(building->StateChangedSignal, &BuildingIndicator::Refresh, this); Refresh(); @@ -1992,7 +2012,9 @@ // get specials to display - const UniverseObject* obj = GetUniverse().Objects().Object(m_object_id); + const UniverseObject* obj = GetObject(m_object_id); + if (!obj) + obj = GetEmpireKnownObject(m_object_id, HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "SpecialsPanel::Update couldn't get object with id " << m_object_id; return; @@ -2210,9 +2232,9 @@ const boost::shared_ptr<GG::Font>& font = ClientUI::GetFont(); // add label-value pair for each resource-producing object in system to indicate amount of resource produced - std::vector<UniverseObject*> obj_vec = system->FindObjects(); - for (std::vector<UniverseObject*>::const_iterator it = obj_vec.begin(); it != obj_vec.end(); ++it) { - const UniverseObject* obj = *it; + std::vector<int> obj_vec = system->FindObjectIDs(); + for (std::vector<int>::const_iterator it = obj_vec.begin(); it != obj_vec.end(); ++it) { + const UniverseObject* obj = GetObject(*it); // display information only for the requested player if (m_empire_id != ALL_EMPIRES && !obj->OwnedBy(m_empire_id)) @@ -2308,7 +2330,7 @@ // add label-value pair for each resource-consuming object in system to indicate amount of resource consumed - std::vector<UniverseObject*> obj_vec = system->FindObjects(); + std::vector<int> obj_vec = system->FindObjectIDs(); //// DEBUG //Logger().debugStream() << "System::FindObjects for system " << m_system->Name(); //for (std::vector<UniverseObject*>::const_iterator it = obj_vec.begin(); it != obj_vec.end(); ++it) @@ -2316,8 +2338,8 @@ //// END DEBUG - for (std::vector<UniverseObject*>::const_iterator it = obj_vec.begin(); it != obj_vec.end(); ++it) { - const UniverseObject* obj = *it; + for (std::vector<int>::const_iterator it = obj_vec.begin(); it != obj_vec.end(); ++it) { + const UniverseObject* obj = GetObject(*it); // display information only for the requested player if (m_empire_id != ALL_EMPIRES && !obj->OwnedBy(m_empire_id)) @@ -2600,8 +2622,10 @@ } void MeterBrowseWnd::UpdateSummary() { - const UniverseObject* obj = GetUniverse().Objects().Object(m_object_id); + const UniverseObject* obj = GetObject(m_object_id); if (!obj) + obj = GetEmpireKnownObject(m_object_id, HumanClientApp::GetApp()->EmpireID()); + if (!obj) return; const Meter* meter = obj->GetMeter(m_meter_type); if (!meter) @@ -2664,7 +2688,9 @@ // get object and meter, aborting if not valid - const UniverseObject* obj = GetUniverse().Objects().Object(m_object_id); + const UniverseObject* obj = GetObject(m_object_id); + if (!obj) + obj = GetEmpireKnownObject(m_object_id, HumanClientApp::GetApp()->EmpireID()); if (!obj) { Logger().errorStream() << "MeterBrowseWnd::UpdateEffectLabelsAndValues couldn't get object with id " << m_object_id; return; @@ -2692,7 +2718,9 @@ // add label-value pairs for each alteration recorded for this meter for (std::vector<Universe::EffectAccountingInfo>::const_iterator info_it = info_vec.begin(); info_it != info_vec.end(); ++info_it) { - const UniverseObject* source = GetUniverse().Objects().Object(info_it->source_id); + const UniverseObject* source = GetObject(info_it->source_id); + if (!source) + source = GetEmpireKnownObject(info_it->source_id, HumanClientApp::GetApp()->EmpireID()); int empire_id = ALL_EMPIRES; const Empire* empire = 0; Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -1742,10 +1742,12 @@ void MapWnd::SelectSystem(int system_id) { //std::cout << "MapWnd::SelectSystem(" << system_id << ")" << std::endl; - const System* system = GetUniverse().Objects().Object<System>(system_id); + const System* system = GetObject<System>(system_id); + if (!system) + system = GetEmpireKnownObject<System>(system_id, HumanClientApp::GetApp()->EmpireID()); if (!system) { + Logger().errorStream() << "MapWnd::SelectSystem couldn't find system with id " << system_id << " so is selected no system instead"; system_id = UniverseObject::INVALID_OBJECT_ID; - Logger().errorStream() << "MapWnd::SelectSystem couldn't find system with id " << system_id << " so is selected no system instead"; } if (SidePanel::SystemID() != system_id) { Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -392,7 +392,7 @@ { public: /** \name Structors */ //@{ - PlanetPanel(GG::X w, const Planet &planet, StarType star_type); ///< basic ctor + PlanetPanel(GG::X w, int planet_id, StarType star_type); ///< basic ctor ~PlanetPanel(); //@} @@ -423,8 +423,7 @@ void ClickColonize(); ///< called if colonize button is pressed - Planet* GetPlanet(); ///< returns the planet with ID m_planet_id - const Planet* GetPlanet() const; + Planet* GetPlanet() const; ///< returns the planet with ID m_planet_id int m_planet_id; ///< id for the planet with is represented by this planet panel GG::TextControl* m_planet_name; ///< planet name @@ -613,28 +612,30 @@ } Ship* FindColonyShip(int system_id) { - ObjectMap& objects = GetUniverse().Objects(); - - const System* system = objects.Object<const System>(system_id); + const System* system = GetObject<System>(system_id); if (!system) return 0; - std::vector<const Fleet*> flt_vec = system->FindObjects<Fleet>(); + std::vector<int> fleet_ids = system->FindObjectIDs<Fleet>(); - int empire_id = HumanClientApp::GetApp()->EmpireID(); // check all fleets in this system... - for (unsigned int i = 0; i < flt_vec.size(); i++) { + for (std::vector<int>::const_iterator it = fleet_ids.begin(); it != fleet_ids.end(); ++it) { + Fleet* fleet = GetObject<Fleet>(*it); + if (!fleet) { + Logger().errorStream() << "FindColonyShip couldn't get fleet with id " << *it; + continue; + } + // reject fleets not owned by this empire - if (flt_vec[i]->Owners().find(empire_id) == flt_vec[i]->Owners().end()) continue; + if (fleet->Owners().find(empire_id) == fleet->Owners().end()) continue; // reject fleets that are moving - if (!flt_vec[i]->Accept(StationaryFleetVisitor(*flt_vec[i]->Owners().begin()))) continue; + if (!fleet->Accept(StationaryFleetVisitor(*fleet->Owners().begin()))) continue; // check if any of the ship in this fleet is a colony ship - for (Fleet::const_iterator it = flt_vec[i]->begin(); it != flt_vec[i]->end(); ++it) { - Ship* s = objects.Object<Ship>(*it); - + for (Fleet::const_iterator it = fleet->begin(); it != fleet->end(); ++it) { + Ship* s = GetObject<Ship>(*it); if (!s) { Logger().errorStream() << "coudln't find ship with id: " << *it; continue; @@ -669,9 +670,9 @@ static const bool SHOW_ALL_PLANET_PANELS = false; //!< toggles whether to show population, resource, military and building info panels on planet panels that this player doesn't control } -SidePanel::PlanetPanel::PlanetPanel(GG::X w, const Planet &planet, StarType star_type) : +SidePanel::PlanetPanel::PlanetPanel(GG::X w, int planet_id, StarType star_type) : GG::Control(GG::X0, GG::Y0, w, GG::Y1, GG::INTERACTIVE), - m_planet_id(planet.ID()), + m_planet_id(planet_id), m_planet_name(0), m_env_size(0), m_button_colonize(0), @@ -687,12 +688,18 @@ { SetName(UserString("PLANET_PANEL")); + const Planet* planet = GetPlanet(); + if (!planet) { + Logger().errorStream() << "SidePanel::PlanetPanel::PlanetPanel couldn't get latest known planet with ID " << m_planet_id; + return; + } + const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); if (GetOptionsDB().Get<bool>("UI.sidepanel-planet-shown")) { - if (planet.Type() == PT_ASTEROIDS) { + if (planet->Type() == PT_ASTEROIDS) { std::vector<boost::shared_ptr<GG::Texture> > textures; - GetAsteroidTextures(planet.ID(), textures); + GetAsteroidTextures(m_planet_id, textures); GG::X texture_width = textures[0]->DefaultWidth(); GG::Y texture_height = textures[0]->DefaultHeight(); GG::Pt planet_image_pos(GG::X(MAX_PLANET_DIAMETER / 2 - texture_width / 2 + 3), GG::Y0); @@ -706,19 +713,19 @@ AttachChild(m_planet_graphic); m_planet_graphic->Play(); - } else if (planet.Type() < NUM_PLANET_TYPES) { - int planet_image_sz = PlanetDiameter(planet.Size()); + } else if (planet->Type() < NUM_PLANET_TYPES) { + int planet_image_sz = PlanetDiameter(planet->Size()); GG::Pt planet_image_pos(GG::X(MAX_PLANET_DIAMETER / 2 - GG::X(planet_image_sz) / 2 + 3), GG::Y(MAX_PLANET_DIAMETER / 2 - GG::Y(planet_image_sz) / 2)); const std::map<PlanetType, std::vector<RotatingPlanetData> >& planet_data = GetRotatingPlanetData(); - std::map<PlanetType, std::vector<RotatingPlanetData> >::const_iterator it = planet_data.find(planet.Type()); + std::map<PlanetType, std::vector<RotatingPlanetData> >::const_iterator it = planet_data.find(planet->Type()); int num_planets_of_type; - if (it != planet_data.end() && (num_planets_of_type = planet_data.find(planet.Type())->second.size())) { + if (it != planet_data.end() && (num_planets_of_type = planet_data.find(planet->Type())->second.size())) { // using algorithm from Thomas Wang's 32 bit Mix Function; assumes that // only the lower 16 bits of the system and planet ID's are significant unsigned int hash_value = - (static_cast<unsigned int>(planet.SystemID()) & 0xFFFF) + (static_cast<unsigned int>(planet.ID()) & 0xFFFF); + (static_cast<unsigned int>(m_planet_id) & 0xFFFF) + (static_cast<unsigned int>(m_planet_id) & 0xFFFF); hash_value += ~(hash_value << 15); hash_value ^= hash_value >> 10; hash_value += hash_value << 3; @@ -726,13 +733,15 @@ hash_value += ~(hash_value << 11); hash_value ^= hash_value >> 16; m_rotating_planet_graphic = - new RotatingPlanetControl(planet_image_pos.x, planet_image_pos.y, planet, star_type, + new RotatingPlanetControl(planet_image_pos.x, planet_image_pos.y, *planet, star_type, it->second[hash_value % num_planets_of_type]); AttachChild(m_rotating_planet_graphic); } } } + + // create planet name text // apply formatting tags around planet name to indicate: @@ -742,22 +751,24 @@ bool capitol = false, homeworld = false, has_shipyard = false; // need to check all empires for homeworld or capitols - const ObjectMap& objects = GetUniverse().Objects(); const EmpireManager& manager = Empires(); - for (EmpireManager::const_iterator empire_it = manager.begin(); empire_it != manager.end(); ++empire_it) { if (capitol && homeworld) break; // don't need to check any more empires if already have both possible true results const Empire* empire = empire_it->second; - if (empire->HomeworldID() == planet.ID()) + if (!empire) { + Logger().errorStream() << "PlanetPanel::PlanetPanel got null empire pointer for id " << empire_it->first; + continue; + } + if (empire->HomeworldID() == m_planet_id) homeworld = true; - if (empire->CapitolID() == planet.ID()) + if (empire->CapitolID() == m_planet_id) capitol = true; } // check for shipyard - const std::set<int>& buildings = planet.Buildings(); + const std::set<int>& buildings = planet->Buildings(); for (std::set<int>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { - const Building* building = objects.Object<Building>(*building_it); + const Building* building = GetEmpireKnownObject<Building>(*building_it, HumanClientApp::GetApp()->EmpireID()); if (!building) continue; // annoying hard-coded building name here... not sure how better to deal with it @@ -767,7 +778,7 @@ } } // wrap with formatting tags - std::string wrapped_planet_name = planet.Name(); + std::string wrapped_planet_name = planet->Name(); if (homeworld) wrapped_planet_name = "<i>" + wrapped_planet_name + "</i>"; if (has_shipyard) @@ -783,30 +794,30 @@ font, ClientUI::TextColor()); AttachChild(m_planet_name); - std::string env_size_text = GetPlanetSizeName(planet) + " " + GetPlanetTypeName(planet) + " (" + GetPlanetEnvironmentName(planet) + ")"; + std::string env_size_text = GetPlanetSizeName(*planet) + " " + GetPlanetTypeName(*planet) + " (" + GetPlanetEnvironmentName(*planet) + ")"; // create info panels and attach signals GG::X panel_width = w - MAX_PLANET_DIAMETER - 2*EDGE_PAD; - m_population_panel = new PopulationPanel(panel_width, planet.ID()); + m_population_panel = new PopulationPanel(panel_width, m_planet_id); AttachChild(m_population_panel); GG::Connect(m_population_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); - m_resource_panel = new ResourcePanel(panel_width, planet.ID()); + m_resource_panel = new ResourcePanel(panel_width, m_planet_id); AttachChild(m_resource_panel); GG::Connect(m_resource_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); GG::Connect(m_resource_panel->PrimaryFocusChangedSignal, &SidePanel::PlanetPanel::SetPrimaryFocus, this); GG::Connect(m_resource_panel->SecondaryFocusChangedSignal, &SidePanel::PlanetPanel::SetSecondaryFocus, this); - m_military_panel = new MilitaryPanel(panel_width, planet.ID()); + m_military_panel = new MilitaryPanel(panel_width, m_planet_id); AttachChild(m_military_panel); GG::Connect(m_military_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); - m_buildings_panel = new BuildingsPanel(panel_width, 4, planet.ID()); + m_buildings_panel = new BuildingsPanel(panel_width, 4, m_planet_id); AttachChild(m_buildings_panel); GG::Connect(m_buildings_panel->ExpandCollapseSignal, &SidePanel::PlanetPanel::DoLayout, this); - m_specials_panel = new SpecialsPanel(panel_width, planet.ID()); + m_specials_panel = new SpecialsPanel(panel_width, m_planet_id); AttachChild(m_specials_panel); m_env_size = new GG::TextControl(GG::X(MAX_PLANET_DIAMETER), GG::Y0, env_size_text, ClientUI::GetFont(), ClientUI::TextColor()); @@ -830,14 +841,13 @@ // all the PlanetPanel in the SidePanel //if (System* system = plt->SystemID()) // GG::Connect(system->StateChangedSignal, &SidePanel::PlanetPanel::Refresh, this); - GG::Connect(planet.StateChangedSignal, &SidePanel::PlanetPanel::Refresh, this); + GG::Connect(planet->StateChangedSignal, &SidePanel::PlanetPanel::Refresh, this); } SidePanel::PlanetPanel::~PlanetPanel() { delete m_button_colonize; delete m_env_size; - delete m_population_panel; delete m_resource_panel; delete m_military_panel; @@ -845,16 +855,14 @@ delete m_specials_panel; } -Planet* SidePanel::PlanetPanel::GetPlanet() +Planet* SidePanel::PlanetPanel::GetPlanet() const { - return GetUniverse().Objects().Object<Planet>(m_planet_id); + if (Planet* planet = GetObject<Planet>(m_planet_id)) + return planet; + else + return GetEmpireKnownObject<Planet>(m_planet_id, HumanClientApp::GetApp()->EmpireID()); } -const Planet* SidePanel::PlanetPanel::GetPlanet() const -{ - return GetUniverse().Objects().Object<const Planet>(m_planet_id); -} - void SidePanel::PlanetPanel::DoLayout() { const int MAX_PLANET_DIAMETER = GetOptionsDB().Get<int>("UI.sidepanel-planet-max-diameter"); @@ -862,11 +870,15 @@ GG::X right = left + Width() - MAX_PLANET_DIAMETER - 2*EDGE_PAD; GG::Y y = GG::Y0; - m_planet_name->MoveTo(GG::Pt(left, y)); // assumed to always be this Wnd's child - y += m_planet_name->Height(); // no interpanel space needed here, I declare arbitrarily + if (m_planet_name) { + m_planet_name->MoveTo(GG::Pt(left, y)); + y += m_planet_name->Height(); // no interpanel space needed here, I declare arbitrarily + } - m_specials_panel->SizeMove(GG::Pt(left, y), GG::Pt(right, y + m_specials_panel->Height())); // assumed to always be this Wnd's child - y += m_specials_panel->Height() + EDGE_PAD; + if (m_specials_panel) { + m_specials_panel->SizeMove(GG::Pt(left, y), GG::Pt(right, y + m_specials_panel->Height())); // assumed to always be this Wnd's child + y += m_specials_panel->Height() + EDGE_PAD; + } if (m_env_size && m_env_size->Parent() == this) { m_env_size->MoveTo(GG::Pt(left, y)); @@ -914,11 +926,30 @@ if (!planet) { Logger().debugStream() << "PlanetPanel::Refresh couldn't get planet!"; // clear / hide everything... + DetachChild(m_planet_name); + delete m_planet_name; m_planet_name = 0; + DetachChild(m_env_size); + delete m_env_size; m_env_size = 0; + DetachChild(m_population_panel); + delete m_population_panel; m_population_panel = 0; + DetachChild(m_resource_panel); + delete m_resource_panel; m_resource_panel = 0; + DetachChild(m_military_panel); + delete m_military_panel; m_military_panel = 0; + + DetachChild(m_buildings_panel); + delete m_buildings_panel; m_buildings_panel = 0; + DetachChild(m_button_colonize); + delete m_button_colonize; m_button_colonize = 0; + + DetachChild(m_specials_panel); + delete m_specials_panel; m_specials_panel = 0; + DoLayout(); return; } @@ -938,7 +969,7 @@ // colour planet name with owner's empire colour m_empire_colour = GG::CLR_ZERO; - if (!planet->Owners().empty()) { + if (!planet->Owners().empty() && m_planet_name) { if (Empire* planet_empire = Empires().Lookup(*(planet->Owners().begin()))) { m_empire_colour = planet_empire->Color(); m_planet_name->SetTextColor(planet_empire->Color()); @@ -959,11 +990,14 @@ // show population, resource and military panels, but hide environement / size indicator that's used only for uncolonized planets DetachChild(m_env_size); AttachChild(m_population_panel); - m_population_panel->Refresh(); + if (m_population_panel) + m_population_panel->Refresh(); AttachChild(m_resource_panel); - m_resource_panel->Refresh(); + if (m_resource_panel) + m_resource_panel->Refresh(); AttachChild(m_military_panel); - m_military_panel->Refresh(); + if (m_military_panel) + m_military_panel->Refresh(); } @@ -972,11 +1006,13 @@ AttachChild(m_button_colonize); std::string max_pop = DoubleToString(planet->GetMeter(METER_POPULATION)->Max(), 2, false); std::string colonize_text = boost::io::str(FlexibleFormat(UserString("PL_COLONIZE")) % max_pop); - m_button_colonize->SetText(colonize_text); + if (m_button_colonize) + m_button_colonize->SetText(colonize_text); } else if (!Disabled() && planet->IsAboutToBeColonized()) { AttachChild(m_button_colonize); - m_button_colonize->SetText(UserString("CANCEL")); + if (m_button_colonize) + m_button_colonize->SetText(UserString("CANCEL")); } else { DetachChild(m_button_colonize); @@ -984,8 +1020,10 @@ // update panels - m_buildings_panel->Refresh(); - m_specials_panel->Update(); + if (m_buildings_panel) + m_buildings_panel->Refresh(); + if (m_specials_panel) + m_specials_panel->Update(); // BuildingsPanel::Refresh (and other panels) emit ExpandCollapseSignal, which should be connected to SidePanel::PlanetPanel::DoLayout } @@ -1283,17 +1321,9 @@ // remove old panels Clear(); - const ObjectMap& objects = GetUniverse().Objects(); - // create new panels and connect their signals for (std::vector<int>::const_iterator it = planet_ids.begin(); it != planet_ids.end(); ++it) { - const Planet* planet = objects.Object<Planet>(*it); - if (!planet) { - Logger().errorStream() << "PlanetPanelContainer::SetPlanets couldn't get planet with id " << *it; - continue; - } - //std::cout << " ... adding panel for planet " << planet->Name() << std::endl; - PlanetPanel* planet_panel = new PlanetPanel(Width() - m_vscroll->Width(), *planet, star_type); + PlanetPanel* planet_panel = new PlanetPanel(Width() - m_vscroll->Width(), *it, star_type); AttachChild(planet_panel); m_planet_panels.push_back(planet_panel); GG::Connect(m_planet_panels.back()->LClickedSignal, &SidePanel::PlanetPanelContainer::PlanetPanelClicked, this); @@ -1308,9 +1338,8 @@ // redo contents and layout of panels, after enabling or disabling, so // they take this into account when doing contents - for (std::vector<PlanetPanel*>::const_iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { + for (std::vector<PlanetPanel*>::const_iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) (*it)->Refresh(); - } } std::vector<int> SidePanel::PlanetPanelContainer::PlanetIDs() const @@ -1402,8 +1431,6 @@ m_candidate_ids.clear(); std::set<PlanetPanel*> disabled_panels; - const ObjectMap& objects = GetUniverse().Objects(); - if (m_valid_selection_predicate) { // if there is a selection predicate, which determines which planet panels // can be selected, refresh the candidiates and disable the non-selectables @@ -1412,9 +1439,9 @@ for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { PlanetPanel* panel = *it; int planet_id = panel->PlanetID(); - const Planet* planet = objects.Object<Planet>(planet_id); + const Planet* planet = GetObject<Planet>(planet_id); - if (planet->Accept(*m_valid_selection_predicate)) { + if (planet && planet->Accept(*m_valid_selection_predicate)) { m_candidate_ids.insert(planet_id); //std::cout << " ... planet " << planet->ID() << " is a selection candidate" << std::endl; } else { @@ -1425,7 +1452,7 @@ // disable and enabled appropriate panels for (std::vector<PlanetPanel*>::iterator it = m_planet_panels.begin(); it != m_planet_panels.end(); ++it) { - PlanetPanel* panel = *it; + PlanetPanel* panel = *it; if (disabled_panels.find(panel) != disabled_panels.end()) { panel->Disable(true); //std::cout << " ... DISABLING PlanetPanel for planet " << panel->PlanetID() << std::endl; @@ -1588,23 +1615,27 @@ // connect state changed and insertion signals for planets and fleets in system - const System* system = GetUniverse().Objects().Object<const System>(s_system_id); + const System* system = GetObject<System>(s_system_id); if (!system) + system = GetEmpireKnownObject<System>(s_system_id, HumanClientApp::GetApp()->EmpireID()); + if (!system) { + Logger().errorStream() << "SidePanel::Refresh couldn't get system with id " << s_system_id; return; - std::vector<const Planet*> planets = system->FindObjects<Planet>(); - std::vector<const Fleet*> fleets = system->FindObjects<Fleet>(); + } - for (std::vector<const Fleet*>::const_iterator it = fleets.begin(); it != fleets.end(); ++it) - s_fleet_state_change_signals[(*it)->ID()] = GG::Connect((*it)->StateChangedSignal, - &SidePanel::FleetStateChanged); + std::vector<int> planet_ids = system->FindObjectIDs<Planet>(); + for (std::vector<int>::const_iterator it = planet_ids.begin(); it != planet_ids.end(); ++it) + if (Planet* planet = GetObject<Planet>(*it)) + s_system_connections.insert(GG::Connect(planet->ResourceCenterChangedSignal, SidePanel::ResourceCenterChangedSignal)); + std::vector<int> fleet_ids = system->FindObjectIDs<Fleet>(); + for (std::vector<int>::const_iterator it = fleet_ids.begin(); it != fleet_ids.end(); ++it) + if (Fleet* fleet = GetObject<Fleet>(*it)) + s_fleet_state_change_signals[*it] = GG::Connect(fleet->StateChangedSignal, &SidePanel::FleetStateChanged); + //s_system_connections.insert(GG::Connect(s_system->StateChangedSignal, &SidePanel::Update)); s_system_connections.insert(GG::Connect(system->FleetInsertedSignal, &SidePanel::FleetInserted)); s_system_connections.insert(GG::Connect(system->FleetRemovedSignal, &SidePanel::FleetRemoved)); - - for (std::vector<const Planet*>::const_iterator it = planets.begin(); it != planets.end(); ++it) - s_system_connections.insert(GG::Connect((*it)->ResourceCenterChangedSignal, - SidePanel::ResourceCenterChangedSignal)); } void SidePanel::RefreshImpl() @@ -1617,7 +1648,7 @@ delete m_star_graphic; m_star_graphic = 0; delete m_system_resource_summary; m_system_resource_summary = 0; - const ObjectMap& objects = GetUniverse().Objects(); + const ObjectMap& objects = GetUniverse().EmpireKnownObjects(HumanClientApp::GetApp()->EmpireID()); // get system object for this sidepanel. if there isn't one, abort. const System* system = objects.Object<const System>(s_system_id); @@ -1625,26 +1656,26 @@ return; - // populate droplist of system names std::vector<const System*> sys_vec = objects.FindObjects<const System>(); int system_names_in_droplist = 0; for (unsigned int i = 0; i < sys_vec.size(); i++) { const System* sys = sys_vec[i]; - GG::ListBox::Row* row = new SystemRow(sys->ID()); + int sys_id = sys->ID(); + GG::ListBox::Row* row = new SystemRow(sys_id); - if (sys->Name().empty() && sys != system) { + if (sys->Name().empty() && sys_id != s_system_id) { delete row; // delete rows for systems that aren't known to this client, except the selected system continue; } else { - row->push_back(new OwnerColoredSystemName(sys->ID(), SystemNameFontSize())); + row->push_back(new OwnerColoredSystemName(sys_id, SystemNameFontSize())); } GG::DropDownList::iterator latest_it = m_system_name->Insert(row); ++system_names_in_droplist; - if (sys_vec[i] == system) + if (sys_id == s_system_id) m_system_name->Select(latest_it); } @@ -1660,7 +1691,7 @@ boost::shared_ptr<GG::Texture> graphic = ClientUI::GetClientUI()->GetModuloTexture(ClientUI::ArtDir() / "stars_sidepanel", ClientUI::StarTypeFilePrefixes()[system->GetStarType()], - system->ID()); + s_system_id); std::vector<boost::shared_ptr<GG::Texture> > textures; textures.push_back(graphic); @@ -1686,17 +1717,27 @@ // update planet panel container contents (applying just-set selection predicate) //std::cout << " ... setting planet panel container planets" << std::endl; - std::vector<int> planet_ids = system->FindObjectIDs<Planet>(); - m_planet_panel_container->SetPlanets(planet_ids, system->GetStarType()); + // find all planets in this system. need to check all known planets, since + // the objects this system object reports to contain don't include objects + // that aren't visible this turn to this client's player + std::vector<int> known_system_planet_ids; + std::vector<const Planet*> all_planets = objects.FindObjects<Planet>(); + for (std::vector<const Planet*>::const_iterator it = all_planets.begin(); it != all_planets.end(); ++it) { + const Planet* planet = *it; + if (planet->SystemID() == s_system_id) + known_system_planet_ids.push_back(planet->ID()); + } + m_planet_panel_container->SetPlanets(known_system_planet_ids, system->GetStarType()); + // populate system resource summary // get planets owned by player's empire int empire_id = HumanClientApp::GetApp()->EmpireID(); std::vector<int> owned_planets; - for (std::vector<int>::const_iterator it = planet_ids.begin(); it != planet_ids.end(); ++it) { - const Planet* planet = objects.Object<Planet>(*it); + for (std::vector<int>::const_iterator it = known_system_planet_ids.begin(); it != known_system_planet_ids.end(); ++it) { + const Planet* planet = GetObject<Planet>(*it); if (planet && planet->WhollyOwnedBy(empire_id)) owned_planets.push_back(*it); } @@ -1729,8 +1770,6 @@ AttachChild(m_system_resource_summary); m_system_resource_summary->Update(); } - - } void SidePanel::DoLayout() @@ -1874,7 +1913,7 @@ s_system_id = system_id; - if (GetUniverse().Objects().Object<const System>(s_system_id)) + if (GetEmpireKnownObject<System>(s_system_id, HumanClientApp::GetApp()->EmpireID())) PlaySidePanelOpenSound(); // refresh sidepanels Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/server/ServerApp.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -583,6 +583,10 @@ // 2.b - if more than one empire is armed or all forces are unarmed, no one can colonize the planet for (ColonizeOrderMap::iterator it = colonize_order_map.begin(); it != colonize_order_map.end(); ++it) { Planet* planet = objects.Object<Planet>(it->first); + if (!planet) { + Logger().errorStream() << "ProcessTurns couldn't get planet with id " << it->first; + continue; + } // only one empire? if (it->second.size() == 1) { @@ -590,17 +594,29 @@ Empire* empire = empires.Lookup( it->second[0]->EmpireID() ); empire->AddSitRepEntry(CreatePlanetColonizedSitRep(planet->SystemID(), planet->ID())); } else { - const System* system = objects.Object<System>(planet->SystemID()); + int system_id = planet->SystemID(); + const System* system = objects.Object<System>(system_id); + if (!system) { + Logger().errorStream() << "ProcessTurns couldn't get system with ID " << system_id; + continue; + } - std::vector<const Fleet*> vec_fleet = system->FindObjects<Fleet>(); std::set<int> set_empire_with_military; - for (unsigned int i = 0; i < vec_fleet.size(); i++) - for (Fleet::const_iterator ship_it=vec_fleet[i]->begin(); ship_it != vec_fleet[i]->end(); ++ship_it) + std::vector<int> fleet_ids = system->FindObjectIDs<Fleet>(); + for (std::vector<int>::const_iterator it = fleet_ids.begin(); it != fleet_ids.end(); ++it) { + const Fleet* fleet = GetObject<Fleet>(*it); + if (!fleet) { + Logger().errorStream() << "ProcessTurns couldn't get fleet with id " << *it; + continue; + } + + for (Fleet::const_iterator ship_it = fleet->begin(); ship_it != fleet->end(); ++ship_it) if (const Ship* ship = objects.Object<Ship>(*ship_it)) if (ship->IsArmed()) { - set_empire_with_military.insert(*vec_fleet[i]->Owners().begin()); + set_empire_with_military.insert(*fleet->Owners().begin()); break; } + } // set the first empire as winner for now int winner = 0; @@ -716,13 +732,21 @@ System* system = *it; if (TEST_3D_COMBAT) { bool combat_conditions_exist = false; - std::vector<Fleet*> fleets = system->FindObjects<Fleet>(); std::set<int> ids_of_empires_with_combat_fleets_here; std::set<int> ids_of_empires_with_fleets_here; - for (std::vector<Fleet*>::iterator it = fleets.begin(); it != fleets.end(); ++it) { - assert((*it)->Owners().size() == 1); - int owner = *(*it)->Owners().begin(); - if ((*it)->HasArmedShips()) + + std::vector<int> fleet_ids = system->FindObjectIDs<Fleet>(); + for (std::vector<int>::const_iterator fleet_it = fleet_ids.begin(); fleet_it != fleet_ids.end(); ++fleet_it) { + Fleet* fleet = GetObject<Fleet>(*fleet_it); + if (!fleet) { + Logger().errorStream() << "ProcessTurns couldn't get Fleet with id " << *fleet_it; + continue; + } + + assert(fleet->Owners().size() == 1); + int owner = *fleet->Owners().begin(); + + if (fleet->HasArmedShips()) ids_of_empires_with_combat_fleets_here.insert(owner); ids_of_empires_with_fleets_here.insert(owner); if (2 <= ids_of_empires_with_combat_fleets_here.size() || @@ -754,14 +778,16 @@ } else { std::vector<CombatAssets> empire_combat_forces; - std::vector<Fleet*> flt_vec = system->FindObjects<Fleet>(); - if (flt_vec.empty()) + std::vector<int> flt_ids = system->FindObjectIDs<Fleet>(); + if (flt_ids.empty()) continue; - for (std::vector<Fleet*>::iterator flt_it = flt_vec.begin(); - flt_it != flt_vec.end(); - ++flt_it) { - Fleet* flt = *flt_it; + for (std::vector<int>::iterator flt_it = flt_ids.begin(); flt_it != flt_ids.end(); ++flt_it) { + Fleet* flt = GetObject<Fleet>(*flt_it); + if (!flt) { + Logger().errorStream() << "ProcessTurns couldn't get fleet with id " << *flt_it; + continue; + } // a fleet should belong only to one empire!? if (1 == flt->Owners().size()) { std::vector<CombatAssets>::iterator ecf_it = @@ -777,11 +803,13 @@ } } } - std::vector<Planet*> plt_vec = system->FindObjects<Planet>(); - for (std::vector<Planet*>::iterator plt_it = plt_vec.begin(); - plt_it != plt_vec.end(); - ++plt_it) { - Planet* plt = *plt_it; + std::vector<int> plt_ids = system->FindObjectIDs<Planet>(); + for (std::vector<int>::iterator plt_it = plt_ids.begin(); plt_it != plt_ids.end(); ++plt_it) { + Planet* plt = GetObject<Planet>(*plt_it); + if (!plt) { + Logger().errorStream() << "ProcessTurns couldn't get planet with id " << *plt_it; + continue; + } // a planet should belong only to one empire!? if (1 == plt->Owners().size()) { std::vector<CombatAssets>::iterator ecf_it = Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/universe/Planet.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -441,11 +441,12 @@ System* system = GetObject<System>(this->SystemID()); // check if Empire(id) is owner of at least one other planet in same system - std::vector<Planet*> planets = system->FindObjects<Planet>(); + std::vector<int> planets = system->FindObjectIDs<Planet>(); int empire_owned_planets_in_this_planet_system = 0; - for (std::vector<Planet*>::const_iterator plt_it = planets.begin(); plt_it != planets.end(); ++plt_it) - if ((*plt_it)->OwnedBy(id)) - ++empire_owned_planets_in_this_planet_system; + for (std::vector<int>::const_iterator plt_it = planets.begin(); plt_it != planets.end(); ++plt_it) + if (Planet* planet = GetObject<Planet>(*plt_it)) + if (planet->OwnedBy(id)) + ++empire_owned_planets_in_this_planet_system; // if this is the only planet owned by this planet's current owner, removing // that owner means the empire owns no planets in this system, so loses Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/universe/System.cpp 2009-11-23 09:14:54 UTC (rev 3280) @@ -171,21 +171,6 @@ return this->ID(); } -std::vector<UniverseObject*> System::FindObjects() const -{ - ObjectMap& objects = GetMainObjectMap(); - std::vector<UniverseObject*> retval; - for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - UniverseObject* obj = objects.Object(it->second); - if (!obj) { - Logger().errorStream() << "System::FindObjects couldn't get a UniverseObject for an object ID in the system"; - continue; - } - retval.push_back(obj); - } - return retval; -} - std::vector<int> System::FindObjectIDs() const { const ObjectMap& objects = GetMainObjectMap(); @@ -223,17 +208,6 @@ return retval; } -std::vector<const UniverseObject*> System::FindObjects(const UniverseObjectVisitor& visitor) const -{ - const ObjectMap& objects = GetMainObjectMap(); - std::vector<const UniverseObject*> retval; - for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (const UniverseObject* obj = objects.Object(it->second)->Accept(visitor)) - retval.push_back(obj); - } - return retval; -} - System::const_orbit_iterator System::begin() const { return m_objects.begin(); @@ -272,18 +246,6 @@ return m_starlanes_wormholes.end(); } -std::vector<const UniverseObject*> System::FindObjectsInOrbit(int orbit, const UniverseObjectVisitor& visitor) const -{ - const ObjectMap& objects = GetMainObjectMap(); - std::vector<const UniverseObject*> retval; - std::pair<ObjectMultimap::const_iterator, ObjectMultimap::const_iterator> range = m_objects.equal_range(orbit); - for (ObjectMultimap::const_iterator it = range.first; it != range.second; ++it) { - if (const UniverseObject* obj = objects.Object(it->second)->Accept(visitor)) - retval.push_back(obj); - } - return retval; -} - UniverseObject* System::Accept(const UniverseObjectVisitor& visitor) const { return visitor.Visit(const_cast<System* const>(this)); @@ -485,29 +447,6 @@ return retval; } -std::vector<UniverseObject*> System::FindObjects(const UniverseObjectVisitor& visitor) -{ - ObjectMap& objects = GetMainObjectMap(); - std::vector<UniverseObject*> retval; - for (ObjectMultimap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - if (UniverseObject* obj = objects.Object(it->second)->Accept(visitor)) - retval.push_back(obj); - } - return retval; -} - -std::vector<UniverseObject*> System::FindObjectsInOrbit(int orbit, const UniverseObjectVisitor& visitor) -{ - ObjectMap& objects = GetMainObjectMap(); - std::vector<UniverseObject*> retval; - std::pair<ObjectMultimap::iterator, ObjectMultimap::iterator> range = m_objects.equal_range(orbit); - for (ObjectMultimap::iterator it = range.first; it != range.second; ++it) { - if (UniverseObject* obj = objects.Object(it->second)->Accept(visitor)) - retval.push_back(obj); - } - return retval; -} - void System::AddOwner(int id) {} ///< adding owner to system objects is a no-op Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2009-11-23 00:30:27 UTC (rev 3279) +++ trunk/FreeOrion/universe/System.h 2009-11-23 09:14:54 UTC (rev 3280) @@ -69,8 +69,6 @@ virtual int SystemID() const; ///< returns this->ID() - virtual std::vector<UniverseObject*> - FindObjects() const; ///< returns objects contained within this system virtual std::vector<int> FindObjectIDs() const; ///< returns ids of objects contained within this system @@ -84,18 +82,6 @@ template <class T> std::vector<int> FindObjectIDsInOrbit(int orbit) const; ///< returns the IDs of all the objects of type T in orbit \a orbit - std::vector<const UniverseObject*> - FindObjects(const UniverseObjectVisitor& visitor) const; ///< returns all the objects that match \a visitor - - template <class T> - std::vector<const T*> FindObjects() const; ///< returns all the objects of type T - - std::vector<const UniverseObject*> - FindObjectsInOrbit(int orbit, const UniverseObjectVisitor& visitor) const; ///< returns all the objects that match \a visitor in orbit \a orbit - - template <class T> - std::vector<const T*> FindObjectsInOrbit(int orbit) const; ///< returns all the objects of type T in orbit \a orbit - virtual bool Contains(int object_id) const; ///< returns true if object with id \a object_id is in this system const_orbit_iterator begin() const; ///< begin iterator for all system objects @@ -160,18 +146,6 @@ bool RemoveStarlane(int id); ///< removes a starlane between this system and the system with ID number \a id. Returns false if there was no starlane from this system to system \a id. bool RemoveWormhole(int id); ///< removes a wormhole between this system and the system with ID number \a id. Returns false if there was no wormhole from this system to system \a id. - std::vector<UniverseObject*> - FindObjects(const UniverseObjectVisitor& visitor); ///< returns all the objects that match \a visitor - - template <class T> std::vector<T*> - FindObjects(); ///< returns all the objects of type T - - std::vector<UniverseObject*> - FindObjectsInOrbit(int orbit, const UniverseObjectVisitor& visitor); ///< returns all the objects that match \a visitor in orbit \a orbit - - template <class T> std::vector<T*> - FindObjectsInOrbit(int orbit); ///< returns all the objects of type T in orbit \a orbit - virtual void AddOwner(int id); ///< adding owner to system objects is a no-op virtual void RemoveOwner(int id); ///< removing owner from system objects is a no-op @@ -239,7 +213,7 @@ template <class T> std::vector<int> System::FindObjectIDs() const { - const ObjectMap& objects = GetUniverse().Objects(); + const ObjectMap& objects = GetMainObjectMap(); std::vector<int> retval; for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { if (const UniverseObject* obj = objects.Object(it->second)) @@ -252,7 +226,7 @@ template <class T> std::vector<int> System::FindObjectIDsInOrb... [truncated message content] |