From: <geo...@us...> - 2009-10-25 08:46:06
|
Revision: 3244 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=3244&view=rev Author: geoffthemedio Date: 2009-10-25 08:45:59 +0000 (Sun, 25 Oct 2009) Log Message: ----------- -Added Clone methods to UniverseObect derived classes -Added copy constructors for UniverseObject, ResourceCenter and System, for which the default would cause compile errors due to boost::signal being non-copyable -Added VisibilityLimitedCopy functions to UniverseObject derived classes, ResourceCenter and PopCenter, which aren't yet but will be used for storing selected bits of information about UniverseObjects based on each empire's current visibility level of that object -Added not-finished UpdateEmpireLatestKnownObjectsAndVisibilityTurns function to Universe that will store the turn on which empires last saw objects at various visibilities, and the latest known information about those objects for each empire. -Removed unused Universe assignment operator -Minor grooming Modified Paths: -------------- trunk/FreeOrion/UI/DesignWnd.cpp trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/server/ServerApp.cpp trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Building.h trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/InhibitableSignal.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/System.h trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/UI/DesignWnd.cpp =================================================================== --- trunk/FreeOrion/UI/DesignWnd.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/UI/DesignWnd.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -1378,11 +1378,11 @@ mutable boost::signal<void (const PartType*)> PartTypeClickedSignal; private: - void EmitNullSlotContentsAlteredSignal(); // emits SlotContentsAlteredSignal with PartType* = 0. needed because boost::signal is noncopyable, so boost::bind can't be used to bind the parameter 0 to SlotContentsAlteredSignal::operator() + void EmitNullSlotContentsAlteredSignal(); //!< emits SlotContentsAlteredSignal with PartType* = 0. needed because boost::signal is noncopyable, so boost::bind can't be used to bind the parameter 0 to SlotContentsAlteredSignal::operator() bool m_highlighted; ShipSlotType m_slot_type; - double m_x_position_fraction, m_y_position_fraction; // position on hull image where slot should be shown, as a fraction of that image's size + double m_x_position_fraction, m_y_position_fraction; //!< position on hull image where slot should be shown, as a fraction of that image's size PartControl* m_part_control; GG::StaticGraphic* m_background; }; Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/default/eng_stringtable.txt 2009-10-25 08:45:59 UTC (rev 3244) @@ -1948,7 +1948,7 @@ Resolving combat ... TURN_PROGRESS_PHASE_EMPIRE_GROWTH -Production and growth .. +Production and growth ... TURN_PROGRESS_PHASE_WAITING Waiting for players to end turn ... Modified: trunk/FreeOrion/server/ServerApp.cpp =================================================================== --- trunk/FreeOrion/server/ServerApp.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/server/ServerApp.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -895,6 +895,9 @@ ++m_current_turn; + m_universe.UpdateEmpireLatestKnownObjectsAndVisibilityTurns(); + + // compile map of PlayerInfo for each player, indexed by player ID std::map<int, PlayerInfo> players; for (ServerNetworking::const_established_iterator it = m_networking.established_begin(); it != m_networking.established_end(); ++it) { Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Building.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -70,6 +70,14 @@ UniverseObject::Init(); } +Building* Building::Clone() const +{ + return new Building(*this); +} + +void Building::VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis) +{} + const BuildingType* Building::GetBuildingType() const { return ::GetBuildingType(m_building_type); Modified: trunk/FreeOrion/universe/Building.h =================================================================== --- trunk/FreeOrion/universe/Building.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Building.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -18,8 +18,10 @@ { public: /** \name Structors */ //@{ - Building(); ///< default ctor - Building(int empire_id, const std::string& building_type, int planet_id); ///< basic ctor + Building(); ///< default ctor + Building(int empire_id, const std::string& building_type, int planet_id); ///< basic ctor + + virtual Building* Clone() const; ///< returns new copy of this Building //@} /** \name Accessors */ //@{ @@ -37,6 +39,8 @@ //@} /** \name Mutators */ //@{ + virtual void VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + void SetPlanetID(int planet_id); ///< sets the planet on which the building is located virtual void MoveTo(double x, double y); Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Condition.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -187,7 +187,7 @@ double low = std::max(0, m_low->Eval(source, target)); double high = std::min(m_high->Eval(source, target), IMPOSSIBLY_LARGE_TURN); int turn = CurrentTurn(); - + return (low <= turn && turn < high); } Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Fleet.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -65,6 +65,14 @@ AddOwner(owner); } +Fleet* Fleet::Clone() const +{ + return new Fleet(*this); +} + +void Fleet::VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis) +{} + Fleet::const_iterator Fleet::begin() const { return m_ships.begin(); @@ -1069,7 +1077,7 @@ Fleet::ShipIDSet Fleet::VisibleContainedObjects(int empire_id) const { ShipIDSet retval; - Universe& universe = GetUniverse(); + const Universe& universe = GetUniverse(); for (ShipIDSet::const_iterator it = m_ships.begin(); it != m_ships.end(); ++it) { int object_id = *it; if (universe.GetObjectVisibilityByEmpire(object_id, empire_id) >= VIS_BASIC_VISIBILITY) Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Fleet.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -25,12 +25,14 @@ { public: typedef std::set<int> ShipIDSet; - typedef ShipIDSet::iterator iterator; ///< an iterator to the ships in the fleet - typedef ShipIDSet::const_iterator const_iterator; ///< a const iterator to the ships in the fleet + typedef ShipIDSet::iterator iterator; ///< an iterator to the ships in the fleet + typedef ShipIDSet::const_iterator const_iterator; ///< a const iterator to the ships in the fleet /** \name Structors */ //@{ - Fleet(); ///< default ctor - Fleet(const std::string& name, double x, double y, int owner); + Fleet(); ///< default ctor + Fleet(const std::string& name, double x, double y, int owner); ///< general ctor taking name, position and owner id + + virtual Fleet* Clone() const; ///< returns new copy of this Fleet //@} /** \name Accessors */ //@{ @@ -78,8 +80,10 @@ //@} /** \name Mutators */ //@{ - void SetRoute(const std::list<int>& route); ///< orders the fleet to move through the systems in the list, in order + virtual void VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + void SetRoute(const std::list<int>& route); ///< orders the fleet to move through the systems in the list, in order + void AddShip(int ship_id); ///< adds the ship to the fleet bool RemoveShip(int ship); ///< removes the ship from the fleet. Returns false if no ship with ID \a id was found. void AddShips(const std::vector<int>& ships); ///< adds the ships with the IDs stored in \a ships to the fleet Modified: trunk/FreeOrion/universe/InhibitableSignal.h =================================================================== --- trunk/FreeOrion/universe/InhibitableSignal.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/InhibitableSignal.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -15,17 +15,18 @@ typedef typename T::slot_type slot_type; typedef typename T::group_type group_type; InhibitableSignal(const bool& inhibitor) : m_inhibitor(inhibitor) {} +// InhibitableSignal(const InhibitableSignal& rhs) : m_inhibitor(rhs.m_inhibitor) {} void operator()() - { if (!m_inhibitor) m_sig(); } + { if (!m_inhibitor) m_sig(); } boost::signals::connection connect(const slot_type& slot, boost::signals::connect_position at = boost::signals::at_back) - { return m_sig.connect(slot, at); } + { return m_sig.connect(slot, at); } boost::signals::connection connect(const group_type& group, const slot_type& slot, boost::signals::connect_position at = boost::signals::at_back) - { return m_sig.connect(group, slot, at); } + { return m_sig.connect(group, slot, at); } private: const bool& m_inhibitor; Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Planet.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -14,8 +14,6 @@ #include "../Empire/Empire.h" #include "../Empire/EmpireManager.h" -#include <GG/SignalsAndSlots.h> - #include <boost/lexical_cast.hpp> #include <stdexcept> @@ -125,6 +123,14 @@ m_rotational_period = -m_rotational_period; } +Planet* Planet::Clone() const +{ + return new Planet(*this); +} + +void Planet::VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis) +{} + void Planet::Init() { InsertMeter(METER_SUPPLY, Meter()); InsertMeter(METER_SHIELD, Meter()); @@ -578,7 +584,7 @@ std::set<int> Planet::VisibleContainedObjects(int empire_id) const { std::set<int> retval; - Universe& universe = GetUniverse(); + const Universe& universe = GetUniverse(); for (std::set<int>::const_iterator it = m_buildings.begin(); it != m_buildings.end(); ++it) { int object_id = *it; if (universe.GetObjectVisibilityByEmpire(object_id, empire_id) >= VIS_BASIC_VISIBILITY) Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Planet.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -86,8 +86,10 @@ { public: /** \name Structors */ //@{ - Planet(); ///< default ctor - Planet(PlanetType type, PlanetSize size); ///< general ctor taking just the planet's type and size + Planet(); ///< default ctor + Planet(PlanetType type, PlanetSize size); ///< general ctor taking just the planet's type and size + + virtual Planet* Clone() const; ///< returns new copy of this Planet //@} /** \name Accessors */ //@{ @@ -122,6 +124,8 @@ //@} /** \name Mutators */ //@{ + virtual void VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + virtual void SetSystem(int sys); virtual void MoveTo(double x, double y); @@ -170,7 +174,6 @@ std::set<int> VisibleContainedObjects(int empire_id) const; ///< returns the subset of m_buildings that is visible to empire with id \a empire_id - PlanetType m_type; PlanetSize m_size; Year m_orbital_period; Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/PopCenter.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -49,6 +49,9 @@ PopCenter::~PopCenter() {} +void PopCenter::VisibilityLimitedCopy(const PopCenter* copied_object, Visibility vis) +{} + void PopCenter::Init(double max_pop_mod, double max_health_mod) { InsertMeter(METER_POPULATION, Meter()); Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/PopCenter.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -19,8 +19,8 @@ { public: /** \name Structors */ //@{ - PopCenter(int race); ///< basic ctor - virtual ~PopCenter(); ///< dtor + explicit PopCenter(int race); ///< basic ctor + virtual ~PopCenter(); ///< dtor //@} /** \name Accessors */ //@{ @@ -40,6 +40,8 @@ //@} /** \name Mutators */ //@{ + void VisibilityLimitedCopy(const PopCenter* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + void SetRace(int race) {m_race = race;} ///< sets the race of the population to \a race void SetAllocatedFood(double allocated_food) {m_allocated_food = allocated_food;} ///< sets the amount of food which is currently available Modified: trunk/FreeOrion/universe/ResourceCenter.cpp =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/ResourceCenter.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -68,12 +68,22 @@ } } -ResourceCenter::ResourceCenter() +ResourceCenter::ResourceCenter() : + m_primary(INVALID_FOCUS_TYPE), + m_secondary(INVALID_FOCUS_TYPE) {} ResourceCenter::~ResourceCenter() {} +ResourceCenter::ResourceCenter(const ResourceCenter& rhs) : + m_primary(rhs.m_primary), + m_secondary(rhs.m_secondary) +{} + +void ResourceCenter::VisibilityLimitedCopy(const ResourceCenter* copied_object, Visibility vis) +{} + void ResourceCenter::Init() { InsertMeter(METER_FARMING, Meter()); Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/ResourceCenter.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -13,22 +13,21 @@ class Meter; class UniverseObject; -/** The ResourceCenter class is an abstract base class for anything in the FreeOrion gamestate that generates - * resources (food, minerals, etc.). Most likely, such an object will also be a subclass of UniverseObject. - * - * Planet is the most obvious class to inherit ResourceCenter, but other classes could be made from it as well - * (e.g., a trade-ship or mining vessel, or a non-Planet UniverseObject- and PopCenter- derived object of some - * sort. */ +/** The ResourceCenter class is an abstract base class for anything in the + * FreeOrion gamestate that generates resources (food, minerals, etc.). Most + * likely, such an object will also be a subclass of UniverseObject. + * + * Planet is the most obvious class to inherit ResourceCenter, but other + * classes could be made from it as well (e.g., a trade-ship or mining vessel, + * or a non-Planet UniverseObject- and PopCenter- derived object of some + * sort. */ class ResourceCenter { public: - /** \name Signal Types */ //@{ - typedef boost::signal<void ()> ResourceCenterChangedSignalType; ///< emitted when the ResourceCenter is altered in any way - //@} - /** \name Structors */ //@{ - ResourceCenter(); ///< default ctor - virtual ~ResourceCenter(); ///< dtor + ResourceCenter(); ///< default ctor + virtual ~ResourceCenter(); ///< dtor + ResourceCenter(const ResourceCenter& rhs); ///< copy ctor //@} /** \name Accessors */ //@{ @@ -39,10 +38,12 @@ virtual double MeterPoints(MeterType type) const; ///< returns "true amount" associated with a meter. In some cases (METER_POPULATION) this is just the meter value. In other cases (METER_FARMING) this is some other value (a function of population and meter value) virtual double ProjectedMeterPoints(MeterType type) const; ///< returns expected "true amount" associated with a meter on the next turn - mutable ResourceCenterChangedSignalType ResourceCenterChangedSignal; ///< the state changed signal object for this ResourceCenter + mutable boost::signal<void ()> ResourceCenterChangedSignal; ///< the state changed signal object for this ResourceCenter //@} /** \name Mutators */ //@{ + void VisibilityLimitedCopy(const ResourceCenter* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + void SetPrimaryFocus(FocusType focus); void SetSecondaryFocus(FocusType focus); Modified: trunk/FreeOrion/universe/Ship.cpp =================================================================== --- trunk/FreeOrion/universe/Ship.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Ship.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -71,6 +71,14 @@ } } +Ship* Ship::Clone() const +{ + return new Ship(*this);; +} + +void Ship::VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis) +{} + const ShipDesign* Ship::Design() const { return GetShipDesign(m_design_id); } Modified: trunk/FreeOrion/universe/Ship.h =================================================================== --- trunk/FreeOrion/universe/Ship.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Ship.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -18,15 +18,17 @@ typedef std::map<std::string, std::pair<std::size_t, std::size_t> > ConsumablesMap; /** \name Structors */ //@{ - Ship(); ///< default ctor - Ship(int empire_id, int design_id); ///< general ctor taking ship's empire and design id; from this the design can be looked up and used to create the ship + Ship(); ///< default ctor + Ship(int empire_id, int design_id); ///< general ctor taking ship's empire and design id; from this the design can be looked up and used to create the ship + + virtual Ship* Clone() const; ///< returns new copy of this Ship //@} /** \name Accessors */ //@{ - 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 + 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; @@ -45,6 +47,8 @@ //@} /** \name Mutators */ //@{ + virtual void VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + void SetFleetID(int fleet_id); ///< sets the ID of the fleet the ship resides in void Resupply(); Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/System.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -52,9 +52,21 @@ UniverseObject::Init(); } -System::~System() +System::System(const System& rhs) : + m_star(rhs.m_star), + m_orbits(rhs.m_orbits), + m_objects(rhs.m_objects), + m_starlanes_wormholes(rhs.m_starlanes_wormholes) {} +System* System::Clone() const +{ + return new System(*this);; +} + +void System::VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis) +{} + StarType System::GetStarType() const { return m_star; @@ -508,7 +520,7 @@ if (empire_id == ALL_EMPIRES) return m_starlanes_wormholes; - Universe& universe = GetUniverse(); + const Universe& universe = GetUniverse(); StarlaneMap retval; @@ -522,8 +534,8 @@ std::vector<const Fleet*> moving_empire_fleets; - Universe::ObjectVec moving_fleet_objects = universe.FindObjects(MovingFleetVisitor()); - for (Universe::ObjectVec::iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) + Universe::ConstObjectVec moving_fleet_objects = universe.FindObjects(MovingFleetVisitor()); + for (Universe::ConstObjectVec::const_iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) if (const Fleet* fleet = universe_object_cast<const Fleet*>(*it)) if (fleet->OwnedBy(empire_id)) moving_empire_fleets.push_back(fleet); @@ -564,7 +576,7 @@ System::ObjectMultimap System::VisibleContainedObjects(int empire_id) const { ObjectMultimap retval; - Universe& universe = GetUniverse(); + const Universe& universe = GetUniverse(); for (ObjectMultimap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { int object_id = it->second; if (universe.GetObjectVisibilityByEmpire(object_id, empire_id) >= VIS_BASIC_VISIBILITY) Modified: trunk/FreeOrion/universe/System.h =================================================================== --- trunk/FreeOrion/universe/System.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/System.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -26,7 +26,7 @@ class System : public UniverseObject { private: - typedef std::multimap<int, int> ObjectMultimap; + typedef std::multimap<int, int> ObjectMultimap; public: typedef std::vector<UniverseObject*> ObjectVec; ///< the return type of FindObjects() @@ -52,7 +52,9 @@ System(StarType star, int orbits, const StarlaneMap& lanes_and_holes, const std::string& name, double x, double y, const std::set<int>& owners = std::set<int>()); - ~System(); ///< dtor + System(const System& rhs); ///< copy ctor + + virtual System* Clone() const; ///< returns new copy of this System //@} /** \name Accessors */ //@{ @@ -120,6 +122,8 @@ //@} /** \name Mutators */ //@{ + virtual void VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis = VIS_FULL_VISIBILITY); + /** inserts a UniversObject into the system, though not in any particular orbit. Only objects free of any particular orbit, such as ships, should be inserted using this function. This function calls obj->SetSystem(this), and obj->MoveTo( this system's position )*/ Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Universe.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -440,27 +440,6 @@ m_last_allocated_design_id(UniverseObject::INVALID_OBJECT_ID) {} -const Universe& Universe::operator=(Universe& rhs) -{ - for (ObjectMap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) { - delete it->second; - } - m_objects.clear(); - for (ObjectMap::iterator it = m_destroyed_objects.begin(); it != m_destroyed_objects.end(); ++it) { - delete it->second; - } - m_objects.clear(); - m_destroyed_objects.clear(); - m_last_allocated_object_id = rhs.m_last_allocated_object_id; - m_last_allocated_design_id = rhs.m_last_allocated_design_id; - m_objects = rhs.m_objects; - rhs.m_objects.clear(); - m_destroyed_objects = rhs.m_destroyed_objects; - rhs.m_destroyed_objects.clear(); - InitializeSystemGraph(); - return *this; -} - Universe::~Universe() { for (ObjectMap::iterator it = m_objects.begin(); it != m_objects.end(); ++it) @@ -1259,10 +1238,7 @@ void Universe::UpdateEmpireObjectVisibilities() { - //EmpireObjectVisibilityMap m_empire_object_visibility; ///< map from empire id to (map from object id to visibility of that object for that empire) - //typedef std::map<int, Visibility> ObjectVisibilityMap; ///< map from object id to Visibility level for a particular empire - //typedef std::map<int, ObjectVisibilityMap> EmpireObjectVisibilityMap; ///< map from empire id to ObjectVisibilityMap for that empire - + Logger().debugStream() << "Universe::UpdateEmpireObjectVisibilities()"; m_empire_object_visibility.clear(); // for each detecting object @@ -1271,7 +1247,7 @@ const UniverseObject* detector = detector_it->second; if (!detector) continue; - Logger().debugStream() << "Detector object: " << detector->Name(); + //Logger().debugStream() << "Detector object: " << detector->Name(); int detector_id = detector->ID(); @@ -1468,7 +1444,7 @@ // be visible std::vector<const Fleet*> moving_fleets; Universe::ObjectVec moving_fleet_objects = this->FindObjects(MovingFleetVisitor()); - for (Universe::ObjectVec::iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) + for (Universe::ObjectVec::iterator it = moving_fleet_objects.begin(); it != moving_fleet_objects.end(); ++it) { if (const Fleet* fleet = universe_object_cast<const Fleet*>(*it)) { if (fleet->SystemID() != UniverseObject::INVALID_OBJECT_ID || fleet->Unowned()) continue; @@ -1500,8 +1476,121 @@ } } } + } + + } +void Universe::UpdateEmpireLatestKnownObjectsAndVisibilityTurns() +{ + /** Stores latest known information about each object for each empire and + * updates the record of the last turn on which each empire has visibility + * of object that can be seen on the current turn with the level of + * visibility that the empire has this turn. */ + + //typedef std::map<int, ObjectMap> EmpireLatestKnownObjectMap; ///< Most recent known information each empire had about objects in the Universe; keyed by empire id + + //typedef std::map<Visibility, int> VisibilityTurnMap; ///< Most recent turn number on which a something, such as a Universe object, was observed at various Visibility ratings or better + //typedef std::map<int, VisibilityTurnMap> ObjectVisibilityTurnMap; ///< Most recent turn number on which the objects were observed at various Visibility ratings; keyed by object id + //typedef std::map<int, ObjectVisibilityTurnMap> EmpireObjectVisibilityTurnMap; ///< Each empire's most recent turns on which object information was known; keyed by empire id + + + + // Update contents of: + + //EmpireLatestKnownObjectMap m_empire_latest_known_objects; ///< map from empire id to (map from object id to latest known information about each object by that empire) + //EmpireObjectVisibilityTurnMap m_empire_object_visibility_turns; ///< map from empire id to (map from object id to (map from Visibility rating to turn number on which the empire last saw the object at the indicated Visibility rating or higher) + + + // assumes m_empire_object_visibility has been updated + + + // for each object in universe + // for each empire that can see object this turn + // update empire's information about object, based on visibility + // update empire's visbilility turn history + + int current_turn = CurrentTurn(); + if (current_turn == INVALID_GAME_TURN) + return; + + + // for each object in universe + for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) { + int object_id = it->first; + const UniverseObject* obj = it->second; + + // for each empire with a visibility map + for (EmpireObjectVisibilityMap::const_iterator empire_it = m_empire_object_visibility.begin(); empire_it != m_empire_object_visibility.end(); ++empire_it) { + + // can empire see object? + const ObjectVisibilityMap& vis_map = empire_it->second; // stores level of visibility empire has for each object it can detect this turn + ObjectVisibilityMap::const_iterator vis_it = vis_map.find(object_id); + if (vis_it == vis_map.end()) + continue; // empire can't see current object, so move to next empire + const Visibility vis = vis_it->second; + if (vis <= VIS_NO_VISIBILITY) + continue; // empire can't see current object, so move to next empire + + + /** empire can see object. need to update empire's latest known + * information about object, and historical turns on which object + * was seen at various visibility levels. */ + int empire_id = empire_it->first; + ObjectMap& known_object_map = m_empire_latest_known_objects[empire_id]; // creates empty map if none yet present + ObjectVisibilityTurnMap& object_vis_turn_map = m_empire_object_visibility_turns[empire_id]; // creates empty map if none yet present + VisibilityTurnMap& vis_turn_map = object_vis_turn_map[object_id]; // creates empty map if none yet present + + + // update empire's latest known data about object, based on current visibility and historical visibility and knowledge of object + + // is there already last known version of an UniverseObject stored for this empire? + UniverseObject* known_object = 0; + ObjectMap::iterator known_obj_it = known_object_map.find(object_id); + if (known_obj_it != known_object_map.end()) { + known_object = known_obj_it->second; + // update pointed-to known object + + } else { + // create visibility-filtered copy of + } + + // create or update known_object + + //if (known_obj_it == known_object_map.end()) + // known_obj_it->second = known_object; + //else + // known_object_map[object_id] = known_object; + + + // update empire's visibility turn history for current vis, and lesser vis levels + if (vis >= VIS_BASIC_VISIBILITY) { + vis_turn_map[VIS_BASIC_VISIBILITY] = current_turn; + if (vis >= VIS_PARTIAL_VISIBILITY) { + vis_turn_map[VIS_BASIC_VISIBILITY] = current_turn; + if (vis >= VIS_FULL_VISIBILITY) { + vis_turn_map[VIS_BASIC_VISIBILITY] = current_turn; + } + } + } else { + Logger().errorStream() << "Universe::UpdateEmpireLatestKnownObjectsAndVisibilityTurns() found invalid visibility for object with id " << object_id << " by empire with id " << empire_id; + continue; + } + } + } + + + + + + //if (GetObjectVisibilityByEmpire(it->first, encoding_empire) > VIS_NO_VISIBILITY) + + //// for each empire + //for (EmpireObjectVisibilityMap::iterator empire_it = m_empire_object_visibility.begin(); empire_it != m_empire_object_visibility.end(); ++empire_it) { + // ObjectVisibilityMap& vis_map = empire_it->second; + //} +} + void Universe::RebuildEmpireViewSystemGraphs() { m_graph_impl->m_empire_system_graph_views.clear(); @@ -1833,10 +1922,17 @@ void Universe::GetObjectsToSerialize(ObjectMap& objects, int encoding_empire) const { - objects.clear(); - for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) - if (GetObjectVisibilityByEmpire(it->first, encoding_empire) > VIS_NO_VISIBILITY) - objects.insert(*it); + if (s_encoding_empire == ALL_EMPIRES) { + objects = m_objects; + } else { + + // TODO: send contents of m_empire_latest_known_objects instead of filtering m_objects by visibility + + objects.clear(); + for (ObjectMap::const_iterator it = m_objects.begin(); it != m_objects.end(); ++it) + if (GetObjectVisibilityByEmpire(it->first, encoding_empire) > VIS_NO_VISIBILITY) + objects.insert(*it); + } } void Universe::GetEmpireObjectVisibilityMap(EmpireObjectVisibilityMap& empire_object_visibility, int encoding_empire) const Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/Universe.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -120,7 +120,6 @@ /** \name Structors */ //@{ Universe(); ///< default ctor - const Universe& operator=(Universe& rhs); ///< assignment operator (move semantics) virtual ~Universe(); ///< dtor //@} @@ -313,6 +312,12 @@ * level, based on */ void UpdateEmpireObjectVisibilities(); + /** Stores latest known information about each object for each empire and + * updates the record of the last turn on which each empire has visibility + * of object that can be seen on the current turn with the level of + * visibility that the empire has this turn. */ + void UpdateEmpireLatestKnownObjectsAndVisibilityTurns(); + /** Reconstructs the per-empire system graph views needed to calculate * routes based on visibility. */ void RebuildEmpireViewSystemGraphs(); Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2009-10-25 08:45:59 UTC (rev 3244) @@ -31,8 +31,8 @@ m_created_on_turn = CurrentTurn(); } -UniverseObject::UniverseObject(const std::string name, double x, double y, - const std::set<int>& owners/* = std::set<int>()*/) : +UniverseObject::UniverseObject(const std::string name, double x, double y, + const std::set<int>& owners/* = std::set<int>()*/) : StateChangedSignal(Universe::UniverseObjectSignalsInhibited()), m_id(INVALID_OBJECT_ID), m_name(name), @@ -47,9 +47,26 @@ m_created_on_turn = CurrentTurn(); } +UniverseObject::UniverseObject(const UniverseObject& rhs) : + StateChangedSignal(Universe::UniverseObjectSignalsInhibited()), + m_id(rhs.m_id), + m_name(rhs.m_name), + m_x(rhs.m_x), + m_y(rhs.m_y), + m_owners(rhs.m_owners), + m_system_id(rhs.m_system_id), + m_specials(rhs.m_specials), + m_meters(rhs.m_meters), + m_created_on_turn(rhs.m_created_on_turn) +{} + UniverseObject::~UniverseObject() {} +void UniverseObject::VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis) +{ +} + void UniverseObject::Init() { InsertMeter(METER_STEALTH, Meter()); Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2009-10-24 17:53:10 UTC (rev 3243) +++ trunk/FreeOrion/universe/UniverseObject.h 2009-10-25 08:45:59 UTC (rev 3244) @@ -28,36 +28,46 @@ class SitRepEntry; struct UniverseObjectVisitor; -/** the abstract base class for all objects in the universe. The UniverseObject class itself has only an ID, a name, - a position, possibly a System in which it is, and zero or more owners. The position can range from 0 (left) to 1000 - (right) in X, and 0 (top) to 1000 (bottom) in Y. This coordinate system was chosen to help with conversion to - and from screen coordinates, which originate at the upper-left corner of the screen and increase down and to the - right. Each UniverseObject-derived class inherits several pure virtual members that perform its actions during - various game phases, such as the movement phase. These subclasses must define what actions to perform during - those phases. UniverseObjects advertise changes to themselves via the StateChanged signal. This means that all - mutators on UniverseObject and its subclasses need to emit this signal. This is how the UI becomes aware that an - object that is being displayed has changed.*/ +/** The abstract base class for all objects in the universe + * The UniverseObject class itself has an ID number, a name, a position, an ID + * of the system in which it is, a list of zero or more owners, and other + * common object data. + * Position in the Universe can range from 0 (left) to 1000 (right) in X, and + * 0 (top) to 1000 (bottom) in Y. This coordinate system was chosen to help + * with conversion to and from screen coordinates, which originate at the + * upper-left corner of the screen and increase down and to the right. Each + * UniverseObject-derived class inherits several pure virtual members that + * perform its actions during various game phases, such as the movement phase. + * These subclasses must define what actions to perform during those phases. + * UniverseObjects advertise changes to themselves via the StateChanged + * Signal. This means that all mutators on UniverseObject and its subclasses + * need to emit this signal. This is how the UI becomes aware that an object + * that is being displayed has changed.*/ class UniverseObject { public: /** \name Signal Types */ //@{ - typedef boost::signal<void ()> StateChangedSignalBaseType; ///< used to define StateChangedSignalType - typedef InhibitableSignal<StateChangedSignalBaseType> StateChangedSignalType; ///< emitted when the UniverseObject is altered in any way + typedef boost::signal<void ()> StateChangedSignalBaseType; + typedef InhibitableSignal<StateChangedSignalBaseType> StateChangedSignalType; //@} /** \name Slot Types */ //@{ - typedef StateChangedSignalType::slot_type StateChangedSlotType; ///< type of functor(s) invoked on a StateChangedSignalType + typedef StateChangedSignalType::slot_type StateChangedSlotType; //@} /** \name Structors */ //@{ - UniverseObject(); ///< default ctor + UniverseObject(); ///< default ctor /** general ctor. \throw std::invalid_argument May throw std::invalid_argument if the either x or y coordinate is outside the map area.*/ UniverseObject(const std::string name, double x, double y, const std::set<int>& owners = std::set<int>()); - virtual ~UniverseObject(); ///< dtor + UniverseObject(const UniverseObject& rhs); ///< copy ctor + + virtual ~UniverseObject(); ///< dtor + + virtual UniverseObject* Clone() const = 0; ///< returns new copy of this UniverseObject //@} /** \name Accessors */ //@{ @@ -98,10 +108,15 @@ int CreationTurn() const; ///< returns game turn on which object was created int AgeInTurns() const; ///< returns elapsed number of turns between turn object was created and current game turn - mutable StateChangedSignalType StateChangedSignal; ///< returns the state changed signal object for this UniverseObject + mutable StateChangedSignalType StateChangedSignal; ///< emitted when the UniverseObject is altered in any way //@} /** \name Mutators */ //@{ + /** copies data from \a copied_object to this object, limited to only copy + * data that would be known to an empire that detects the copied object at + * the specified Visibility level \a vis */ + virtual void VisibilityLimitedCopy(const UniverseObject* copied_object, Visibility vis = VIS_FULL_VISIBILITY) = 0; + void SetID(int id); ///< sets the ID number of the object to \a id void Rename(const std::string& name); ///< renames this object to \a name |