From: <geo...@us...> - 2009-10-17 22:26:44
|
Revision: 3219 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3219&view=rev Author: geoffthemedio Date: 2009-10-17 22:26:35 +0000 (Sat, 17 Oct 2009) Log Message: ----------- -Made objects detected due to having stealth 0, which aren't in range of a detector that sees them according to standard detection rules, be revealed at basic visibility. -Made objects, revealed due to containing other objects that are directly detected, be revealed at basic visibility. -Made objects not reveal the details of their meters at basic visibility. The existence of the meters is serialized, but not the actual current and max values. -Made ships at basic visibility not reveal their design id. -Made a few functions not crash if a ship doesn't have a known design id, or if INVALID_OBJECT_ID if passed as the design id. -Added pure abstract GetVisibility private functions to ResourceCenter and PopCenter, making their object's current visibility level available to them. -Replaced a couple -1 with ALL_EMPIRES constant when appropriate Modified Paths: -------------- trunk/FreeOrion/UI/ClientUI.cpp trunk/FreeOrion/UI/MapWnd.cpp trunk/FreeOrion/server/ServerFSM.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Planet.h trunk/FreeOrion/universe/PopCenter.h trunk/FreeOrion/universe/ResourceCenter.h trunk/FreeOrion/universe/Ship.cpp trunk/FreeOrion/universe/Ship.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/UI/ClientUI.cpp =================================================================== --- trunk/FreeOrion/UI/ClientUI.cpp 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/UI/ClientUI.cpp 2009-10-17 22:26:35 UTC (rev 3219) @@ -94,12 +94,13 @@ { std::string graphic_name = ""; const ShipDesign* design = GetShipDesign(design_id); - if (design) + if (design) { graphic_name = design->Graphic(); - if (graphic_name.empty()) { - const HullType* hull_type = design->GetHull(); - if (hull_type) - return ClientUI::HullTexture(hull_type->Name()); + if (graphic_name.empty()) + if (const HullType* hull_type = design->GetHull()) + return ClientUI::HullTexture(hull_type->Name()); + } else { + return ClientUI::HullTexture(""); } return ClientUI::GetTexture(ArtDir() / graphic_name, true); } Modified: trunk/FreeOrion/UI/MapWnd.cpp =================================================================== --- trunk/FreeOrion/UI/MapWnd.cpp 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/UI/MapWnd.cpp 2009-10-17 22:26:35 UTC (rev 3219) @@ -2168,7 +2168,7 @@ } // get owner of fleet - int empire_id = -1; + int empire_id = ALL_EMPIRES; const std::set<int>& owners = fleet->Owners(); if (owners.size() == 1) empire_id = *(owners.begin()); @@ -2197,7 +2197,7 @@ } // get owner of fleet - int empire_id = -1; + int empire_id = ALL_EMPIRES; const std::set<int>& owners = fleet->Owners(); if (owners.size() == 1) empire_id = *(owners.begin()); @@ -2267,9 +2267,8 @@ // create button for each empire's fleets for (std::map<int, std::vector<const Fleet*> >::const_iterator empire_it = empires_map.begin(); empire_it != empires_map.end(); ++empire_it) { - const Empire* empire = empires.Lookup(empire_it->first); const std::vector<const Fleet*> fleets = empire_it->second; - if (!empire || fleets.empty()) + if (fleets.empty()) continue; // buttons need fleet IDs @@ -2301,9 +2300,8 @@ // create button for each empire's fleets for (std::map<int, std::vector<const Fleet*> >::const_iterator empire_it = empires_map.begin(); empire_it != empires_map.end(); ++empire_it) { - const Empire* empire = empires.Lookup(empire_it->first); const std::vector<const Fleet*> fleets = empire_it->second; - if (!empire || fleets.empty()) + if (fleets.empty()) continue; // buttons need fleet IDs @@ -2334,9 +2332,8 @@ // create button for each empire's fleets for (std::map<int, std::vector<const Fleet*> >::const_iterator empire_it = empires_map.begin(); empire_it != empires_map.end(); ++empire_it) { - const Empire* empire = empires.Lookup(empire_it->first); const std::vector<const Fleet*>& fleets = empire_it->second; - if (!empire || fleets.empty()) + if (fleets.empty()) continue; //std::cout << " ... creating moving fleet buttons for empire " << empire->Name() << std::endl; Modified: trunk/FreeOrion/server/ServerFSM.cpp =================================================================== --- trunk/FreeOrion/server/ServerFSM.cpp 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/server/ServerFSM.cpp 2009-10-17 22:26:35 UTC (rev 3219) @@ -278,7 +278,7 @@ RebuildSaveGameEmpireData(m_lobby_data->m_save_game_empire_data, m_lobby_data->m_save_games[m_lobby_data->m_save_file_index]); // reset the current choice of empire for each player, since the new save game's empires may not have the same IDs for (unsigned int i = 0; i < m_lobby_data->m_players.size(); ++i) { - m_lobby_data->m_players[i].m_save_game_empire_id = -1; + m_lobby_data->m_players[i].m_save_game_empire_id = ALL_EMPIRES; } new_save_file_selected = true; } Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-10-17 22:26:35 UTC (rev 3219) @@ -381,9 +381,15 @@ double fuel = Meter::METER_MAX; for (const_iterator ship_it = begin(); ship_it != end(); ++ship_it) { const Ship* ship = universe.Object<Ship>(*ship_it); - assert(ship); + if (!ship) { + Logger().errorStream() << "Fleet::Fuel couldn't get ship with id " << *ship_it; + continue; + } const Meter* meter = ship->GetMeter(METER_FUEL); - assert(meter); + if (!meter) { + Logger().errorStream() << "Fleet::Fuel skipping ship with no fuel meter"; + continue; + } fuel = std::min(fuel, meter->Current()); } return fuel; @@ -400,9 +406,15 @@ double max_fuel = Meter::METER_MAX; for (const_iterator ship_it = begin(); ship_it != end(); ++ship_it) { const Ship* ship = universe.Object<Ship>(*ship_it); - assert(ship); + if (!ship) { + Logger().errorStream() << "Fleet::MaxFuel couldn't get ship with id " << *ship_it; + continue; + } const Meter* meter = ship->GetMeter(METER_FUEL); - assert(meter); + if (!meter) { + Logger().errorStream() << "Fleet::MaxFuel skipping ship with no fuel meter"; + continue; + } max_fuel = std::min(max_fuel, meter->Max()); } return max_fuel; Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/Planet.h 2009-10-17 22:26:35 UTC (rev 3219) @@ -165,10 +165,10 @@ private: UniverseObject* This() {return this;} - virtual void InsertMeter(MeterType meter_type, Meter meter) {UniverseObject::InsertMeter(meter_type, meter);} + 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);} + virtual const Meter* GetPopMeter() const {return GetMeter(METER_POPULATION);} - virtual const Meter* GetPopMeter() const {return GetMeter(METER_POPULATION);} - std::set<int> VisibleContainedObjects(int empire_id) const; ///< returns the subset of m_buildings that is visible to empire with id \a empire_id Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/PopCenter.h 2009-10-17 22:26:35 UTC (rev 3219) @@ -57,12 +57,12 @@ void Init(double max_pop_mod, double max_health_mod); ///< initialization that needs to be called by derived class after derived class is constructed private: - PopCenter(); ///< default ctor + PopCenter(); ///< default ctor - virtual Meter* GetMeter(MeterType type) = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object + //virtual Visibility GetVisibility(int empire_id) const = 0; ///< implementation should return the visbility of this PopCenter for the empire with the specified \a empire_id + 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 void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implimentation should add \a meter to the object so that it can be accessed with the GetMeter() functions - 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.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/ResourceCenter.h 2009-10-17 22:26:35 UTC (rev 3219) @@ -57,8 +57,8 @@ FocusType m_primary; FocusType m_secondary; + virtual Visibility GetVisibility(int empire_id) const = 0; ///< implementation should return the visbility of this ResourceCenter for the empire with the specified \a empire_id virtual const Meter* GetPopMeter() const = 0; ///< implimentation should return the population meter to use when calculating meter points for this resource center - virtual const Meter* GetMeter(MeterType type) const = 0; ///< implimentation 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; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object @@ -75,13 +75,12 @@ { Visibility vis; if (Archive::is_saving::value) { - UniverseObject* object = GetObjectSignal(); - assert(object); - vis = object->GetVisibility(Universe::s_encoding_empire); + vis = GetVisibility(Universe::s_encoding_empire); } + ar & BOOST_SERIALIZATION_NVP(vis); - if (Universe::ALL_OBJECTS_VISIBLE || - vis == VIS_FULL_VISIBILITY) { + + if (vis == VIS_FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(m_primary) & BOOST_SERIALIZATION_NVP(m_secondary); } Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/Ship.cpp 2009-10-17 22:26:35 UTC (rev 3219) @@ -88,15 +88,27 @@ } bool Ship::IsArmed() const { - return Design()->IsArmed(); + const ShipDesign* design = Design(); + if (design) + return design->IsArmed(); + else + return false; } bool Ship::CanColonize() const { - return Design()->CanColonize(); + const ShipDesign* design = Design(); + if (design) + return design->CanColonize(); + else + return false; } double Ship::Speed() const { - return Design()->StarlaneSpeed(); + const ShipDesign* design = Design(); + if (design) + return design->StarlaneSpeed(); + else + return false; } const Ship::ConsumablesMap& Ship::Fighters() const { Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/Ship.h 2009-10-17 22:26:35 UTC (rev 3219) @@ -83,11 +83,14 @@ ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(UniverseObject) & BOOST_SERIALIZATION_NVP(vis) - & BOOST_SERIALIZATION_NVP(m_design_id) - & BOOST_SERIALIZATION_NVP(m_fleet_id) - & BOOST_SERIALIZATION_NVP(m_fighters) - & BOOST_SERIALIZATION_NVP(m_missiles); + & BOOST_SERIALIZATION_NVP(m_fleet_id); + if (vis >= VIS_PARTIAL_VISIBILITY) { + ar & BOOST_SERIALIZATION_NVP(m_design_id) + & BOOST_SERIALIZATION_NVP(m_fighters) + & BOOST_SERIALIZATION_NVP(m_missiles); + } + if (vis == VIS_FULL_VISIBILITY) { ar & BOOST_SERIALIZATION_NVP(ordered_scrapped); } Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/Universe.cpp 2009-10-17 22:26:35 UTC (rev 3219) @@ -1367,7 +1367,7 @@ } else { // check whether having a contained object wouldn't change container's // visibility anyway... - if (container_vis_it->second >= VIS_PARTIAL_VISIBILITY) + if (container_vis_it->second >= VIS_BASIC_VISIBILITY) continue; // having visible contained object grants part vis only. if container already has this for current empire, don't need to propegate } @@ -1386,8 +1386,8 @@ // container should be at least partially visible, but don't // want to decrease visibility of container if it is already // higher than partially visible - if (container_vis_it->second < VIS_PARTIAL_VISIBILITY) - container_vis_it->second = VIS_PARTIAL_VISIBILITY; + if (container_vis_it->second < VIS_BASIC_VISIBILITY) + container_vis_it->second = VIS_BASIC_VISIBILITY; } } // end for empire visibility entries } // end for contained objects Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2009-10-17 18:12:04 UTC (rev 3218) +++ trunk/FreeOrion/universe/UniverseObject.h 2009-10-17 22:26:35 UTC (rev 3219) @@ -197,18 +197,31 @@ template <class Archive> void UniverseObject::serialize(Archive& ar, const unsigned int version) { - Visibility vis; + Visibility vis; + std::map<MeterType, Meter> meters; - if (Archive::is_saving::value) + if (Archive::is_saving::value) { vis = GetVisibility(Universe::s_encoding_empire); + if (vis >= VIS_PARTIAL_VISIBILITY) { + meters = m_meters; + } else { + for (std::map<MeterType, Meter>::const_iterator it = m_meters.begin(); it != m_meters.end(); ++it) + meters[it->first] = Meter(); + } + } + ar & BOOST_SERIALIZATION_NVP(vis) & BOOST_SERIALIZATION_NVP(m_id) & BOOST_SERIALIZATION_NVP(m_x) & BOOST_SERIALIZATION_NVP(m_y) & BOOST_SERIALIZATION_NVP(m_system_id) - & BOOST_SERIALIZATION_NVP(m_meters); + & BOOST_SERIALIZATION_NVP(meters); + if (Archive::is_loading::value) { + m_meters = meters; + } + if (vis >= VIS_PARTIAL_VISIBILITY) { std::string name; if (Archive::is_saving::value) { @@ -222,8 +235,9 @@ & BOOST_SERIALIZATION_NVP(m_specials) & BOOST_SERIALIZATION_NVP(m_created_on_turn); - if (Archive::is_loading::value) + if (Archive::is_loading::value) { m_name = name; + } } } |