From: <geo...@us...> - 2009-11-18 06:04:12
|
Revision: 3271 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3271&view=rev Author: geoffthemedio Date: 2009-11-18 06:03:59 +0000 (Wed, 18 Nov 2009) Log Message: ----------- -Removed various functions from UniverseObject and derived classes that returned pointers to UniverseObject and derived classes. Now, just object ids are returned. This ensures that the call can and will decide whether to look in the latest known or true / visible objects maps, which an UniverseObject wouldn't know if one of its getter functions had been called -Updated various bits of code accordingly for previous -Added some preprocessor undef commands to Universe.h to get rid of issues with the GetObject defined in windows header files -Removed the GetConstObject free functions that were defined or declared in Universe.h since there was no practical difference between these and the similarly-named functions that returned non-const pointers to UniverseObjects -Renamed ResourceCenter, PopCenter and Planet's member function GetObject to GetThisObject to avoid confusion with the aforementioned free function Modified Paths: -------------- trunk/FreeOrion/Empire/Empire.cpp trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/FleetButton.cpp trunk/FreeOrion/UI/FleetWnd.cpp trunk/FreeOrion/UI/InfoPanels.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/UI/SidePanel.cpp trunk/FreeOrion/UI/SystemIcon.cpp trunk/FreeOrion/combat/CombatSystem.cpp trunk/FreeOrion/combat/OpenSteer/CombatShip.cpp trunk/FreeOrion/python/PythonUniverseWrapper.cpp trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/PopCenter.cpp trunk/FreeOrion/universe/PopCenter.h trunk/FreeOrion/universe/ResourceCenter.cpp trunk/FreeOrion/universe/ResourceCenter.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/System.cpp trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h trunk/FreeOrion/universe/ValueRef.cpp trunk/FreeOrion/util/Order.cpp Modified: trunk/FreeOrion/Empire/Empire.cpp =================================================================== --- trunk/FreeOrion/Empire/Empire.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/Empire/Empire.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -2328,7 +2328,7 @@ UniverseObject* build_location = objects.Object(m_production_queue[i].location); System* system = universe_object_cast<System*>(build_location); if (!system && build_location) - system = build_location->GetSystem(); + system = objects.Object<System>(build_location->SystemID()); // TODO: account for shipyards and/or other ship production sites that are in interstellar space, if needed assert(system); Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/ClientUI.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -456,7 +456,7 @@ { // this just zooms to the appropriate system, until we create a planet window of some kind if (Planet* planet = GetUniverse().Objects().Object<Planet>(id)) { - ZoomToSystem(planet->GetSystem()); + ZoomToSystem(planet->SystemID()); return true; } return false; @@ -484,7 +484,7 @@ { // this just zooms to the appropriate fleet window, until we create a ship window of some kind if (Ship* ship = GetUniverse().Objects().Object<Ship>(id)) { - ZoomToFleet(ship->GetFleet()); + ZoomToFleet(ship->FleetID()); return true; } return false; Modified: trunk/FreeOrion/UI/FleetButton.cpp =================================================================== --- trunk/FreeOrion/UI/FleetButton.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/FleetButton.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -152,11 +152,9 @@ void FleetButton::Init(const std::vector<int>& fleet_IDs, SizeType size_type) { // get fleets - ObjectMap& objects = GetUniverse().Objects(); std::vector<const Fleet*> fleets; - for (std::vector<int>::const_iterator it = fleet_IDs.begin(); it != fleet_IDs.end(); ++it) { - const Fleet* fleet = objects.Object<Fleet>(*it); + const Fleet* fleet = GetObject<Fleet>(*it); if (!fleet) { Logger().errorStream() << "FleetButton::FleetButton couldn't get fleet with id " << *it; continue; @@ -238,9 +236,9 @@ // a starlane, which is the case if the fleet is not in a system and has a valid next system GG::Pt direction_vector(GG::X(0), GG::Y(1)); // default, unrotated button orientation - if (first_fleet && !first_fleet->GetSystem()) { + if (first_fleet && first_fleet->SystemID() == UniverseObject::INVALID_OBJECT_ID) { int next_sys_id = first_fleet->NextSystemID(); - if (const UniverseObject* obj = objects.Object(next_sys_id)) { + if (const UniverseObject* obj = GetObject(next_sys_id)) { // fleet is not in a system and has a valid next destination, so can orient it in that direction // fleet icons might not appear on the screen in the exact place corresponding to their // actual universe position, but if they're moving along a starlane, this code will assume Modified: trunk/FreeOrion/UI/FleetWnd.cpp =================================================================== --- trunk/FreeOrion/UI/FleetWnd.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/FleetWnd.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -79,12 +79,12 @@ std::string FleetDestinationText(int fleet_id) { std::string retval = ""; - const Fleet* fleet = GetUniverse().Objects().Object<Fleet>(fleet_id); + const Fleet* fleet = GetObject<Fleet>(fleet_id); if (!fleet) return retval; - const System* dest = fleet->FinalDestination(); - const System* cur_sys = fleet->GetSystem(); + const System* dest = GetObject<System>(fleet->FinalDestinationID()); + const System* cur_sys = GetObject<System>(fleet->SystemID()); if (dest && dest != cur_sys) { std::pair<int, int> eta = fleet->ETA(); // .first is turns to final destination. .second is turns to next system on route @@ -161,7 +161,7 @@ return; } int system_id = first_ship->SystemID(); - const System* system = first_ship->GetSystem(); // may be null + const System* system = GetObject<System>(first_ship->SystemID()); // may be null double X = first_ship->X(), Y = first_ship->Y(); @@ -455,7 +455,7 @@ if (!ship || !new_fleet) return false; // can't transfer no ship or to no fleet - const Fleet* current_fleet = ship->GetFleet(); + const Fleet* current_fleet = GetObject<Fleet>(ship->FleetID()); if (current_fleet && current_fleet->ID() == new_fleet->ID()) return false; // can't transfer a fleet to a fleet it already is in @@ -587,7 +587,7 @@ // bookkeeping m_ship_connection = GG::Connect(ship->StateChangedSignal, &ShipDataPanel::Refresh, this); - if (Fleet* fleet = ship->GetFleet()) + if (Fleet* fleet = GetObject<Fleet>(ship->FleetID())) m_fleet_connection = GG::Connect(fleet->StateChangedSignal, &ShipDataPanel::Refresh, this); Refresh(); @@ -1569,7 +1569,7 @@ const Ship* ship = ship_row->GetShip(); - const Fleet* fleet = this->GetFleet(); + const Fleet* fleet = GetObject<Fleet>(ship->FleetID()); if (ship && ValidShipTransfer(ship, fleet)) continue; // leave false: ship transfer not valid Modified: trunk/FreeOrion/UI/InfoPanels.cpp =================================================================== --- trunk/FreeOrion/UI/InfoPanels.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/InfoPanels.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -2717,10 +2717,8 @@ break; case ECT_BUILDING: - building = universe_object_cast<const Building*>(source); - if (building) { - planet = building->GetPlanet(); - if (planet) { + if (building = universe_object_cast<const Building*>(source)) { + if (planet = GetObject<Planet>(building->PlanetID())) { name = planet->Name(); } } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -186,8 +186,8 @@ // get endpoints of lane in universe. may be different because on- // screen lanes are drawn between system circles, not system centres int empire_id = HumanClientApp::GetApp()->EmpireID(); - const UniverseObject* prev = GetEmpireKnownConstObject(lane.first, empire_id); - const UniverseObject* next = GetEmpireKnownConstObject(lane.second, empire_id); + const UniverseObject* prev = GetEmpireKnownObject(lane.first, empire_id); + const UniverseObject* next = GetEmpireKnownObject(lane.second, empire_id); if (!next || !prev) { Logger().errorStream() << "ScreenPosOnStarane couldn't find next system " << lane.first << " or prev system " << lane.second; return std::make_pair(UniverseObject::INVALID_POSITION, UniverseObject::INVALID_POSITION); @@ -894,7 +894,7 @@ const UniverseObject* obj = it->second; std::cout << obj->ID() << ": " << GetTypeName(obj) << " " << obj->Name(); - if (const System* system = obj->GetSystem()) + if (const System* system = objects.Object<System>(obj->SystemID())) std::cout << " at: " << system->Name(); const std::set<int>& owners = obj->Owners(); @@ -917,7 +917,7 @@ const UniverseObject* obj = it->second; std::cout << obj->ID() << ": " << GetTypeName(obj) << " " << obj->Name(); - if (const System* system = obj->GetSystem()) + if (const System* system = known_objects.Object<System>(obj->SystemID())) std::cout << " at: " << system->Name(); const std::set<int>& owners = obj->Owners(); @@ -1196,7 +1196,7 @@ for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { const SystemIcon* icon = it->second; int system_id = it->first; - const System* system = GetEmpireKnownConstObject<System>(system_id, empire_id); + const System* system = GetEmpireKnownObject<System>(system_id, empire_id); if (!system) { Logger().errorStream() << "MapWnd::InitSystemRenderingBuffers couldn't get system with id " << system_id; continue; @@ -1411,7 +1411,7 @@ for (std::map<int, SystemIcon*>::const_iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { int system_id = it->first; - const System* system = GetEmpireKnownConstObject<System>(system_id, empire_id); + const System* system = GetEmpireKnownObject<System>(system_id, empire_id); if (!system) { Logger().errorStream() << "MapWnd::InitStarlaneRenderingBuffers couldn't get system with id " << system_id; continue; @@ -1423,7 +1423,7 @@ if (lane_is_wormhole) continue; // at present, not rendering wormholes const System* start_system = system; - const System* dest_system = GetEmpireKnownConstObject<System>(lane_it->first, empire_id); + const System* dest_system = GetEmpireKnownObject<System>(lane_it->first, empire_id); if (!start_system || ! dest_system) continue; //std::cout << "colouring lanes between " << start_system->Name() << " and " << dest_system->Name() << std::endl; @@ -1884,7 +1884,7 @@ if (!fleet_wnd) { //std::cout << "SelectFleet couldn't find fleetwnd for fleet " << std::endl; const std::set<int>& owners = fleet->Owners(); - System* system = fleet->GetSystem(); + System* system = GetObject<System>(fleet->SystemID()); int this_client_player_id = HumanClientApp::GetApp()->EmpireID(); @@ -2068,7 +2068,7 @@ int empire_id = HumanClientApp::GetApp()->EmpireID(); const int SYSTEM_ICON_SIZE = SystemIconSize(); for (std::map<int, SystemIcon*>::iterator it = m_system_icons.begin(); it != m_system_icons.end(); ++it) { - const System* system = GetEmpireKnownConstObject<System>(it->first, empire_id); + const System* system = GetEmpireKnownObject<System>(it->first, empire_id); if (!system) { Logger().errorStream() << "MapWnd::DoSystemIconsLayout couldn't get system with id " << it->first; continue; @@ -2211,7 +2211,7 @@ Logger().errorStream() << "couldn't cast object to fleet in RefreshFleetButtons()"; continue; } - const System* system = fleet->GetSystem(); + const System* system = objects.Object<System>(fleet->SystemID()); if (!system) { Logger().errorStream() << "couldn't get system of an departing fleet in RefreshFleetButtons()"; continue; @@ -2240,7 +2240,7 @@ Logger().errorStream() << "couldn't cast object to fleet in RefreshFleetButtons()"; continue; } - const System* system = fleet->GetSystem(); + const System* system = objects.Object<System>(fleet->SystemID()); if (!system) { Logger().errorStream() << "couldn't get system of an departing fleet in RefreshFleetButtons()"; continue; @@ -2269,7 +2269,7 @@ Logger().errorStream() << "couldn't cast object to fleet in RefreshFleetButtons()"; continue; } - if (fleet->GetSystem()) { + if (fleet->SystemID() != UniverseObject::INVALID_OBJECT_ID) { Logger().errorStream() << "a fleet that was supposed to be moving had a valid system in RefreshFleetButtons()"; continue; } @@ -2740,7 +2740,7 @@ // render circles around systems that have at least one starlane, if circles are enabled. if (circles) { - if (const System* system = GetEmpireKnownConstObject<System>(it->first, empire_id)) { + if (const System* system = GetEmpireKnownObject<System>(it->first, empire_id)) { if (system->NumStarlanes() > 0) { CircleArc(circle_ul, circle_lr, 0.0, TWO_PI, false); } @@ -3156,7 +3156,7 @@ for (std::set<int>::iterator it = fleet_ids.begin(); it != fleet_ids.end(); ++it) { int fleet_id = *it; - const Fleet* fleet = GetConstObject<Fleet>(fleet_id); + const Fleet* fleet = GetObject<Fleet>(fleet_id); if (!fleet) { Logger().errorStream() << "MapWnd::PlotFleetMovementLine couldn't get fleet with id " << *it; continue; @@ -3184,9 +3184,9 @@ // disallow "offroad" (direct non-starlane non-wormhole) travel if (route.size() == 2 && *route.begin() != *route.rbegin()) { int begin_id = *route.begin(); - const System* begin_sys = GetEmpireKnownConstObject<System>(begin_id, empire_id); + const System* begin_sys = GetEmpireKnownObject<System>(begin_id, empire_id); int end_id = *route.rbegin(); - const System* end_sys = GetEmpireKnownConstObject<System>(end_id, empire_id); + const System* end_sys = GetEmpireKnownObject<System>(end_id, empire_id); if (!begin_sys->HasStarlaneTo(end_id) && !begin_sys->HasWormholeTo(end_id) && !end_sys->HasStarlaneTo(begin_id) && !end_sys->HasWormholeTo(begin_id)) @@ -3587,7 +3587,7 @@ // home system (ie. where the capitol is) if (SidePanel::SystemID() == UniverseObject::INVALID_OBJECT_ID) { if (const Empire* empire = HumanClientApp::GetApp()->Empires().Lookup(HumanClientApp::GetApp()->EmpireID())) - if (const UniverseObject* obj = GetConstObject(empire->CapitolID())) + if (const UniverseObject* obj = GetObject(empire->CapitolID())) SelectSystem(obj->SystemID()); } else { // if a system is already shown, make sure a planet gets selected by @@ -3950,9 +3950,8 @@ // add contained objects within current object to list of objects to process, if requested. assumes no objects contain themselves (which could cause infinite loops) if (update_contained_objects) { - const std::vector<UniverseObject*> contained_objects = cur_object->FindObjects(); // get all contained objects - for (std::vector<UniverseObject*>::const_iterator cont_it = contained_objects.begin(); cont_it != contained_objects.end(); ++cont_it) - objects_list.push_back((*cont_it)->ID()); + std::vector<int> contained_objects = cur_object->FindObjectIDs(); // get all contained objects + std::copy(contained_objects.begin(), contained_objects.end(), std::back_inserter(objects_list)); } } std::vector<int> objects_vec; Modified: trunk/FreeOrion/UI/SidePanel.cpp =================================================================== --- trunk/FreeOrion/UI/SidePanel.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/SidePanel.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -828,7 +828,7 @@ // connecting system's StateChangedSignal to this->Refresh() should be redundant, as // the sidepanel's Refresh will be called when that signal is emitted, which will refresh // all the PlanetPanel in the SidePanel - //if (System* system = plt->GetSystem()) + //if (System* system = plt->SystemID()) // GG::Connect(system->StateChangedSignal, &SidePanel::PlanetPanel::Refresh, this); GG::Connect(planet.StateChangedSignal, &SidePanel::PlanetPanel::Refresh, this); } @@ -1202,7 +1202,12 @@ return; } - if (!ship->GetFleet()->Accept(StationaryFleetVisitor(*ship->GetFleet()->Owners().begin()))) { + const Fleet* fleet = GetObject<Fleet>(ship->FleetID()); + if (!fleet) { + Logger().errorStream() << "SidePanel::PlanetPanel::ClickColonize fleet not found!"; + return; + } + if (!fleet->Accept(StationaryFleetVisitor(*fleet->Owners().begin()))) { GG::ThreeButtonDlg dlg(GG::X(320), GG::Y(200), UserString("SP_USE_DEPARTING_COLONY_SHIPS_QUESTION"), ClientUI::GetFont(), ClientUI::WndColor(), ClientUI::CtrlBorderColor(), ClientUI::WndColor(), ClientUI::TextColor(), 2, Modified: trunk/FreeOrion/UI/SystemIcon.cpp =================================================================== --- trunk/FreeOrion/UI/SystemIcon.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/UI/SystemIcon.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -170,7 +170,7 @@ m_showing_name(false) { ClientUI* ui = ClientUI::GetClientUI(); - if (const System* system = GetEmpireKnownConstObject<System>(m_system_id, HumanClientApp::GetApp()->EmpireID())) { + if (const System* system = GetEmpireKnownObject<System>(m_system_id, HumanClientApp::GetApp()->EmpireID())) { StarType star_type = system->GetStarType(); m_disc_texture = ui->GetModuloTexture(ClientUI::ArtDir() / "stars", ClientUI::StarTypeFilePrefixes()[star_type], @@ -195,7 +195,7 @@ void SystemIcon::Init() { // state change signals for system itself and fleets in it - const System* system = GetEmpireKnownConstObject<System>(m_system_id, HumanClientApp::GetApp()->EmpireID()); + const System* system = GetEmpireKnownObject<System>(m_system_id, HumanClientApp::GetApp()->EmpireID()); if (system) Connect(system->StateChangedSignal, &SystemIcon::Refresh, this); @@ -477,7 +477,7 @@ { std::string name = ""; - if (const System* system = GetEmpireKnownConstObject<System>(m_system_id, HumanClientApp::GetApp()->EmpireID())) + if (const System* system = GetEmpireKnownObject<System>(m_system_id, HumanClientApp::GetApp()->EmpireID())) name = system->Name(); SetName(name); // sets GG::Control name. doesn't affect displayed system name Modified: trunk/FreeOrion/combat/CombatSystem.cpp =================================================================== --- trunk/FreeOrion/combat/CombatSystem.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/combat/CombatSystem.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -60,17 +60,17 @@ static void RemoveShip(int nID) { - Ship* shp = GetUniverse().Objects().Object<Ship>(nID); + Ship* shp = GetObject<Ship>(nID); if (shp) { - System* sys = shp->GetSystem(); + System* sys = GetObject<System>(shp->SystemID()); if (sys) sys->Remove(shp->ID()); - Fleet* flt = shp->GetFleet(); + Fleet* flt = GetObject<Fleet>(shp->FleetID()); if (flt) { flt->RemoveShip(shp->ID()); if (flt->Empty()) { - if ((sys = flt->GetSystem())) + if (sys = GetObject<System>(flt->SystemID())) sys->Remove(flt->ID()); GetUniverse().Destroy(flt->ID()); } Modified: trunk/FreeOrion/combat/OpenSteer/CombatShip.cpp =================================================================== --- trunk/FreeOrion/combat/OpenSteer/CombatShip.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/combat/OpenSteer/CombatShip.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -594,7 +594,7 @@ break; } case ShipMission::ENTER_STARLANE: { - System* system = GetShip().GetSystem(); + System* system = GetObject<System>(GetShip().SystemID()); assert(system); for (System::const_lane_iterator it = system->begin_lanes(); it != system->end_lanes(); Modified: trunk/FreeOrion/python/PythonUniverseWrapper.cpp =================================================================== --- trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/python/PythonUniverseWrapper.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -229,7 +229,6 @@ .add_property("design", make_function(&Ship::Design, return_value_policy<reference_existing_object>())) .add_property("designID", &Ship::DesignID) .add_property("fleetID", &Ship::FleetID) - .add_property("getFleet", make_function(&Ship::GetFleet, return_value_policy<reference_existing_object>())) .add_property("isArmed", &Ship::IsArmed) .add_property("canColonize", &Ship::CanColonize) .add_property("speed", &Ship::Speed) @@ -282,8 +281,8 @@ ////////////////// class_<Building, bases<UniverseObject>, noncopyable>("building", no_init) .def("getBuildingType", &Building::GetBuildingType, return_value_policy<reference_existing_object>()) -// .add_property("operating", &Building::Operating) - .def("getPlanet", &Building::GetPlanet, return_value_policy<reference_existing_object>()) + //.add_property("operating", &Building::Operating) + .def("planetID", &Building::PlanetID) ; ////////////////// Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Building.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -122,11 +122,6 @@ return m_planet_id; } -Planet* Building::GetPlanet() const -{ - return m_planet_id == INVALID_OBJECT_ID ? 0 : GetMainObjectMap().Object<Planet>(m_planet_id); -} - UniverseObject* Building::Accept(const UniverseObjectVisitor& visitor) const { return visitor.Visit(const_cast<Building* const>(this)); @@ -134,8 +129,8 @@ void Building::SetPlanetID(int planet_id) { - if (Planet* planet = GetPlanet()) - planet->RemoveBuilding(ID()); + if (Planet* planet = GetObject<Planet>(m_planet_id)) + planet->RemoveBuilding(this->ID()); m_planet_id = planet_id; } @@ -144,7 +139,7 @@ UniverseObject::MoveTo(x, y); // if building is being moved away from its planet, remove from the planet. otherwise, keep building on planet - if (Planet* planet = GetPlanet()) + if (Planet* planet = GetObject<Planet>(m_planet_id)) planet->RemoveBuilding(this->ID()); } Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Building.h 2009-11-18 06:03:59 UTC (rev 3271) @@ -31,7 +31,6 @@ const std::string& BuildingTypeName() const; ///< returns the name of the BuildingType object for this building int PlanetID() const; ///< returns the ID number of the planet this building is on - Planet* GetPlanet() const; ///< returns a pointer to the planet this building is on virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Condition.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -21,10 +21,11 @@ namespace { const Fleet* FleetFromObject(const UniverseObject* obj) { + const ObjectMap& objects = GetMainObjectMap(); const Fleet* retval = universe_object_cast<const Fleet*>(obj); if (!retval) { if (const Ship* ship = universe_object_cast<const Ship*>(obj)) - retval = ship->GetFleet(); + retval = objects.Object<Fleet>(ship->FleetID()); } return retval; } @@ -812,10 +813,11 @@ bool Condition::PlanetType::Match(const UniverseObject* source, const UniverseObject* target) const { + const ObjectMap& objects = GetMainObjectMap(); const Planet* planet = universe_object_cast<const Planet*>(target); const ::Building* building = 0; if (!planet && (building = universe_object_cast<const ::Building*>(target))) { - planet = building->GetPlanet(); + planet = objects.Object<Planet>(building->PlanetID()); } if (planet) { for (unsigned int i = 0; i < m_types.size(); ++i) { @@ -876,10 +878,11 @@ bool Condition::PlanetSize::Match(const UniverseObject* source, const UniverseObject* target) const { + const ObjectMap& objects = GetMainObjectMap(); const Planet* planet = universe_object_cast<const Planet*>(target); const ::Building* building = 0; if (!planet && (building = universe_object_cast<const ::Building*>(target))) { - planet = building->GetPlanet(); + planet = objects.Object<Planet>(building->PlanetID()); } if (planet) { for (unsigned int i = 0; i < m_sizes.size(); ++i) { @@ -940,10 +943,11 @@ bool Condition::PlanetEnvironment::Match(const UniverseObject* source, const UniverseObject* target) const { + const ObjectMap& objects = GetMainObjectMap(); const Planet* planet = universe_object_cast<const Planet*>(target); const ::Building* building = 0; if (!planet && (building = universe_object_cast<const ::Building*>(target))) { - planet = building->GetPlanet(); + planet = objects.Object<Planet>(building->PlanetID()); } if (planet) { for (unsigned int i = 0; i < m_environments.size(); ++i) { @@ -1006,10 +1010,16 @@ bool Condition::FocusType::Match(const UniverseObject* source, const UniverseObject* target) const { + const ObjectMap& objects = GetMainObjectMap(); const ResourceCenter* prod_center = dynamic_cast<const ResourceCenter*>(target); const ::Building* building = 0; if (!prod_center && (building = universe_object_cast<const ::Building*>(target))) { - prod_center = static_cast<const ResourceCenter*>(building->GetPlanet()); + const Planet* planet = objects.Object<Planet>(building->PlanetID()); + if (!planet) { + Logger().errorStream() << "Condition::FocusType::Match couldn't find a planet with id " << building->PlanetID(); + return false; + } + prod_center = static_cast<const ResourceCenter*>(planet); } if (prod_center) { for (unsigned int i = 0; i < m_foci.size(); ++i) { @@ -1070,7 +1080,8 @@ bool Condition::StarType::Match(const UniverseObject* source, const UniverseObject* target) const { - const System* system = target->GetSystem(); + const ObjectMap& objects = GetMainObjectMap(); + const System* system = objects.Object<System>(target->SystemID()); if (system || (system = universe_object_cast<const System*>(target))) { for (unsigned int i = 0; i < m_types.size(); ++i) { if (m_types[i]->Eval(source, target) == system->GetStarType()) @@ -1587,16 +1598,17 @@ bool Condition::WithinStarlaneJumps::Match(const UniverseObject* source, const UniverseObject* target) const { + const ObjectMap& objects = GetMainObjectMap(); int jump_limit = m_jumps->Eval(source, target); if (jump_limit == 0) { // special case, since ShortestPath() doesn't expect the start point to be the end point double delta_x = source->X() - target->X(); double delta_y = source->Y() - target->Y(); return !(delta_x * delta_x + delta_y * delta_y); } else { - const System* source_system = source->GetSystem(); + const System* source_system = objects.Object<System>(source->SystemID()); if (!source_system) source_system = universe_object_cast<const System*>(source); - const System* target_system = target->GetSystem(); + const System* target_system = objects.Object<System>(target->SystemID()); if (!target_system) target_system = universe_object_cast<const System*>(target); if (source_system && target_system) { @@ -1728,13 +1740,14 @@ bool Condition::Stationary::Match(const UniverseObject* source, const UniverseObject* target) const { + const ObjectMap& objects = GetMainObjectMap(); // the only objects that can move are fleets and the ships in them. so, // attempt to cast the target object to a fleet or ship, and if it's a ship // get the fleet of that ship const Fleet* fleet = universe_object_cast<const Fleet*>(target); if (!fleet) if (const Ship* ship = universe_object_cast<const Ship*>(target)) - fleet = ship->GetFleet(); + fleet = objects.Object<Fleet>(ship->FleetID()); if (fleet) { // if a fleet is available, it is "moving", or not stationary, if it's Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Effect.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -678,7 +678,7 @@ void CreatePlanet::Execute(const UniverseObject* source, UniverseObject* target) const { - System* location = target->GetSystem(); + System* location = GetObject<System>(target->SystemID()); if (!location) { Logger().errorStream() << "CreatePlanet::Execute couldn't get a System object at which to create the planet"; return; @@ -817,7 +817,7 @@ //Fleet* fleet = universe_object_cast<Fleet*>(target); //if (!fleet) // if (const Ship* ship = universe_object_cast<const Ship*>(target)) - // fleet = ship->GetFleet(); + // fleet = ship->FleetID(); //// etc. Ship* ship = new Ship(empire_id, design_id); @@ -987,7 +987,7 @@ if (Fleet* fleet = universe_object_cast<Fleet*>(target)) { // fleets can be inserted into the system that contains the destination object (or the // destination object istelf if it is a system - if (System* dest_system = destination->GetSystem()) { + if (System* dest_system = GetObject<System>(destination->SystemID())) { if (fleet->SystemID() != dest_system->ID()) { dest_system->Insert(target); ExploreSystem(dest_system->ID(), target); @@ -1009,7 +1009,7 @@ dest_fleet = universe_object_cast<const Fleet*>(destination); if (!dest_fleet) if (const Ship* dest_ship = universe_object_cast<const Ship*>(destination)) - dest_fleet = universe_object_cast<const Fleet*>(dest_ship->GetFleet()); + dest_fleet = GetObject<Fleet>(dest_ship->FleetID()); if (dest_fleet) { UpdateFleetRoute(fleet, dest_fleet->NextSystemID(), dest_fleet->PreviousSystemID()); @@ -1023,7 +1023,7 @@ } else if (Ship* ship = universe_object_cast<Ship*>(target)) { // TODO: make sure colonization doesn't interfere with this effect, and vice versa - Fleet* old_fleet = ship->GetFleet(); + Fleet* old_fleet = GetObject<Fleet>(ship->FleetID()); Fleet* dest_fleet = universe_object_cast<Fleet*>(destination); // may be 0 if destination is not a fleet bool same_owners = SameOwners(ship, destination); int dest_sys_id = destination->SystemID(); @@ -1044,7 +1044,7 @@ } else { // need to create a new fleet for ship Fleet* new_fleet = 0; - if (System* dest_system = destination->GetSystem()) { + if (System* dest_system = GetObject<System>(destination->SystemID())) { new_fleet = CreateNewFleet(dest_system, ship); // creates new fleet, inserts fleet into system and ship into fleet ExploreSystem(dest_system->ID(), target); @@ -1058,7 +1058,7 @@ } else if (Planet* planet = universe_object_cast<Planet*>(target)) { // planets need to be located in systems, so get system that contains destination object - if (System* dest_system = destination->GetSystem()) { + if (System* dest_system = GetObject<System>(destination->SystemID())) { // check if planet is already in this system. if so, don't need to do anything if (planet->SystemID() == UniverseObject::INVALID_OBJECT_ID || planet->SystemID() != dest_system->ID()) { // determine if and which orbits are available @@ -1077,14 +1077,14 @@ // or attempt to get the planet on which the destination object is located and insert target building into that if (Planet* dest_planet = universe_object_cast<Planet*>(destination)) { dest_planet->AddBuilding(building->ID()); - if (const System* dest_system = dest_planet->GetSystem()) + if (const System* dest_system = GetObject<System>(dest_planet->SystemID())) ExploreSystem(dest_system->ID(), target); } else if (Building* dest_building = universe_object_cast<Building*>(destination)) { - if (Planet* dest_planet = dest_building->GetPlanet()) { + if (Planet* dest_planet = GetObject<Planet>(dest_building->PlanetID())) { dest_planet->AddBuilding(building->ID()); - if (const System* dest_system = dest_planet->GetSystem()) + if (const System* dest_system = GetObject<System>(dest_planet->SystemID())) ExploreSystem(dest_system->ID(), target); } } Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -202,7 +202,7 @@ // determine if, given fuel available and supplyable systems, fleet will ever be able to move - if (fuel < 1.0 && this->GetSystem() && fleet_supplied_systems.find(this->SystemID()) == fleet_supplied_systems.end()) { + if (fuel < 1.0 && this->SystemID() && fleet_supplied_systems.find(this->SystemID()) == fleet_supplied_systems.end()) { MovePathNode node(this->X(), this->Y(), true, ETA_OUT_OF_RANGE, this->SystemID(), UniverseObject::INVALID_OBJECT_ID, @@ -226,9 +226,9 @@ // get current, previous and next systems of fleet - const System* cur_system = this->GetSystem(); // may be 0 + const System* cur_system = objects.Object<System>(this->SystemID()); // may be 0 const System* prev_system = objects.Object<System>(this->PreviousSystemID()); // may be 0 if this fleet is not moving or ordered to move - const System* next_system = objects.Object<System>(*route_it); // can't use this->NextSystemID() because this fleet may not be moving and may not have a next system. this might occur when a fleet is in a system, not ordered to move or ordered to move to a system, but a projected fleet move line is being calculated to a different system + const System* next_system = objects.Object<System>(*route_it); // can't use this->NextSystemID() because this fleet may not be moving and may not have a next system. this might occur when a fleet is in a system, not ordered to move or ordered to move to a system, but a projected fleet move line is being calculated to a different system if (!next_system) { Logger().errorStream() << "Fleet::MovePath couldn't get next system with id " << *route_it << " for this fleet " << this->Name(); return retval; @@ -362,7 +362,7 @@ break; // update next system on route and distance to it from current position - next_system = GetEmpireKnownConstObject<System>(*route_it, owner); + next_system = GetEmpireKnownObject<System>(*route_it, owner); if (!next_system) { Logger().errorStream() << "Fleet::MovePath couldn't get system with id " << *route_it; break; @@ -492,9 +492,6 @@ int Fleet::FinalDestinationID() const { return m_moving_to; } -System* Fleet::FinalDestination() const -{ return GetMainObjectMap().Object<System>(m_moving_to); } - int Fleet::PreviousSystemID() const { return m_prev_system; } @@ -654,8 +651,6 @@ void Fleet::AddShips(const std::vector<int>& ships) { - ObjectMap& objects = GetMainObjectMap(); - for (unsigned int i = 0; i < ships.size(); ++i) { int ship_id = ships[i]; @@ -664,8 +659,8 @@ continue; } - if (Ship* s = objects.Object<Ship>(ship_id)) { - if (System* system = GetSystem()) { + if (Ship* s = GetObject<Ship>(ship_id)) { + if (System* system = GetObject<System>(this->SystemID())) { system->Insert(s); } else { s->MoveTo(X(), Y()); @@ -683,16 +678,14 @@ void Fleet::AddShip(int ship_id) { - ObjectMap& objects = GetMainObjectMap(); - if (this->Contains(ship_id)) { Logger().debugStream() << "Fleet::AddShip this fleet '" << this->Name() << "' already contained ship '" << ship_id << "'"; return; } Logger().debugStream() << "Fleet '" << this->Name() << "' adding ship: " << ship_id; - if (Ship* s = objects.Object<Ship>(ship_id)) { - if (System* system = GetSystem()) { + if (Ship* s = GetObject<Ship>(ship_id)) { + if (System* system = GetObject<System>(this->SystemID())) { system->Insert(s); } else { s->MoveTo(X(), Y()); @@ -785,18 +778,17 @@ void Fleet::MovementPhase() { //Logger().debugStream() << "Fleet::MovementPhase this: " << this->Name() << " id: " << this->ID(); - ObjectMap& objects = GetMainObjectMap(); // find if any of owners of fleet can resupply ships at the location of this fleet if (FleetOrResourceSupplyableAtSystemByAnyOfEmpiresWithIDs(this->SystemID(), this->Owners())) { // resupply all ships for (Fleet::const_iterator ship_it = this->begin(); ship_it != this->end(); ++ship_it) - if (Ship* ship = objects.Object<Ship>(*ship_it)) + if (Ship* ship = GetObject<Ship>(*ship_it)) ship->Resupply(); } - System* current_system = GetSystem(); + System* current_system = GetObject<System>(SystemID()); std::list<MovePathNode> move_path = this->MovePath(); std::list<MovePathNode>::const_iterator it = move_path.begin(); std::list<MovePathNode>::const_iterator next_it = it; @@ -818,7 +810,7 @@ this->FinalDestinationID() == this->SystemID()) { for (Fleet::const_iterator ship_it = this->begin(); ship_it != this->end(); ++ship_it) { - if (Ship* ship = objects.Object<Ship>(*ship_it)) + if (Ship* ship = GetObject<Ship>(*ship_it)) if (Meter* fuel_meter = ship->GetMeter(METER_FUEL)) GrowFuelMeter(fuel_meter); } @@ -847,7 +839,7 @@ for (it = move_path.begin(); it != move_path.end(); ++it) { next_it = it; ++next_it; - System* system = objects.Object<System>(it->object_id); + System* system = GetObject<System>(it->object_id); //Logger().debugStream() << "... node " << (system ? system->Name() : "no system"); @@ -873,7 +865,7 @@ //Logger().debugStream() << " ... node has fuel supply. consumed fuel for movement reset to 0 and fleet resupplied"; fuel_consumed = 0.0; for (Fleet::const_iterator ship_it = this->begin(); ship_it != this->end(); ++ship_it) { - Ship* ship = objects.Object<Ship>(*ship_it); + Ship* ship = GetObject<Ship>(*ship_it); assert(ship); ship->Resupply(); } @@ -915,7 +907,7 @@ if (m_moving_to != SystemID() && next_it != move_path.end() && it != move_path.end()) { // there is another system later on the path to aim for. find it for (; next_it != move_path.end(); ++next_it) { - if (objects.Object<System>(next_it->object_id)) { + if (GetObject<System>(next_it->object_id)) { //Logger().debugStream() << "___ setting m_next_system to " << next_it->object_id; m_next_system = next_it->object_id; break; @@ -931,7 +923,7 @@ // consume fuel from ships in fleet if (fuel_consumed > 0.0) { for (const_iterator ship_it = begin(); ship_it != end(); ++ship_it) - if (Ship* ship = objects.Object<Ship>(*ship_it)) + if (Ship* ship = GetObject<Ship>(*ship_it)) if (Meter* meter = ship->GetMeter(METER_FUEL)) meter->AdjustCurrent(-fuel_consumed); } Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Fleet.h 2009-11-18 06:03:59 UTC (rev 3271) @@ -58,7 +58,6 @@ double Fuel() const; ///< Returns effective amount of fuel this fleet has, which is the least of the amounts of fuel that the ships have double MaxFuel() const; ///< Returns effective maximum amount of fuel this fleet has, which is the least of the max amounts of fuel that the ships can have int FinalDestinationID() const; ///< Returns ID of system that this fleet is moving to. - System* FinalDestination() const; ///< Returns system that this fleet is moving to (may be null). int PreviousSystemID() const; ///< Returns ID of system that this fleet is moving away from as it moves to its destination. int NextSystemID() const; ///< Returns ID of system that this fleet is moving to next as it moves to its destination. double Speed() const; ///< Returns speed of fleet. (Should be equal to speed of slowest ship in fleet, unless in future the calculation of fleet speed changes.) Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Planet.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -395,8 +395,8 @@ return; } Logger().debugStream() << "Planet " << this->Name() << " adding building: " << building_id; - if (Building* building = GetMainObjectMap().Object<Building>(building_id)) { - if (System* system = GetSystem()) { + if (Building* building = GetObject<Building>(building_id)) { + if (System* system = GetObject<System>(this->SystemID())) { system->Insert(building); } else { Logger().errorStream() << "... planet is not located in a system?!?!"; @@ -428,13 +428,17 @@ void Planet::AddOwner(int id) { - GetSystem()->UniverseObject::AddOwner(id); + if (System* system = GetObject<System>(this->SystemID())) + system->UniverseObject::AddOwner(id); + else + Logger().errorStream() << "Planet::Addowner couldn't get system with id " << this->SystemID(); + UniverseObject::AddOwner(id); } void Planet::RemoveOwner(int id) { - System* system = GetSystem(); + 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>(); Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Planet.h 2009-11-18 06:03:59 UTC (rev 3271) @@ -166,7 +166,7 @@ void Init(); private: - virtual const UniverseObject* GetObject() const {return this;} + virtual const UniverseObject* GetThisObject() const {return this;} virtual Visibility GetVisibility(int empire_id) const {return UniverseObject::GetVisibility(empire_id);} virtual void InsertMeter(MeterType meter_type, Meter meter) {UniverseObject::InsertMeter(meter_type, meter);} Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/PopCenter.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -180,9 +180,9 @@ void PopCenter::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) { - const UniverseObject* object = GetObject(); + const UniverseObject* object = GetThisObject(); if (!object) { - Logger().errorStream() << "PopCenter GetObject returned 0"; + Logger().errorStream() << "PopCenter GetThisObject returned 0"; return; } Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/PopCenter.h 2009-11-18 06:03:59 UTC (rev 3271) @@ -63,7 +63,7 @@ virtual Meter* GetMeter(MeterType type) = 0; ///< implementation should return the requested Meter, or 0 if no such Meter of that type is found in this object virtual void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implementation should add \a meter to the object so that it can be accessed with the GetMeter() functions virtual const - UniverseObject* GetObject() const = 0; ///< implementation should return the UniverseObject associated with this PopCenter + UniverseObject* GetThisObject() const = 0; ///< implementation should return the UniverseObject associated with this PopCenter int m_race; ///< the id of the race that occupies this planet double m_allocated_food; ///< amount of food allocated to this PopCenter by Empire food distribution Modified: trunk/FreeOrion/universe/ResourceCenter.cpp =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/ResourceCenter.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -205,9 +205,9 @@ double primary_balanced_factor = ProductionDataTables()["FocusMods"][2][0]; double secondary_balanced_factor = ProductionDataTables()["FocusMods"][3][0]; - const UniverseObject* object = GetObject(); + const UniverseObject* object = GetThisObject(); if (!object) { - Logger().errorStream() << "ResourceCenter GetObject returned 0"; + Logger().errorStream() << "ResourceCenter GetThisObject returned 0"; return; } Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/ResourceCenter.h 2009-11-18 06:03:59 UTC (rev 3271) @@ -65,7 +65,7 @@ virtual const Meter* GetMeter(MeterType type) const = 0; ///< implementation should return the requested Meter, or 0 if no such Meter of that type is found in this object virtual Meter* GetMeter(MeterType type) = 0; ///< implementation should return the requested Meter, or 0 if no such Meter of that type is found in this object virtual const - UniverseObject* GetObject() const = 0; ///< implementation should return the UniverseObject associated with this ResourceCenter + UniverseObject* GetThisObject() const = 0; ///< implementation should return the UniverseObject associated with this ResourceCenter virtual void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implementation should add \a meter to the object so that it can be accessed with the GetMeter() functions Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Ship.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -125,10 +125,6 @@ return m_fleet_id; } -Fleet* Ship::GetFleet() const { - return m_fleet_id == INVALID_OBJECT_ID ? 0 : GetMainObjectMap().Object<Fleet>(m_fleet_id); -} - bool Ship::IsArmed() const { const ShipDesign* design = Design(); if (design) @@ -175,11 +171,18 @@ } double Ship::ProjectedCurrentMeter(MeterType type) const { + const ObjectMap& objects = GetMainObjectMap(); const Meter* original_meter = GetMeter(type); - assert(original_meter); + if (!original_meter) { + Logger().errorStream() << "Ship::ProjectedeCurrentMeter couldn't get meter of type " << boost::lexical_cast<std::string>(type); + return 0.0; + } Meter meter = Meter(*original_meter); - const Fleet* fleet = this->GetFleet(); - assert(fleet); + const Fleet* fleet = objects.Object<Fleet>(this->FleetID()); + if (!fleet) { + Logger().errorStream() << "Ship::ProjectedeCurrentMeter couldn't get fleet with id " << this->FleetID(); + return 0.0; + } switch (type) { case METER_FUEL: @@ -254,7 +257,7 @@ UniverseObject::MoveTo(x, y); // if ship is being moved away from its fleet, remove from the fleet. otherwise, keep ship in fleet. - if (Fleet* fleet = GetFleet()) { + if (Fleet* fleet = GetObject<Fleet>(this->FleetID())) { Logger().debugStream() << "Ship::MoveTo removing " << this->ID() << " from fleet " << fleet->Name(); fleet->RemoveShip(this->ID()); } Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Ship.h 2009-11-18 06:03:59 UTC (rev 3271) @@ -28,7 +28,6 @@ const ShipDesign* Design() const; ///< returns the design of the ship, containing engine type, weapons, etc. int DesignID() const; ///< returns the design id of the ship int FleetID() const; ///< returns the ID of the fleet the ship is residing in - Fleet* GetFleet() const; ///< returns the ID of the fleet the ship is residing in virtual const std::string& PublicName(int empire_id) const; Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/System.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -326,9 +326,11 @@ std::list<UniverseObject*> inserted_objects; inserted_objects.push_back(obj); // recursively get all objects contained within obj - for(std::list<UniverseObject*>::iterator it = inserted_objects.begin(); it != inserted_objects.end(); ++it) { - std::vector<UniverseObject*> contained_objects = (*it)->FindObjects(); - std::copy(contained_objects.begin(), contained_objects.end(), std::back_inserter(inserted_objects)); + for (std::list<UniverseObject*>::iterator it = inserted_objects.begin(); it != inserted_objects.end(); ++it) { + std::vector<int> contained_object_ids = (*it)->FindObjectIDs(); + for (std::vector<int>::const_iterator coit = contained_object_ids.begin(); coit != contained_object_ids.end(); ++coit) + if (UniverseObject* cobj = GetObject(*coit)) + inserted_objects.push_back(cobj); } @@ -385,9 +387,11 @@ removed_objects.push_back(obj); obj = 0; // to ensure I don't accidentally use obj instead of cur_obj in subsequent code // recursively get all objects contained within obj - for(std::list<UniverseObject*>::iterator it = removed_objects.begin(); it != removed_objects.end(); ++it) { - std::vector<UniverseObject*> contained_objects = (*it)->FindObjects(); - std::copy(contained_objects.begin(), contained_objects.end(), std::back_inserter(removed_objects)); + for (std::list<UniverseObject*>::iterator it = removed_objects.begin(); it != removed_objects.end(); ++it) { + std::vector<int> contained_object_ids = (*it)->FindObjectIDs(); + for (std::vector<int>::const_iterator coit = contained_object_ids.begin(); coit != contained_object_ids.end(); ++coit) + if (UniverseObject* cobj = GetObject(*coit)) + removed_objects.push_back(cobj); } Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-11-17 04:35:48 UTC (rev 3270) +++ trunk/FreeOrion/universe/Universe.cpp 2009-11-18 06:03:59 UTC (rev 3271) @@ -502,7 +502,7 @@ Logger().debugStream() << "ObjectMap contains UniverseObjects: "; for (ObjectMap::const_iterator it = const_begin(); it != const_end(); ++it) { const UniverseObject* obj = it->second; - const System* system = obj->GetSystem(); + const System* system = Object<System>(obj->SystemID()); Logger().debugStream() << obj->ID() << ": " << GetTypeName(obj) << " " @@ -565,7 +565,7 @@ int sys_id_2 = sys_id_property_map[sys_graph_index_2]; // look up lane between systems - const System* system1 = GetEmpireKnownConstObject<System>(sys_id_1, m_empire_id); + const System* system1 = GetEmpireKnownObject<System>(sys_id_1, m_empire_id); if (!system1) { Logger().errorStream() << "EdgeDescriptor::operator() couldn't find system with id " << sys_id_1; return false; @@ -816,7 +816,7 @@ bool Universe::SystemHasVisibleStarlanes(int system_id, int empire_id) const { - if (const System* system = GetEmpireKnownConstObject<System>(system_id, empire_id)) + if (const System* system = GetEmpireKnownObject<System>(system_id, empire_id)) if (!system->StarlanesWormholes().empty()) return true; return false; @@ -1044,9 +1044,8 @@ // add contained objects to list of objects to process, if requested. assumes no objects contain themselves (which could cause infinite loops) if (update_contained_objects) { - const std::vector<UniverseObject*> contained_objects = cur_object->FindObjects(); // get all contained objects - for (std::vector<UniverseObject*>::const_iterator cont_it = contained_objects.begin(); cont_it != contained_objects.end(); ++cont_it) - objects_list.push_back((*cont_it)->ID()); + std::vector<int> contained_objects = cur_object->FindObjectIDs(); // get all contained objects + std::copy(contained_objects.begin(), contained_objects.end(), std::back_inserter(objects_list)); } } std::vector<int> objects_vec; @@ -2056,7 +2055,7 @@ return; if (Ship* ship = universe_object_cast<Ship*>(obj)) { // if a ship is being deleted, and it is the last ship in its fleet, then the empty fleet should also be deleted - Fleet* fleet = ship->GetFleet(); + Fleet* fleet = GetObject<Fleet>(ship->FleetID()); Destroy(id); if (fleet && fleet->Empty()) Destroy(fleet->ID()); @@ -3884,7 +3883,13 @@ for (unsigned int j = 0; j < homeworlds.size(); ++j) { //Logger().debugStream() << "Universe::GenerateHomeworlds checking previously-existing homeworld with id " << homeworlds[j]; - System* existing_system = Objects().Object(homeworlds[j])->GetSystem(); + Planet* homeworld = GetObject<Planet>(homeworlds[j]); + if (!homeworld) { + Logger().errorStream() << "couldn't find homeworld!"; + continue; + } + + System* existing_system = GetObject<System>(homeworld->SystemID()); //Logger().debugStream() << ".... existing system ptr: " << existing_system; if (!existing_system) { @@ -4028,15 +4033,19 @@ // set ownership of home planet - Planet* home_planet = Objects().Object<Planet>(homeworlds[i]); - Logger().debugStream() << "Setting " << home_planet->GetSystem()->Name() << " (Planet #" << home_planet->ID() + Planet* home_planet = GetObject<Planet>(homeworlds[i]); + System* home_system = GetObject<System>(home_planet->SystemID()); + if (!home_planet || !home_system) { + Logger().errorStream() << "Couldn't get homeworld or system for generated empire..."; + continue; + } + + ... [truncated message content] |