From: <geo...@us...> - 2011-10-22 23:57:55
|
Revision: 4431 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4431&view=rev Author: geoffthemedio Date: 2011-10-22 23:57:48 +0000 (Sat, 22 Oct 2011) Log Message: ----------- Tweaked visibility determination so objects in a system always grant their owner partial visibility of that system, and thus the name and star type. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2011-10-22 23:15:56 UTC (rev 4430) +++ trunk/FreeOrion/universe/Universe.cpp 2011-10-22 23:57:48 UTC (rev 4431) @@ -1463,9 +1463,12 @@ // target is seen by the detector with partial visibility. double detect_range = detection - stealth; //Logger().debugStream() << "dist2: " << dist2 << " detect range: " << detect_range; - if (detect_range >= 0.0 && - dist2 <= detect_range*detect_range && - target_visibility_to_detector < VIS_PARTIAL_VISIBILITY) + if (target_visibility_to_detector < VIS_PARTIAL_VISIBILITY && + ( + (detect_range >= 0.0 && dist2 <= detect_range*detect_range) || + (dist2 == 0.0 && universe_object_cast<const System*>(target)) + ) + ) { target_visibility_to_detector = VIS_PARTIAL_VISIBILITY; } |
From: <geo...@us...> - 2011-12-23 01:40:59
|
Revision: 4534 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4534&view=rev Author: geoffthemedio Date: 2011-12-23 01:40:52 +0000 (Fri, 23 Dec 2011) Log Message: ----------- Added to Universe::GetEffectsAndTargets a workaround for when an empire has no capital: any other planet owned by the empire is chosen, or if there are no owned planets, any other object owned by the empire is chosen. The result is passed as the source object for the tech's ScriptingContext, so that Source.Owner will return a valid object which is owned by the empire, and can be used to find the empire's ID in tech effect scripts. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2011-12-23 01:39:23 UTC (rev 4533) +++ trunk/FreeOrion/universe/Universe.cpp 2011-12-23 01:40:52 UTC (rev 4534) @@ -1108,6 +1108,23 @@ Logger().debugStream() << "Universe::GetEffectsAndTargets for TECHS"; for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { const Empire* empire = it->second; + int source_id = empire->CapitalID(); + if (source_id == UniverseObject::INVALID_OBJECT_ID) { + // find alternate object owned by this empire to act as source + // first try to get a planet + std::vector<int> empire_planets = m_objects.FindObjectIDs(OwnedVisitor<Planet>(empire->EmpireID())); + if (!empire_planets.empty()) { + source_id = *empire_planets.begin(); + } else { + // if no planet, use any owned object + std::vector<int> empire_objects = m_objects.FindObjectIDs(OwnedVisitor<UniverseObject>(empire->EmpireID())); + if (!empire_objects.empty()) { + source_id = *empire_objects.begin(); + } else { + continue; // can't do techs for this empire + } + } + } for (Empire::TechItr tech_it = empire->TechBegin(); tech_it != empire->TechEnd(); ++tech_it) { const Tech* tech = GetTech(*tech_it); if (!tech) continue; |
From: <geo...@us...> - 2012-03-03 01:55:53
|
Revision: 4675 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4675&view=rev Author: geoffthemedio Date: 2012-03-03 01:55:47 +0000 (Sat, 03 Mar 2012) Log Message: ----------- -Reordered effects execution so Species effects are last. -Added Ship source objects to the Species effects execution (previously only poulation centres (eg. planets) were used). Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-03-01 13:36:51 UTC (rev 4674) +++ trunk/FreeOrion/universe/Universe.cpp 2012-03-03 01:55:47 UTC (rev 4675) @@ -1048,24 +1048,6 @@ all_potential_targets.push_back(m_objects.Object(*it)); Logger().debugStream() << "Universe::GetEffectsAndTargets"; - // 0) EffectsGroups from Species - Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIES"; - for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { - Logger().debugStream() << "... object (" << it->first << "): " << it->second->Name(); - const PopCenter* pc = dynamic_cast<const PopCenter*>(it->second); - if (!pc) continue; - const std::string& species_name = pc->SpeciesName(); - //Logger().debugStream() << "... ... PopCenter species: " << species_name; - if (species_name.empty()) - continue; - const Species* species = GetSpecies(species_name); - if (!species) { - Logger().errorStream() << "GetEffectsAndTargets couldn't get Species " << species_name; - continue; - } - StoreTargetsAndCausesOfEffectsGroups(species->Effects(), it->first, ECT_SPECIES, species_name, - all_potential_targets, targets_causes); - } // 1) EffectsGroups from Specials Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIALS"; @@ -1175,6 +1157,30 @@ all_potential_targets, targets_causes); } } + + // 5) EffectsGroups from Species + Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIES"; + for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { + Logger().debugStream() << "... object (" << it->first << "): " << it->second->Name(); + const PopCenter* pc = dynamic_cast<const PopCenter*>(it->second); + const Ship* ship = 0; + if (!pc) { + ship = dynamic_cast<const Ship*>(it->second); + if (!ship) continue; + } + const std::string& species_name = (pc ? pc->SpeciesName() : ship->SpeciesName()); + //Logger().debugStream() << "... ... PopCenter species: " << species_name; + if (species_name.empty()) + continue; + const Species* species = GetSpecies(species_name); + if (!species) { + Logger().errorStream() << "GetEffectsAndTargets couldn't get Species " << species_name; + continue; + } + StoreTargetsAndCausesOfEffectsGroups(species->Effects(), it->first, ECT_SPECIES, species_name, + all_potential_targets, targets_causes); + } + } void Universe::StoreTargetsAndCausesOfEffectsGroups(const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects_groups, |
From: <geo...@us...> - 2012-05-04 22:05:23
|
Revision: 4878 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4878&view=rev Author: geoffthemedio Date: 2012-05-04 22:05:17 +0000 (Fri, 04 May 2012) Log Message: ----------- Tweaked ApplyMeterEffectsAndUpdateMeters to execute empire meter effects when called with no parameter / executed on all objects. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-05-04 22:03:54 UTC (rev 4877) +++ trunk/FreeOrion/universe/Universe.cpp 2012-05-04 22:05:17 UTC (rev 4878) @@ -843,12 +843,27 @@ (*it)->ClampMeters(); // clamp max, target and unpaired meters to [DEFAULT_VALUE, LARGE_VALUE] and active meters with max meters to [DEFAULT_VALUE, max] } -void Universe::ApplyMeterEffectsAndUpdateMeters() -{ ApplyMeterEffectsAndUpdateMeters(m_objects.FindObjectIDs()); } +void Universe::ApplyMeterEffectsAndUpdateMeters() { + std::vector<int> object_ids = m_objects.FindObjectIDs(); + Effect::TargetsCauses targets_causes; + GetEffectsAndTargets(targets_causes, object_ids); + std::vector<UniverseObject*> objects = m_objects.FindObjects(object_ids); + + for (std::vector<UniverseObject*>::iterator it = objects.begin(); it != objects.end(); ++it) { + (*it)->ResetTargetMaxUnpairedMeters(); + (*it)->ResetPairedActiveMeters(); + } + ExecuteEffects(targets_causes, true, true, false, true); + + for (std::vector<UniverseObject*>::iterator it = objects.begin(); it != objects.end(); ++it) + (*it)->ClampMeters(); // clamp max, target and unpaired meters to [DEFAULT_VALUE, LARGE_VALUE] and active meters with max meters to [DEFAULT_VALUE, max] +} + void Universe::ApplyAppearanceEffects(const std::vector<int>& object_ids) { - // cache all activation and scoping condition results before applying Effects, since the application of - // these Effects may affect the activation and scoping evaluations + // cache all activation and scoping condition results before applying + // Effects, since the application of these Effects may affect the + // activation and scoping evaluations Effect::TargetsCauses targets_causes; GetEffectsAndTargets(targets_causes, object_ids); ExecuteEffects(targets_causes, false, false, true); |
From: <geo...@us...> - 2012-07-01 22:50:15
|
Revision: 4954 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4954&view=rev Author: geoffthemedio Date: 2012-07-01 22:50:09 +0000 (Sun, 01 Jul 2012) Log Message: ----------- minor grooming / commenting Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-07-01 21:42:42 UTC (rev 4953) +++ trunk/FreeOrion/universe/Universe.cpp 2012-07-01 22:50:09 UTC (rev 4954) @@ -1466,7 +1466,7 @@ std::map<int, std::vector<const UniverseObject*> > detectable_objects; // indexed by empire ID: objects with low enough stealth that empire could see them if in range - // for each empire + // for each empire find detector objects and potentially detectable objects for (EmpireManager::iterator empire_it = Empires().begin(); empire_it != Empires().end(); ++empire_it) { const Empire* empire = empire_it->second; int empire_id = empire_it->first; @@ -1518,13 +1518,13 @@ // even without a detector, is object detectable due to having zero stealth? if (stealth_meter->Current() <= 0) { SetEmpireObjectVisibility(m_empire_object_visibility, m_empire_known_ship_design_ids, - empire_id, object_id, VIS_BASIC_VISIBILITY); + empire_id, object_id, VIS_BASIC_VISIBILITY); } } } } - // for each empire + // for each empire test which objects are detected for (EmpireManager::iterator empire_it = Empires().begin(); empire_it != Empires().end(); ++empire_it) { int empire_id = empire_it->first; ObjectVisibilityMap& obj_vis_map = m_empire_object_visibility[empire_id]; @@ -1559,17 +1559,20 @@ SetEmpireObjectVisibility(m_empire_object_visibility, m_empire_known_ship_design_ids, empire_id, detectable_obj->ID(), VIS_PARTIAL_VISIBILITY); break; - } else if (dist2 == 0.0 && obj_vis <= VIS_NO_VISIBILITY) { - // planets always basically visible if at same location as a detector - if (universe_object_cast<const Planet*>(detectable_obj)) { - SetEmpireObjectVisibility(m_empire_object_visibility, m_empire_known_ship_design_ids, - empire_id, detectable_obj->ID(), VIS_BASIC_VISIBILITY); - // no break here. may be partially visible due to - // another detector object (although that may not be - // true if looping over detectors in order from highest - // to lowest detection range... - } } + // I suspect the following is unnecessary after changes to how visibility works.. + // No detector objects with 0 range should be included, so anything at the same + // location should already have been detected by being within range. + // + //else if (dist2 == 0.0 && obj_vis <= VIS_NO_VISIBILITY) { + // // planets always basically visible if at same location as a detector + // if (universe_object_cast<const Planet*>(detectable_obj)) { + // SetEmpireObjectVisibility(m_empire_object_visibility, m_empire_known_ship_design_ids, + // empire_id, detectable_obj->ID(), VIS_BASIC_VISIBILITY); + // // no break here. may be partially visible due to + // // another detector object + // } + //} } } } |
From: <geo...@us...> - 2012-09-09 19:49:09
|
Revision: 5218 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5218&view=rev Author: geoffthemedio Date: 2012-09-09 19:49:03 +0000 (Sun, 09 Sep 2012) Log Message: ----------- Disabled some logging when not in verbose logging mode. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-09-09 18:42:29 UTC (rev 5217) +++ trunk/FreeOrion/universe/Universe.cpp 2012-09-09 19:49:03 UTC (rev 5218) @@ -1105,11 +1105,17 @@ all_potential_targets.push_back(m_objects.Object(*it)); Logger().debugStream() << "Universe::GetEffectsAndTargets"; + if (GetOptionsDB().Get<bool>("verbose-logging")) { + Logger().debugStream() << "All objects:"; + for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) + Logger().debugStream() << "... object (" << it->first << "): " << it->second->Name(); + } + // 1) EffectsGroups from Species - Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIES"; + if (GetOptionsDB().Get<bool>("verbose-logging")) + Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIES"; for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { - Logger().debugStream() << "... object (" << it->first << "): " << it->second->Name(); const PopCenter* pc = dynamic_cast<const PopCenter*>(it->second); const Ship* ship = 0; if (!pc) { @@ -1130,7 +1136,8 @@ } // 2) EffectsGroups from Specials - Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIALS"; + if (GetOptionsDB().Get<bool>("verbose-logging")) + Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIALS"; for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { int source_object_id = it->first; const std::map<std::string, int>& specials = it->second->Specials(); @@ -1147,7 +1154,8 @@ } // 3) EffectsGroups from Techs - Logger().debugStream() << "Universe::GetEffectsAndTargets for TECHS"; + if (GetOptionsDB().Get<bool>("verbose-logging")) + Logger().debugStream() << "Universe::GetEffectsAndTargets for TECHS"; for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { const Empire* empire = it->second; int source_id = empire->CapitalID(); @@ -1182,7 +1190,8 @@ } // 4) EffectsGroups from Buildings - Logger().debugStream() << "Universe::GetEffectsAndTargets for BUILDINGS"; + if (GetOptionsDB().Get<bool>("verbose-logging")) + Logger().debugStream() << "Universe::GetEffectsAndTargets for BUILDINGS"; std::vector<Building*> buildings = m_objects.FindObjects<Building>(); for (std::vector<Building*>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { const Building* building = *building_it; @@ -1201,7 +1210,8 @@ } // 5) EffectsGroups from Ship Hull and Ship Parts - Logger().debugStream() << "Universe::GetEffectsAndTargets for SHIPS"; + if (GetOptionsDB().Get<bool>("verbose-logging")) + Logger().debugStream() << "Universe::GetEffectsAndTargets for SHIPS"; std::vector<Ship*> ships = m_objects.FindObjects<Ship>(); for (std::vector<Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { const Ship* ship = *ship_it; @@ -1239,7 +1249,8 @@ } // 6) EffectsGroups from Fields - Logger().debugStream() << "Universe::GetEffectsAndTargets for FIELDS"; + if (GetOptionsDB().Get<bool>("verbose-logging")) + Logger().debugStream() << "Universe::GetEffectsAndTargets for FIELDS"; std::vector<Field*> fields = m_objects.FindObjects<Field>(); for (std::vector<Field*>::const_iterator field_it = fields.begin(); field_it != fields.end(); ++field_it) { const Field* field = *field_it; |
From: <geo...@us...> - 2012-09-16 00:14:16
|
Revision: 5238 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5238&view=rev Author: geoffthemedio Date: 2012-09-16 00:14:10 +0000 (Sun, 16 Sep 2012) Log Message: ----------- Fixed Destroy effect for fields. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-09-15 21:32:37 UTC (rev 5237) +++ trunk/FreeOrion/universe/Universe.cpp 2012-09-16 00:14:10 UTC (rev 5238) @@ -1995,6 +1995,9 @@ } else if (universe_object_cast<Building*>(obj)) { Destroy(object_id); + + } else if (universe_object_cast<Field*>(obj)) { + Destroy(object_id); } // else ??? object is of some type unknown as of this writing. } |
From: <geo...@us...> - 2012-10-08 22:20:47
|
Revision: 5287 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5287&view=rev Author: geoffthemedio Date: 2012-10-08 22:20:41 +0000 (Mon, 08 Oct 2012) Log Message: ----------- grooming Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-10-08 22:19:40 UTC (rev 5286) +++ trunk/FreeOrion/universe/Universe.cpp 2012-10-08 22:20:41 UTC (rev 5287) @@ -135,8 +135,7 @@ void initialize_vertex(const Vertex& v, const Graph& g) {} - void discover_vertex(const Vertex& v, const Graph& g) - { + void discover_vertex(const Vertex& v, const Graph& g) { m_predecessors[static_cast<int>(v)] = m_source; if (v == m_stop) @@ -148,8 +147,7 @@ } } - void examine_vertex(const Vertex& v, const Graph& g) - { + void examine_vertex(const Vertex& v, const Graph& g) { if (v == m_marker) { if (!m_levels_remaining) throw ReachedDepthLimit(); @@ -161,11 +159,8 @@ } void examine_edge(const Edge& e, const Graph& g) {} + void tree_edge(const Edge& e, const Graph& g) {} // wait till target is calculated - void tree_edge(const Edge& e, const Graph& g) - { - // wait till target is calculated - } void non_tree_edge(const Edge& e, const Graph& g) {} void gray_target(const Edge& e, const Graph& g) {} @@ -185,7 +180,8 @@ * between the two vertices, then the list is empty and the path length * is -1.0 */ template <class Graph> - std::pair<std::list<int>, double> ShortestPathImpl(const Graph& graph, int system1_id, int system2_id, double linear_distance, const boost::unordered_map<int, int>& id_to_graph_index) + std::pair<std::list<int>, double> ShortestPathImpl(const Graph& graph, int system1_id, int system2_id, + double linear_distance, const boost::unordered_map<int, int>& id_to_graph_index) { typedef typename boost::property_map<Graph, vertex_system_id_t>::const_type ConstSystemIDPropertyMap; typedef typename boost::property_map<Graph, boost::vertex_index_t>::const_type ConstIndexPropertyMap; |
From: <geo...@us...> - 2012-10-11 21:12:07
|
Revision: 5292 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5292&view=rev Author: geoffthemedio Date: 2012-10-11 21:12:01 +0000 (Thu, 11 Oct 2012) Log Message: ----------- Tweaked Universe graph initialization to only add starlanes in one direction, to avoid duplicate lanes. May cause a crash, which I've seen once but can't replicate. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-10-09 06:48:38 UTC (rev 5291) +++ trunk/FreeOrion/universe/Universe.cpp 2012-10-11 21:12:01 UTC (rev 5292) @@ -356,6 +356,9 @@ typedef boost::property<boost::edge_weight_t, double> edge_property_t; ///< a system graph property map type // declare main graph types, including properties declared above + // could add boost::disallow_parallel_edge_tag GraphProperty but it doesn't + // work for vecS vector-based lists and parallel edges can be avoided while + // creating the graph by filtering the edges to be added typedef boost::adjacency_list<boost::vecS, boost::vecS, boost::undirectedS, vertex_property_t, edge_property_t> SystemGraph; @@ -2078,8 +2081,10 @@ for (System::const_lane_iterator it = system1->begin_lanes(); it != system1->end_lanes(); ++it) { // get id in universe of system at other end of lane const int lane_dest_id = it->first; - // skip null lanes - if (lane_dest_id == system1_id) + // skip null lanes and only add edges in one direction, to avoid + // duplicating edges ( since this is an undirected graph, A->B + // duplicates B->A ) + if (lane_dest_id >= system1_id) continue; // get m_graph_impl->system_graph index for this system |
From: <geo...@us...> - 2012-10-15 12:12:48
|
Revision: 5299 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5299&view=rev Author: geoffthemedio Date: 2012-10-15 12:12:37 +0000 (Mon, 15 Oct 2012) Log Message: ----------- Added some effects processing summarizing timing logging. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-10-15 11:59:02 UTC (rev 5298) +++ trunk/FreeOrion/universe/Universe.cpp 2012-10-15 12:12:37 UTC (rev 5299) @@ -786,6 +786,7 @@ } void Universe::ApplyAllEffectsAndUpdateMeters() { + ScopedTimer timer("Universe::ApplyAllEffectsAndUpdateMeters"); std::vector<int> object_ids = m_objects.FindObjectIDs(); // cache all activation and scoping condition results before applying @@ -815,6 +816,7 @@ } void Universe::ApplyMeterEffectsAndUpdateMeters(const std::vector<int>& object_ids) { + ScopedTimer timer("Universe::ApplyMeterEffectsAndUpdateMeters on " + boost::lexical_cast<std::string>(object_ids.size()) + " objects"); // cache all activation and scoping condition results before applying Effects, since the application of // these Effects may affect the activation and scoping evaluations Effect::TargetsCauses targets_causes; @@ -842,6 +844,8 @@ } void Universe::ApplyMeterEffectsAndUpdateMeters() { + ScopedTimer timer("Universe::ApplyMeterEffectsAndUpdateMeters on all objects"); + std::vector<int> object_ids = m_objects.FindObjectIDs(); Effect::TargetsCauses targets_causes; GetEffectsAndTargets(targets_causes, object_ids); @@ -859,6 +863,8 @@ } void Universe::ApplyAppearanceEffects(const std::vector<int>& object_ids) { + ScopedTimer timer("Universe::ApplyAppearanceEffects on " + boost::lexical_cast<std::string>(object_ids.size()) + " objects"); + // cache all activation and scoping condition results before applying // Effects, since the application of these Effects may affect the // activation and scoping evaluations @@ -983,6 +989,8 @@ } void Universe::UpdateMeterEstimatesImpl(const std::vector<int>& objects_vec) { + ScopedTimer timer("Universe::UpdateMeterEstimatesImpl on " + boost::lexical_cast<std::string>(objects_vec.size()) + " objects"); + for (std::vector<int>::const_iterator obj_it = objects_vec.begin(); obj_it != objects_vec.end(); ++obj_it) { int obj_id = *obj_it; UniverseObject* obj = m_objects.Object(obj_id); @@ -1097,6 +1105,8 @@ } void Universe::GetEffectsAndTargets(Effect::TargetsCauses& targets_causes, const std::vector<int>& target_objects) { + ScopedTimer timer("Universe::GetEffectsAndTargets"); + // transfer target objects from input vector to a set Effect::TargetSet all_potential_targets; all_potential_targets.reserve(RESERVE_SET_SIZE); @@ -1274,6 +1284,8 @@ const std::string& specific_cause_name, Effect::TargetSet& target_objects, Effect::TargetsCauses& targets_causes) { + ScopedTimer timer("Universe::StoreTargetsAndCausesOfEffectsGroups"); + if (GetOptionsDB().Get<bool>("verbose-logging")) { Logger().debugStream() << "Universe::StoreTargetsAndCausesOfEffectsGroups( , source id: " << source_object_id << ", , specific cause: " << specific_cause_name << ", , )"; } @@ -1326,6 +1338,8 @@ bool only_appearance_effects/* = false*/, bool include_empire_meter_effects/* = false*/) { + ScopedTimer timer("Universe::ExecuteEffects"); + m_marked_destroyed.clear(); m_marked_for_victory.clear(); std::map<std::string, Effect::TargetSet> executed_nonstacking_effects; |
From: <geo...@us...> - 2012-10-16 07:16:14
|
Revision: 5304 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5304&view=rev Author: geoffthemedio Date: 2012-10-16 07:16:05 +0000 (Tue, 16 Oct 2012) Log Message: ----------- More effects-processing timing debug output. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-10-16 07:15:20 UTC (rev 5303) +++ trunk/FreeOrion/universe/Universe.cpp 2012-10-16 07:16:05 UTC (rev 5304) @@ -1120,10 +1120,12 @@ Logger().debugStream() << "... object (" << it->first << "): " << it->second->Name(); } + boost::timer type_timer; // 1) EffectsGroups from Species if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIES"; + type_timer.restart(); for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { const PopCenter* pc = dynamic_cast<const PopCenter*>(it->second); const Ship* ship = 0; @@ -1143,10 +1145,12 @@ StoreTargetsAndCausesOfEffectsGroups(species->Effects(), it->first, ECT_SPECIES, species_name, all_potential_targets, targets_causes); } + double species_time = type_timer.elapsed(); // 2) EffectsGroups from Specials if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIALS"; + type_timer.restart(); for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { int source_object_id = it->first; const std::map<std::string, int>& specials = it->second->Specials(); @@ -1161,10 +1165,12 @@ all_potential_targets, targets_causes); } } + double special_time = type_timer.elapsed(); // 3) EffectsGroups from Techs if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for TECHS"; + type_timer.restart(); for (EmpireManager::const_iterator it = Empires().begin(); it != Empires().end(); ++it) { const Empire* empire = it->second; int source_id = empire->CapitalID(); @@ -1197,10 +1203,12 @@ all_potential_targets, targets_causes); } } + double tech_time = type_timer.elapsed(); // 4) EffectsGroups from Buildings if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for BUILDINGS"; + type_timer.restart(); std::vector<Building*> buildings = m_objects.FindObjects<Building>(); for (std::vector<Building*>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { const Building* building = *building_it; @@ -1217,10 +1225,12 @@ StoreTargetsAndCausesOfEffectsGroups(building_type->Effects(), building->ID(), ECT_BUILDING, building_type->Name(), all_potential_targets, targets_causes); } + double building_time = type_timer.elapsed(); // 5) EffectsGroups from Ship Hull and Ship Parts if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for SHIPS"; + type_timer.restart(); std::vector<Ship*> ships = m_objects.FindObjects<Ship>(); for (std::vector<Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { const Ship* ship = *ship_it; @@ -1256,10 +1266,12 @@ all_potential_targets, targets_causes); } } + double ships_time = type_timer.elapsed(); // 6) EffectsGroups from Fields if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for FIELDS"; + type_timer.restart(); std::vector<Field*> fields = m_objects.FindObjects<Field>(); for (std::vector<Field*>::const_iterator field_it = fields.begin(); field_it != fields.end(); ++field_it) { const Field* field = *field_it; @@ -1276,7 +1288,11 @@ StoreTargetsAndCausesOfEffectsGroups(field_type->Effects(), field->ID(), ECT_FIELD, field_type->Name(), all_potential_targets, targets_causes); } + double fields_time = type_timer.elapsed(); + Logger().debugStream() << "Type times: species: " << species_time*1000 << " specials: " << special_time*1000 + << " techs: " << tech_time*1000 << " buildings: " << building_time*1000 + << " ships: " << ships_time*1000 << " fields: " << fields_time*1000; } void Universe::StoreTargetsAndCausesOfEffectsGroups(const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects_groups, @@ -1836,7 +1852,7 @@ // detection strength, mark as visible if (special_stealth <= 0.0 || special_stealth <= detection_strength) { visible_specials.insert(special_it->first); - Logger().debugStream() << "Special " << special_it->first << " on " << obj->Name() << " is visible to empire " << empire_id; + //Logger().debugStream() << "Special " << special_it->first << " on " << obj->Name() << " is visible to empire " << empire_id; } } } |
From: <geo...@us...> - 2012-11-07 10:00:02
|
Revision: 5383 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5383&view=rev Author: geoffthemedio Date: 2012-11-07 09:59:50 +0000 (Wed, 07 Nov 2012) Log Message: ----------- Fixed issue with doubly-applied empire meter modifications. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-11-06 04:48:16 UTC (rev 5382) +++ trunk/FreeOrion/universe/Universe.cpp 2012-11-07 09:59:50 UTC (rev 5383) @@ -834,6 +834,8 @@ (*it)->ResetTargetMaxUnpairedMeters(); (*it)->ResetPairedActiveMeters(); } + for (EmpireManager::iterator it = Empires().begin(); it != Empires().end(); ++it) + it->second->ResetMeters(); ExecuteEffects(targets_causes, true, true, false, true); for (std::vector<UniverseObject*>::iterator it = objects.begin(); it != objects.end(); ++it) |
From: <geo...@us...> - 2012-11-18 08:47:49
|
Revision: 5428 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5428&view=rev Author: geoffthemedio Date: 2012-11-18 08:47:42 +0000 (Sun, 18 Nov 2012) Log Message: ----------- Removed serialization of empire latest known objects when sending turn updates. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-11-18 08:45:57 UTC (rev 5427) +++ trunk/FreeOrion/universe/Universe.cpp 2012-11-18 08:47:42 UTC (rev 5428) @@ -2268,26 +2268,6 @@ } return; } - - // copy just encoding_empire's known objects - EmpireObjectMap::const_iterator it = m_empire_latest_known_objects.find(encoding_empire); - if (it != m_empire_latest_known_objects.end()) { - const ObjectMap& map = it->second; - - //Logger().debugStream() << "empire " << encoding_empire << " latest known map initial: "; - //for (ObjectMap::const_iterator oit = map.const_begin(); oit != map.const_end(); ++oit) - // Logger().debugStream() << oit->second->TypeName() << "(" << oit->second->ID() << ")"; - - empire_latest_known_objects[encoding_empire].Copy(map, ALL_EMPIRES); - - //Logger().debugStream() << "empire " << encoding_empire << " latest known map after copying: "; - //for (ObjectMap::const_iterator oit = map.const_begin(); oit != map.const_end(); ++oit) - // Logger().debugStream() << oit->second->TypeName() << "(" << oit->second->ID() << ")"; - - //Logger().debugStream() << "empire_latest_known_objects[" << encoding_empire << "] after copying: "; - //for (ObjectMap::const_iterator oit = empire_latest_known_objects[encoding_empire].const_begin(); oit != empire_latest_known_objects[encoding_empire].const_end(); ++oit) - // Logger().debugStream() << oit->second->TypeName() << "(" << oit->second->ID() << ")"; - } } void Universe::GetEmpireObjectVisibilityMap(EmpireObjectVisibilityMap& empire_object_visibility, int encoding_empire) const { |
From: <geo...@us...> - 2012-12-02 23:17:19
|
Revision: 5504 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5504&view=rev Author: geoffthemedio Date: 2012-12-02 23:17:13 +0000 (Sun, 02 Dec 2012) Log Message: ----------- Removed some commented-out old code. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-12-02 23:16:33 UTC (rev 5503) +++ trunk/FreeOrion/universe/Universe.cpp 2012-12-02 23:17:13 UTC (rev 5504) @@ -1621,19 +1621,6 @@ empire_id, detectable_obj->ID(), VIS_PARTIAL_VISIBILITY); break; } - // I suspect the following is unnecessary after changes to how visibility works.. - // No detector objects with 0 range should be included, so anything at the same - // location should already have been detected by being within range. - // - //else if (dist2 == 0.0 && obj_vis <= VIS_NO_VISIBILITY) { - // // planets always basically visible if at same location as a detector - // if (detectable_obj->ObjectType() == OBJ_PLANET)) { - // SetEmpireObjectVisibility(m_empire_object_visibility, m_empire_known_ship_design_ids, - // empire_id, detectable_obj->ID(), VIS_BASIC_VISIBILITY); - // // no break here. may be partially visible due to - // // another detector object - // } - //} } } } |
From: <geo...@us...> - 2012-12-17 07:17:42
|
Revision: 5550 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5550&view=rev Author: geoffthemedio Date: 2012-12-17 07:17:36 +0000 (Mon, 17 Dec 2012) Log Message: ----------- Attempt to fix compile error related to use of nonstandard overload of set::erase. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-12-17 07:16:01 UTC (rev 5549) +++ trunk/FreeOrion/universe/Universe.cpp 2012-12-17 07:17:36 UTC (rev 5550) @@ -2149,7 +2149,9 @@ if (vis_map.find(object_id) != vis_map.end() || destroyed_set.find(object_id) != destroyed_set.end()) { - stale_it = stale_set.erase(stale_it); + std::set<int>::iterator temp = stale_it; ++temp; + stale_set.erase(stale_it); + stale_it = temp; } else { ++stale_it; } |
From: <geo...@us...> - 2012-12-21 22:46:07
|
Revision: 5567 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5567&view=rev Author: geoffthemedio Date: 2012-12-21 22:45:59 +0000 (Fri, 21 Dec 2012) Log Message: ----------- Mostly untested addition of step to visibility update to make planets basically visible to any empire that has any owned object in the same system. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-12-21 22:12:45 UTC (rev 5566) +++ trunk/FreeOrion/universe/Universe.cpp 2012-12-21 22:45:59 UTC (rev 5567) @@ -1753,6 +1753,42 @@ } } + void SetSameSystemPlanetsVisible(const ObjectMap& objects) { + Universe& universe = GetUniverse(); + // map from empire ID to ID of systems where those empires own at least one object + std::map<int, std::set<int> > empires_systems_with_owned_objects; + // get systems where empires have owned objects + for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { + const UniverseObject* obj = it->second; + if (obj->Unowned() || obj->SystemID() == INVALID_OBJECT_ID) + continue; + empires_systems_with_owned_objects[obj->Owner()].insert(obj->SystemID()); + } + // check each planet to see which empires have owned objects in system + for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { + const UniverseObject* obj = it->second; + if (obj->ObjectType() != OBJ_PLANET) + continue; + int obj_system_id = obj->SystemID(); + if (obj_system_id == INVALID_OBJECT_ID) + continue; + int object_id = it->first; + for (std::map<int, std::set<int> >::const_iterator + emp_it = empires_systems_with_owned_objects.begin(); + emp_it != empires_systems_with_owned_objects.end(); + ++emp_it) + { + int empire_id = emp_it->first; + const std::set<int>& empire_systems = emp_it->second; + if (empire_systems.find(obj_system_id) == empire_systems.end()) + continue; + // ensure planets are at least basicaly visible. does not + // overwrite higher visibility levels + universe.SetEmpireObjectVisibility(empire_id, object_id, VIS_BASIC_VISIBILITY); + } + } + } + void PropegateVisibilityToContainerObjects(const ObjectMap& objects, Universe::EmpireObjectVisibilityMap& empire_object_visibility) { @@ -2038,6 +2074,8 @@ SetEmpireObjectVisibilitiesFromRanges(empire_position_detection_ranges, empire_position_potentially_detectable_objects); + SetSameSystemPlanetsVisible(Objects()); + PropegateVisibilityToContainerObjects(Objects(), m_empire_object_visibility); PropegateVisibilityToSystemsAlongStarlanes(Objects(), m_empire_object_visibility); |
From: <geo...@us...> - 2012-12-28 17:24:38
|
Revision: 5582 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5582&view=rev Author: geoffthemedio Date: 2012-12-28 17:24:31 +0000 (Fri, 28 Dec 2012) Log Message: ----------- Separated ship and planet timing of getting target sets for effectsgroups. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2012-12-28 14:18:04 UTC (rev 5581) +++ trunk/FreeOrion/universe/Universe.cpp 2012-12-28 17:24:31 UTC (rev 5582) @@ -1111,19 +1111,31 @@ if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for SPECIES"; type_timer.restart(); - for (ObjectMap::const_iterator it = m_objects.const_begin(); it != m_objects.const_end(); ++it) { - const PopCenter* pc = 0; - if (it->second->ObjectType() == OBJ_PLANET) // TODO: handle non-planet popcenters if added in future - pc = dynamic_cast<const PopCenter*>(it->second); - const Ship* ship = 0; - if (!pc && it->second->ObjectType() == OBJ_SHIP) { - ship = dynamic_cast<const Ship*>(it->second); - if (!ship) continue; + std::vector<Planet*> planets = m_objects.FindObjects<Planet>(); + for (std::vector<Planet*>::const_iterator planet_it = planets.begin(); + planet_it != planets.end(); ++planet_it) + { + const Planet* planet = *planet_it; + const std::string& species_name = planet->SpeciesName(); + if (species_name.empty()) + continue; + const Species* species = GetSpecies(species_name); + if (!species) { + Logger().errorStream() << "GetEffectsAndTargets couldn't get Species " << species_name; + continue; } - if (!pc && !ship) - continue; - const std::string& species_name = (pc ? pc->SpeciesName() : ship->SpeciesName()); - //Logger().debugStream() << "... ... PopCenter species: " << species_name; + StoreTargetsAndCausesOfEffectsGroups(species->Effects(), planet->ID(), ECT_SPECIES, species_name, + all_potential_targets, targets_causes); + } + double planet_species_time = type_timer.elapsed(); + type_timer.restart(); + + std::vector<Ship*> ships = m_objects.FindObjects<Ship>(); + for (std::vector<Ship*>::const_iterator ship_it = ships.begin(); + ship_it != ships.end(); ++ship_it) + { + const Ship* ship = *ship_it; + const std::string& species_name = ship->SpeciesName(); if (species_name.empty()) continue; const Species* species = GetSpecies(species_name); @@ -1131,10 +1143,11 @@ Logger().errorStream() << "GetEffectsAndTargets couldn't get Species " << species_name; continue; } - StoreTargetsAndCausesOfEffectsGroups(species->Effects(), it->first, ECT_SPECIES, species_name, + StoreTargetsAndCausesOfEffectsGroups(species->Effects(), ship->ID(), ECT_SPECIES, species_name, all_potential_targets, targets_causes); } - double species_time = type_timer.elapsed(); + double ship_species_time = type_timer.elapsed(); + type_timer.restart(); // 2) EffectsGroups from Specials if (GetOptionsDB().Get<bool>("verbose-logging")) @@ -1199,7 +1212,9 @@ Logger().debugStream() << "Universe::GetEffectsAndTargets for BUILDINGS"; type_timer.restart(); std::vector<Building*> buildings = m_objects.FindObjects<Building>(); - for (std::vector<Building*>::const_iterator building_it = buildings.begin(); building_it != buildings.end(); ++building_it) { + for (std::vector<Building*>::const_iterator building_it = buildings.begin(); + building_it != buildings.end(); ++building_it) + { const Building* building = *building_it; if (!building) { Logger().errorStream() << "GetEffectsAndTargets couldn't get Building"; @@ -1220,7 +1235,7 @@ if (GetOptionsDB().Get<bool>("verbose-logging")) Logger().debugStream() << "Universe::GetEffectsAndTargets for SHIPS hulls and parts"; type_timer.restart(); - std::vector<Ship*> ships = m_objects.FindObjects<Ship>(); + ships = m_objects.FindObjects<Ship>(); for (std::vector<Ship*>::const_iterator ship_it = ships.begin(); ship_it != ships.end(); ++ship_it) { const Ship* ship = *ship_it; if (!ship) { @@ -1279,9 +1294,13 @@ } double fields_time = type_timer.elapsed(); - Logger().debugStream() << "Type times: species: " << species_time*1000 << " specials: " << special_time*1000 - << " techs: " << tech_time*1000 << " buildings: " << building_time*1000 - << " ships: " << ships_time*1000 << " fields: " << fields_time*1000; + Logger().debugStream() << "Type times: planet species: " << planet_species_time*1000 + << " ship species: " << ship_species_time*1000 + << " specials: " << special_time*1000 + << " techs: " << tech_time*1000 + << " buildings: " << building_time*1000 + << " hulls/parts: " << ships_time*1000 + << " fields: " << fields_time*1000; } void Universe::StoreTargetsAndCausesOfEffectsGroups(const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects_groups, @@ -1297,7 +1316,9 @@ // attempt to locate source object in target objects UniverseObject* source = 0; - for (Effect::TargetSet::const_iterator it = target_objects.begin(); it != target_objects.end(); ++it) { + for (Effect::TargetSet::const_iterator it = target_objects.begin(); + it != target_objects.end(); ++it) + { if ((*it)->ID() == source_object_id && source_object_id != INVALID_OBJECT_ID) { source = *it; break; |
From: <geo...@us...> - 2013-01-10 09:21:48
|
Revision: 5625 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5625&view=rev Author: geoffthemedio Date: 2013-01-10 09:21:42 +0000 (Thu, 10 Jan 2013) Log Message: ----------- Modified visibility code so systems where an empire owns an object are always partially visible. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-01-09 09:31:49 UTC (rev 5624) +++ trunk/FreeOrion/universe/Universe.cpp 2013-01-10 09:21:42 UTC (rev 5625) @@ -1775,6 +1775,8 @@ } } + /** sets planets in system where an empire owns an object to be basically + * visible, and those systems to be partially visible */ void SetSameSystemPlanetsVisible(const ObjectMap& objects) { Universe& universe = GetUniverse(); // map from empire ID to ID of systems where those empires own at least one object @@ -1786,15 +1788,28 @@ continue; empires_systems_with_owned_objects[obj->Owner()].insert(obj->SystemID()); } - // check each planet to see which empires have owned objects in system - for (ObjectMap::const_iterator it = objects.const_begin(); it != objects.const_end(); ++it) { - const UniverseObject* obj = it->second; - if (obj->ObjectType() != OBJ_PLANET) + + // set system visibility + for (std::map<int, std::set<int> >::const_iterator it = empires_systems_with_owned_objects.begin(); + it != empires_systems_with_owned_objects.end(); ++it) + { + int empire_id = it->first; + const std::set<int>& system_ids = it->second; + for (std::set<int>::const_iterator sys_it = system_ids.begin(); + sys_it != system_ids.end(); ++sys_it) + { universe.SetEmpireObjectVisibility(empire_id, *sys_it, VIS_PARTIAL_VISIBILITY); } + } + + // get planets, check their locations... + const ObjectMap& objects = Objects(); + std::vector<const Planet*> planets = objects.FindObjects<Planet>(); + for (std::vector<const Planet*>::iterator it = planets.begin(); it != planets.end(); ++it) { + const Planet* planet = *it; + int system_id = planet->SystemID(); + if (system_id == INVALID_OBJECT_ID) continue; - int obj_system_id = obj->SystemID(); - if (obj_system_id == INVALID_OBJECT_ID) - continue; - int object_id = it->first; + + int planet_id = planet->ID(); for (std::map<int, std::set<int> >::const_iterator emp_it = empires_systems_with_owned_objects.begin(); emp_it != empires_systems_with_owned_objects.end(); @@ -1802,11 +1817,11 @@ { int empire_id = emp_it->first; const std::set<int>& empire_systems = emp_it->second; - if (empire_systems.find(obj_system_id) == empire_systems.end()) + if (empire_systems.find(system_id) == empire_systems.end()) continue; // ensure planets are at least basicaly visible. does not // overwrite higher visibility levels - universe.SetEmpireObjectVisibility(empire_id, object_id, VIS_BASIC_VISIBILITY); + universe.SetEmpireObjectVisibility(empire_id, planet_id, VIS_BASIC_VISIBILITY); } } } |
From: <geo...@us...> - 2013-01-10 21:31:18
|
Revision: 5628 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5628&view=rev Author: geoffthemedio Date: 2013-01-10 21:31:10 +0000 (Thu, 10 Jan 2013) Log Message: ----------- Fixed GCC compile error. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-01-10 17:21:29 UTC (rev 5627) +++ trunk/FreeOrion/universe/Universe.cpp 2013-01-10 21:31:10 UTC (rev 5628) @@ -1801,7 +1801,6 @@ } // get planets, check their locations... - const ObjectMap& objects = Objects(); std::vector<const Planet*> planets = objects.FindObjects<Planet>(); for (std::vector<const Planet*>::iterator it = planets.begin(); it != planets.end(); ++it) { const Planet* planet = *it; @@ -1829,8 +1828,6 @@ void PropegateVisibilityToContainerObjects(const ObjectMap& objects, Universe::EmpireObjectVisibilityMap& empire_object_visibility) { - Universe& universe = GetUniverse(); - // propegate visibility from contained to container objects for (ObjectMap::const_iterator container_object_it = objects.const_begin(); container_object_it != objects.const_end(); ++container_object_it) |
From: <geo...@us...> - 2013-02-03 13:40:40
|
Revision: 5703 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5703&view=rev Author: geoffthemedio Date: 2013-02-03 13:40:33 +0000 (Sun, 03 Feb 2013) Log Message: ----------- Limited Universe::UpdateMeterEstimatesImpl verbose logging to only dump the updated objects. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-02-02 21:43:34 UTC (rev 5702) +++ trunk/FreeOrion/universe/Universe.cpp 2013-02-03 13:40:33 UTC (rev 5703) @@ -1013,8 +1013,11 @@ } if (GetOptionsDB().Get<bool>("verbose-logging")) { - Logger().debugStream() << "UpdateMeterEstimatesImpl after resetting meters"; - Logger().debugStream() << m_objects.Dump(); + Logger().debugStream() << "UpdateMeterEstimatesImpl after resetting meters objects:"; + for (std::vector<int>::const_iterator it = objects_vec.begin(); it != objects_vec.end(); ++it) { + if (const UniverseObject* obj = GetUniverseObject(*it)) + Logger().debugStream() << obj->Dump(); + } } // cache all activation and scoping condition results before applying Effects, since the application of @@ -1026,8 +1029,11 @@ ExecuteEffects(targets_causes, true, true, false, false); if (GetOptionsDB().Get<bool>("verbose-logging")) { - Logger().debugStream() << "UpdateMeterEstimatesImpl after executing effects"; - Logger().debugStream() << m_objects.Dump(); + Logger().debugStream() << "UpdateMeterEstimatesImpl after executing effects objects:"; + for (std::vector<int>::const_iterator it = objects_vec.begin(); it != objects_vec.end(); ++it) { + if (const UniverseObject* obj = GetUniverseObject(*it)) + Logger().debugStream() << obj->Dump(); + } } // Apply known discrepancies between expected and calculated meter maxes at start of turn. This @@ -1079,8 +1085,11 @@ } if (GetOptionsDB().Get<bool>("verbose-logging")) { - Logger().debugStream() << "UpdateMeterEstimatesImpl after discrepancies and clamping"; - Logger().debugStream() << m_objects.Dump(); + Logger().debugStream() << "UpdateMeterEstimatesImpl after discrepancies and clamping objects:"; + for (std::vector<int>::const_iterator it = objects_vec.begin(); it != objects_vec.end(); ++it) { + if (const UniverseObject* obj = GetUniverseObject(*it)) + Logger().debugStream() << obj->Dump(); + } } } |
From: <geo...@us...> - 2013-02-05 11:43:57
|
Revision: 5712 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5712&view=rev Author: geoffthemedio Date: 2013-02-05 10:43:06 +0000 (Tue, 05 Feb 2013) Log Message: ----------- Early aborts for meter updating functions when there are no target objects. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-02-05 09:17:37 UTC (rev 5711) +++ trunk/FreeOrion/universe/Universe.cpp 2013-02-05 10:43:06 UTC (rev 5712) @@ -988,6 +988,8 @@ void Universe::UpdateMeterEstimatesImpl(const std::vector<int>& objects_vec) { ScopedTimer timer("Universe::UpdateMeterEstimatesImpl on " + boost::lexical_cast<std::string>(objects_vec.size()) + " objects", true); + if (objects_vec.empty()) + return; for (std::vector<int>::const_iterator obj_it = objects_vec.begin(); obj_it != objects_vec.end(); ++obj_it) { int obj_id = *obj_it; @@ -1113,6 +1115,8 @@ void Universe::GetEffectsAndTargets(Effect::TargetsCauses& targets_causes, const std::vector<int>& target_objects) { ScopedTimer timer("Universe::GetEffectsAndTargets"); + if (target_objects.empty()) + return; // transfer target objects from input vector to a set Effect::TargetSet all_potential_targets; |
From: <geo...@us...> - 2013-02-25 01:16:00
|
Revision: 5804 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5804&view=rev Author: geoffthemedio Date: 2013-02-25 01:15:48 +0000 (Mon, 25 Feb 2013) Log Message: ----------- -Implemented Universe::RecursiveDestroy for systems, and reworked slightly for planets and fleets that can contain other objects. -Added safety check to SetEmpireSpecialVisibilities for the case of an object that has a visibility entry but has been destroyed. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-02-25 01:14:10 UTC (rev 5803) +++ trunk/FreeOrion/universe/Universe.cpp 2013-02-25 01:15:48 UTC (rev 5804) @@ -2073,6 +2073,8 @@ int object_id = obj_it->first; const UniverseObject* obj = objects.Object(object_id); + if (!obj) + continue; const std::map<std::string, int>& all_object_specials = obj->Specials(); if (all_object_specials.empty()) continue; @@ -2433,17 +2435,25 @@ Destroy(fleet->ID()); } else if (Fleet* fleet = universe_object_cast<Fleet*>(obj)) { - for (Fleet::iterator it = fleet->begin(); it != fleet->end(); ++it) - Destroy(*it); + std::set<int> fleet_ships = fleet->ShipIDs(); // copy, so destroying ships can't change the initial list / invalidate iterators, etc. + for (std::set<int>::const_iterator it = fleet_ships.begin(); + it != fleet_ships.end(); ++it) + { Destroy(*it); } Destroy(object_id); } else if (Planet* planet = universe_object_cast<Planet*>(obj)) { - for (std::set<int>::const_iterator it = planet->Buildings().begin(); it != planet->Buildings().end(); ++it) - Destroy(*it); + std::set<int> planet_buildings = planet->Buildings(); // copy, so destroying buildings can't change the initial list / invalidate iterators, etc. + for (std::set<int>::const_iterator it = planet_buildings.begin(); + it != planet_buildings.end(); ++it) + { Destroy(*it); } Destroy(object_id); - } else if (obj->ObjectType() == OBJ_SYSTEM) { - // unsupported: do nothing + } else if (System* system = universe_object_cast<System*>(obj)) { + std::vector<int> system_objs = system->FindObjectIDs(); + for (std::vector<int>::const_iterator it = system_objs.begin(); + it != system_objs.end(); ++it) + { Destroy(*it); } + Destroy(object_id); } else if (obj->ObjectType() == OBJ_BUILDING) { Destroy(object_id); |
From: <geo...@us...> - 2013-03-10 03:22:11
|
Revision: 5850 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5850&view=rev Author: geoffthemedio Date: 2013-03-10 03:22:04 +0000 (Sun, 10 Mar 2013) Log Message: ----------- Experimental caching results of condition evaluation when getting effect target sets. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-03-10 03:08:53 UTC (rev 5849) +++ trunk/FreeOrion/universe/Universe.cpp 2013-03-10 03:22:04 UTC (rev 5850) @@ -1108,7 +1108,9 @@ GetEffectsAndTargets(targets_causes, all_objects); } -void Universe::GetEffectsAndTargets(Effect::TargetsCauses& targets_causes, const std::vector<int>& target_objects) { +void Universe::GetEffectsAndTargets(Effect::TargetsCauses& targets_causes, + const std::vector<int>& target_objects) +{ ScopedTimer timer("Universe::GetEffectsAndTargets"); if (target_objects.empty()) return; @@ -1328,6 +1330,47 @@ << " fields: " << fields_time*1000; } +namespace { + Effect::TargetSet& GetConditionMatches(const Condition::ConditionBase* cond, + std::map<const Condition::ConditionBase*, Effect::TargetSet>& + cached_condition_matches, + const UniverseObject* source, + const ScriptingContext& source_context, + Effect::TargetSet& target_objects) + { + if (!cond) + return cached_condition_matches[0]; // empty TargetSet + + for (std::map<const Condition::ConditionBase*, Effect::TargetSet>::iterator + it = cached_condition_matches.begin(); it != cached_condition_matches.end(); ++it) + { + if (*cond == *(it->first)) { + //Logger().debugStream() << "Reused target set!"; + return it->second; + } + } + + // no cached result. calculate it... + + // set up storage in cache and to return + Effect::TargetSet& target_set = cached_condition_matches[cond]; + Condition::ObjectSet& matched_target_objects = + *static_cast<Condition::ObjectSet *>(static_cast<void *>(&target_set)); + Condition::ObjectSet& potential_target_objects = + *static_cast<Condition::ObjectSet *>(static_cast<void *>(&target_objects)); + + // move matches from candidates in target_objects into target_set + cond->Eval(source_context, matched_target_objects, potential_target_objects); + // restore target_objects by copying objects back from targets to target_objects + // this should be cheaper than doing a full copy because target_set is usually small + target_objects.insert(target_objects.end(), target_set.begin(), target_set.end()); + + //Logger().debugStream() << "Generated new target set!"; + + return target_set; + } +} + void Universe::StoreTargetsAndCausesOfEffectsGroups(const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& effects_groups, int source_object_id, EffectsCauseType effect_cause_type, const std::string& specific_cause_name, @@ -1339,45 +1382,33 @@ Logger().debugStream() << "Universe::StoreTargetsAndCausesOfEffectsGroups( , source id: " << source_object_id << ", , specific cause: " << specific_cause_name << ", , )"; } - // attempt to locate source object in target objects - UniverseObject* source = 0; - for (Effect::TargetSet::const_iterator it = target_objects.begin(); - it != target_objects.end(); ++it) - { - if ((*it)->ID() == source_object_id && source_object_id != INVALID_OBJECT_ID) { - source = *it; - break; - } - } + std::map<const Condition::ConditionBase*, Effect::TargetSet> cached_condition_matches; + const UniverseObject* source = GetUniverseObject(source_object_id); + ScriptingContext source_context(source); + + // process all effects groups in set provided int eg_count = 1; std::vector<boost::shared_ptr<const Effect::EffectsGroup> >::const_iterator effects_it; for (effects_it = effects_groups.begin(); effects_it != effects_groups.end(); ++effects_it) { ScopedTimer update_timer("... Universe::StoreTargetsAndCausesOfEffectsGroups done processing source " + boost::lexical_cast<std::string>(source_object_id) + " cause: " + specific_cause_name + " effects group " + boost::lexical_cast<std::string>(eg_count++)); - // create non_targets and targets sets for current effects group - Effect::TargetSet target_set; // initially empty - - // get effects group to process for this iteration boost::shared_ptr<const Effect::EffectsGroup> effects_group = *effects_it; - bool scope_is_source = effects_group->ScopeIsSource(); - if (scope_is_source) { - if (source) { - const Condition::ConditionBase* activation = effects_group->Activation(); - if (!activation || activation->Eval(ScriptingContext(source), source)) - target_set.push_back(source); - } - } else { - ScopedTimer update_timer2("... ... Universe::StoreTargetsAndCausesOfEffectsGroups get target set"); - // get set of target objects for this effects group from potential targets specified - target_set.reserve(target_objects.size()); - effects_group->GetTargetSet(source_object_id, target_set, target_objects); // transfers objects from target_objects to target_set if they meet the condition - } + // skip inactive effects groups + const Condition::ConditionBase* activation = effects_group->Activation(); + if (activation && !activation->Eval(source_context, source)) + continue; - // abort if no targets + // get objects matched by scope + const Condition::ConditionBase* scope = effects_group->Scope(); + if (!scope) + continue; + Effect::TargetSet& target_set = GetConditionMatches(scope, cached_condition_matches, + source, source_context, + target_objects); if (target_set.empty()) continue; @@ -1385,19 +1416,14 @@ Effect::SourcedEffectsGroup sourced_effects_group(source_object_id, effects_group); // combine cause type and specific cause into effect cause - Effect::EffectCause effect_cause(effect_cause_type, specific_cause_name, effects_group->AccountingLabel()); + Effect::EffectCause effect_cause(effect_cause_type, specific_cause_name, + effects_group->AccountingLabel()); // combine target set and effect cause Effect::TargetsAndCause target_and_cause(target_set, effect_cause); // store effect cause and targets info in map, indexed by sourced effects group targets_causes.push_back(std::make_pair(sourced_effects_group, target_and_cause)); - - if (!scope_is_source) { - // restore target_objects by copying objects back from targets to target_objects - // this should be cheaper than doing a full copy because target_set is usually small - target_objects.insert(target_objects.end(), target_set.begin(), target_set.end()); - } } } |
From: <geo...@us...> - 2013-03-21 04:32:17
|
Revision: 5888 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5888&view=rev Author: geoffthemedio Date: 2013-03-21 04:32:11 +0000 (Thu, 21 Mar 2013) Log Message: ----------- Hopefully fixed issue where a source object wasn't being found for some empires' tech effects, leading to log file error messages about being unable to resolve references, typically arising from Source.Owner value references in script. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-03-21 01:22:55 UTC (rev 5887) +++ trunk/FreeOrion/universe/Universe.cpp 2013-03-21 04:32:11 UTC (rev 5888) @@ -1240,14 +1240,16 @@ { // find alternate object owned by this empire to act as source // first try to get a planet - std::vector<int> empire_planets = m_objects.FindObjectIDs(OwnedVisitor<Planet>(empire->EmpireID())); + std::vector<UniverseObject*> empire_planets = m_objects.FindObjects(OwnedVisitor<Planet>(empire->EmpireID())); if (!empire_planets.empty()) { - source_id = *empire_planets.begin(); + source = *empire_planets.begin(); + source_id = source->ID(); } else { // if no planet, use any owned object - std::vector<int> empire_objects = m_objects.FindObjectIDs(OwnedVisitor<UniverseObject>(empire->EmpireID())); + std::vector<UniverseObject*> empire_objects = m_objects.FindObjects(OwnedVisitor<UniverseObject>(empire->EmpireID())); if (!empire_objects.empty()) { - source_id = *empire_objects.begin(); + source = *empire_objects.begin(); + source_id = source->ID(); } else { continue; // can't do techs for this empire } @@ -1256,7 +1258,10 @@ for (Empire::TechItr tech_it = empire->TechBegin(); tech_it != empire->TechEnd(); ++tech_it) { const Tech* tech = GetTech(*tech_it); if (!tech) continue; - + if (!source) { + Logger().errorStream() << "somehow to to storing targets and causes of tech effectsgroup without a source...?"; + break; + } StoreTargetsAndCausesOfEffectsGroups(tech->Effects(), source, ECT_TECH, tech->Name(), all_potential_targets, targets_causes, cached_source_condition_matches[source_id], |
From: <dil...@us...> - 2013-04-11 08:46:00
|
Revision: 5977 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=5977&view=rev Author: dilvish-fo Date: 2013-04-11 08:45:53 +0000 (Thu, 11 Apr 2013) Log Message: ----------- modified Universe::InsertID so that it updates m_last_allocated_object_id, in order to avoid client-side object ID conflicts. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2013-04-11 04:28:34 UTC (rev 5976) +++ trunk/FreeOrion/universe/Universe.cpp 2013-04-11 08:45:53 UTC (rev 5977) @@ -758,6 +758,8 @@ obj->SetID(id); m_objects.Insert(obj); + if ( id > m_last_allocated_object_id ) + m_last_allocated_object_id=id; return true; } |