From: <tz...@us...> - 2006-02-03 22:50:08
|
Revision: 1725 Author: tzlaine Date: 2006-02-03 14:49:44 -0800 (Fri, 03 Feb 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1725&view=rev Log Message: ----------- Removed the hack required to get Condition.cpp and ResourceCenter.cpp to compile with previous versions of MSVC, since it breaks the build when using the latest version. Modified Paths: -------------- trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/ResourceCenter.cpp Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2006-02-03 04:57:39 UTC (rev 1724) +++ trunk/FreeOrion/universe/Condition.cpp 2006-02-03 22:49:44 UTC (rev 1725) @@ -13,14 +13,6 @@ using boost::lexical_cast; using boost::format; -#if defined(WIN32) && defined(_MSC_VER) -#ifdef _DEBUG -// Fix for evil M$ compile bug: fatal error C1055: compiler limit : out of keys -#undef assert -#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, -1), 0) ) -#endif -#endif - namespace { Condition::ConditionBase* NewAll(const XMLElement& elem) {return new Condition::All(elem);} Condition::ConditionBase* NewEmpireAffiliation(const XMLElement& elem) {return new Condition::EmpireAffiliation(elem);} Modified: trunk/FreeOrion/universe/ResourceCenter.cpp =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.cpp 2006-02-03 04:57:39 UTC (rev 1724) +++ trunk/FreeOrion/universe/ResourceCenter.cpp 2006-02-03 22:49:44 UTC (rev 1725) @@ -18,14 +18,6 @@ using boost::lexical_cast; -#if defined(WIN32) && defined(_MSC_VER) -#ifdef _DEBUG -// Fix for evil M$ compile bug: fatal error C1055: compiler limit : out of keys -#undef assert -#define assert(exp) (void)( (exp) || (_assert(#exp, __FILE__, -1), 0) ) -#endif -#endif - namespace { DataTableMap& ProductionDataTables() { |
From: <tz...@us...> - 2006-05-28 23:41:35
|
Revision: 1833 Author: tzlaine Date: 2006-05-28 16:41:32 -0700 (Sun, 28 May 2006) ViewCVS: http://svn.sourceforge.net/freeorion?rev=1833&view=rev Log Message: ----------- Added a StaticCast subclass of ValueRef::Variable that allows the type of a Variable to be cast to another type. Also added logic to the ValueRefParser to introduce such a cast into the Variable<double> parser, allowing Variable<int>s to be used therein. Modified Paths: -------------- trunk/FreeOrion/universe/ValueRef.h trunk/FreeOrion/universe/ValueRefParser.cpp Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2006-05-28 21:29:19 UTC (rev 1832) +++ trunk/FreeOrion/universe/ValueRef.h 2006-05-28 23:41:32 UTC (rev 1833) @@ -26,6 +26,7 @@ template <class T> struct ValueRefBase; template <class T> struct Constant; template <class T> struct Variable; + template <class FromType, class ToType> struct StaticCast; template <class T> struct Operation; enum OpType { PLUS, @@ -63,7 +64,7 @@ T m_value; }; -/** the variable value leaf ValueRef class. The value returned by this node is taken from either the \a source or \a target parameters to Eval. */ +/** the variable value ValueRef class. The value returned by this node is taken from either the \a source or \a target parameters to Eval. */ template <class T> struct ValueRef::Variable : public ValueRef::ValueRefBase<T> { @@ -78,11 +79,29 @@ virtual std::string Description() const; virtual std::string Dump() const; +protected: + Variable(bool source_ref, const std::vector<std::string>& property_name); + private: bool m_source_ref; std::vector<std::string> m_property_name; }; +/** the variable static_cast class. The value returned by this node is taken from the ctor \a value_ref parameter's FromType value, + static_cast to ToType. */ +template <class FromType, class ToType> +struct ValueRef::StaticCast : public ValueRef::Variable<ToType> +{ + StaticCast(const ValueRef::Variable<FromType>* value_ref); + + virtual double Eval(const UniverseObject* source, const UniverseObject* target) const; + virtual std::string Description() const; + virtual std::string Dump() const; + +private: + const ValueRefBase<FromType>* m_value_ref; +}; + /** an arithmetic operation node ValueRef class. One of addition, subtraction, mutiplication, division, or unary negation is performed on the child(ren) of this node, and the result is returned. */ template <class T> @@ -181,6 +200,12 @@ {} template <class T> +ValueRef::Variable<T>::Variable(bool source_ref, const std::vector<std::string>& property_name) : + m_source_ref(source_ref), + m_property_name(property_name) +{} + +template <class T> bool ValueRef::Variable<T>::SourceRef() const { return m_source_ref; @@ -243,6 +268,33 @@ } /////////////////////////////////////////////////////////// +// StaticCast // +/////////////////////////////////////////////////////////// +template <class FromType, class ToType> +ValueRef::StaticCast<FromType, ToType>::StaticCast(const ValueRef::Variable<FromType>* value_ref) : + ValueRef::Variable<ToType>(value_ref->SourceRef(), value_ref->PropertyName()), + m_value_ref(value_ref) +{} + +template <class FromType, class ToType> +double ValueRef::StaticCast<FromType, ToType>::Eval(const UniverseObject* source, const UniverseObject* target) const +{ + return static_cast<ToType>(m_value_ref->Eval(source, target)); +} + +template <class FromType, class ToType> +std::string ValueRef::StaticCast<FromType, ToType>::Description() const +{ + return m_value_ref->Description(); +} + +template <class FromType, class ToType> +std::string ValueRef::StaticCast<FromType, ToType>::Dump() const +{ + return m_value_ref->Dump(); +} + +/////////////////////////////////////////////////////////// // Operation // /////////////////////////////////////////////////////////// template <class T> Modified: trunk/FreeOrion/universe/ValueRefParser.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRefParser.cpp 2006-05-28 21:29:19 UTC (rev 1832) +++ trunk/FreeOrion/universe/ValueRefParser.cpp 2006-05-28 23:41:32 UTC (rev 1833) @@ -24,6 +24,7 @@ typedef ValueRef::ValueRefBase<T> RefBase; typedef ValueRef::Constant<T> RefConst; typedef ValueRef::Variable<T> RefVar; + typedef ValueRef::Variable<int> IntRefVar; typedef ValueRef::Operation<T> RefOp; typedef typename ValueRefRule<T>::type Rule; @@ -32,10 +33,12 @@ private: void SpecializedInit(); + void SpecializedVarDefinition(); Rule constant; Rule variable_container; Rule variable_final; + Rule int_variable_final; Rule variable; Rule primary_expr; Rule negative_expr; @@ -57,19 +60,19 @@ template <class T> ValueRefParserDefinition<T>::ValueRefParserDefinition(Rule& expr) { + int_variable_final = + str_p("owner") + | "id" + | "creationturn" + | "age"; + SpecializedInit(); variable_container = str_p("planet") | "system"; - variable = - str_p("source") >> '.' >> (!(variable_container >> ".") >> variable_final) - [variable.this_ = new_<RefVar>(val(true), construct_<std::string>(arg1, arg2))] - | str_p("target") >> '.' >> (!(variable_container >> ".") >> variable_final) - [variable.this_ = new_<RefVar>(val(false), construct_<std::string>(arg1, arg2))] - | str_p("currentturn") - [variable.this_ = new_<RefVar>(val(false), construct_<std::string>(arg1, arg2))]; + SpecializedVarDefinition(); primary_expr = constant[primary_expr.this_ = arg1] @@ -106,11 +109,7 @@ real_p[constant.this_ = new_<RefConst>(static_cast_<int>(arg1))] | int_p[constant.this_ = new_<RefConst>(arg1)]; - variable_final = - str_p("owner") - | "id" - | "creationturn" - | "age"; + variable_final = int_variable_final; } template <> @@ -206,4 +205,43 @@ variable_final = str_p("primaryfocus") | "secondaryfocus"; } + + template <class T> + void ValueRefParserDefinition<T>::SpecializedVarDefinition() + { + variable = + str_p("source") >> '.' >> (!(variable_container >> ".") >> variable_final) + [variable.this_ = new_<RefVar>(val(true), construct_<std::string>(arg1, arg2))] + | str_p("target") >> '.' >> (!(variable_container >> ".") >> variable_final) + [variable.this_ = new_<RefVar>(val(false), construct_<std::string>(arg1, arg2))]; + } + + template <> + void ValueRefParserDefinition<int>::SpecializedVarDefinition() + { + variable = + str_p("source") >> '.' >> (!(variable_container >> ".") >> variable_final) + [variable.this_ = new_<RefVar>(val(true), construct_<std::string>(arg1, arg2))] + | str_p("target") >> '.' >> (!(variable_container >> ".") >> variable_final) + [variable.this_ = new_<RefVar>(val(false), construct_<std::string>(arg1, arg2))] + | str_p("currentturn") + [variable.this_ = new_<RefVar>(val(false), construct_<std::string>(arg1, arg2))]; + } + + template <> + void ValueRefParserDefinition<double>::SpecializedVarDefinition() + { + typedef ValueRef::StaticCast<int, double> CastRefVar; + variable = + str_p("source") >> '.' >> (!(variable_container >> ".") >> variable_final) + [variable.this_ = new_<RefVar>(val(true), construct_<std::string>(arg1, arg2))] + | str_p("source") >> '.' >> (!(variable_container >> ".") >> int_variable_final) + [variable.this_ = new_<CastRefVar>(new_<IntRefVar>(val(true), construct_<std::string>(arg1, arg2)))] + | str_p("target") >> '.' >> (!(variable_container >> ".") >> variable_final) + [variable.this_ = new_<RefVar>(val(false), construct_<std::string>(arg1, arg2))] + | str_p("target") >> '.' >> (!(variable_container >> ".") >> int_variable_final) + [variable.this_ = new_<CastRefVar>(new_<IntRefVar>(val(false), construct_<std::string>(arg1, arg2)))] + | str_p("currentturn") + [variable.this_ = new_<CastRefVar>(new_<IntRefVar>(val(false), construct_<std::string>(arg1, arg2)))]; + } } |
From: <geo...@us...> - 2007-02-13 16:24:37
|
Revision: 2006 http://svn.sourceforge.net/freeorion/revision/?rev=2006&view=rev Author: geoffthemedio Date: 2007-02-13 08:24:33 -0800 (Tue, 13 Feb 2007) Log Message: ----------- Fixed [ 1655888 ] Segfault on Tech Tree Browsing+Patch Modified Paths: -------------- trunk/FreeOrion/universe/ConditionParser1.cpp trunk/FreeOrion/universe/ConditionParser2.cpp trunk/FreeOrion/universe/EffectParser.cpp Modified: trunk/FreeOrion/universe/ConditionParser1.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser1.cpp 2007-02-12 20:37:13 UTC (rev 2005) +++ trunk/FreeOrion/universe/ConditionParser1.cpp 2007-02-13 16:24:33 UTC (rev 2006) @@ -15,7 +15,7 @@ ParamLabel affiliation_label("affiliation"); ParamLabel name_label("name"); ParamLabel type_label("type"); -ParamLabel size_label("size"); +ParamLabel planetsize_label("size"); ParamLabel focus_label("focus"); ParamLabel environment_label("environment"); ParamLabel probability_label("probability"); @@ -159,7 +159,7 @@ planet_size = (str_p("planet") - >> size_label + >> planetsize_label >> (planetsize_expr_p[push_back_(planet_size.sizes, arg1)] | ('[' >> +(planetsize_expr_p[push_back_(planet_size.sizes, arg1)]) >> ']'))) [planet_size.this_ = new_<Condition::PlanetSize>(planet_size.sizes)]; Modified: trunk/FreeOrion/universe/ConditionParser2.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser2.cpp 2007-02-12 20:37:13 UTC (rev 2005) +++ trunk/FreeOrion/universe/ConditionParser2.cpp 2007-02-13 16:24:33 UTC (rev 2006) @@ -15,7 +15,7 @@ extern ParamLabel affiliation_label; extern ParamLabel name_label; extern ParamLabel type_label; -extern ParamLabel size_label; +extern ParamLabel planetsize_label; extern ParamLabel environment_label; extern ParamLabel probability_label; extern ParamLabel distance_label; Modified: trunk/FreeOrion/universe/EffectParser.cpp =================================================================== --- trunk/FreeOrion/universe/EffectParser.cpp 2007-02-12 20:37:13 UTC (rev 2005) +++ trunk/FreeOrion/universe/EffectParser.cpp 2007-02-13 16:24:33 UTC (rev 2006) @@ -95,7 +95,7 @@ ParamLabel value_label; ParamLabel type_label; - ParamLabel size_label; + ParamLabel planetsize_label; ParamLabel empire_label; ParamLabel name_label; }; @@ -103,7 +103,7 @@ EffectParserDefinition::EffectParserDefinition() : value_label("value"), type_label("type"), - size_label("size"), + planetsize_label("size"), empire_label("empire"), name_label("name") { @@ -135,7 +135,7 @@ set_planet_size = (str_p("setplanetsize") - >> size_label >> planetsize_expr_p[set_planet_size.size = arg1]) + >> planetsize_label >> planetsize_expr_p[set_planet_size.size = arg1]) [set_planet_size.this_ = new_<Effect::SetPlanetSize>(set_planet_size.size)]; add_owner = |
From: <geo...@us...> - 2007-06-12 06:41:45
|
Revision: 2075 http://svn.sourceforge.net/freeorion/revision/?rev=2075&view=rev Author: geoffthemedio Date: 2007-06-11 23:41:43 -0700 (Mon, 11 Jun 2007) Log Message: ----------- -Fixed ShortestPath and LeastJumpsPath to put the starting system in the path, which my recent changes weren't doing, which was causing FO server to crash after giving a FleetMoveOrder that took more than one turn to complete, then ending the turn -Clarified the input of ShortestPath, LinearDistance, LeastJumpsPath, SystemsConnected, SystemReachable and ImmediateNeighbors: they take the system_ids (not m_system_graph indices, which are gotten from the system id using the internal SystemGraphIndex function) Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2007-06-11 13:12:45 UTC (rev 2074) +++ trunk/FreeOrion/universe/Universe.cpp 2007-06-12 06:41:43 UTC (rev 2075) @@ -466,6 +466,23 @@ // templated implementations of Universe graph search methods + // returns the \a graph index for system with \a system_id + template <class Graph> + int SystemGraphIndex(const Graph& graph, int system_id) + { + typedef typename boost::property_map<Graph, Universe::vertex_system_pointer_t>::const_type ConstSystemPointerPropertyMap; + ConstSystemPointerPropertyMap pointer_property_map = boost::get(Universe::vertex_system_pointer_t(), graph); + + for (unsigned int i = 0; i < boost::num_vertices(graph); ++i) { + const int loop_sys_id = pointer_property_map[i]->ID(); // get system ID of this vertex + if (loop_sys_id == system_id) + return i; + } + + throw std::out_of_range("SystemGraphIndex cannot be found due to invalid system ID"); + return -1; + } + /* returns the path between vertices \a system1_id and \a system2_id of \a graph that travels the shorest distance on starlanes, and the path length. If system1_id is the same vertex as system2_id, the path has just that system in it, and the path lenth is 0. If there is no path between the two vertices, then @@ -482,18 +499,11 @@ ConstIndexPropertyMap index_map = boost::get(boost::vertex_index, graph); ConstEdgeWeightPropertyMap edge_weight_map = boost::get(boost::edge_weight, graph); - // get graph indices for system_ids by finding the graph vertex that has the appropriate associated system + int system1_index = SystemGraphIndex(graph, system1_id); + int system2_index = SystemGraphIndex(graph, system2_id); + ConstSystemPointerPropertyMap pointer_property_map = boost::get(Universe::vertex_system_pointer_t(), graph); - int system1_index = -1, system2_index = -1; - for (unsigned int i = 0; i < boost::num_vertices(graph); ++i) { - const int system_id = pointer_property_map[i]->ID(); // get system ID of this vertex - if (system_id == system1_id) system1_index = i; - if (system_id == system2_id) system2_index = i; - } - if (-1 == system1_index || -1 == system2_index) - throw std::out_of_range("ShortestPathImpl was given an invalid system ID"); - // early exit if systems are the same if (system1_id == system2_id) { System* system = pointer_property_map[system2_index]; @@ -536,18 +546,11 @@ // there is no path between the specified nodes retval.second = -1.0; return retval; + } else { + // add start system to path, as it wasn't added by traversing predecessors array + retval.first.push_front(pointer_property_map[system1_index]); } -#if 0 // disabled for now - // if system2 is unreachable or it would be faster to travel "offroad", use the linear distance - if (linear_distance * OFFROAD_SLOWDOWN_FACTOR < retval.second || retval.first.empty()) { - retval.first.clear(); - retval.first.push_back(pointer_property_map[system1_id]); - retval.first.push_back(pointer_property_map[system2_id]); - retval.second = linear_distance; - } -#endif - return retval; } @@ -563,15 +566,8 @@ ConstSystemPointerPropertyMap pointer_property_map = boost::get(Universe::vertex_system_pointer_t(), graph); std::pair<std::list<System*>, int> retval; - // get graph indices for system_ids by finding the graph vertex that has the appropriate associated system - int system1_index = -1, system2_index = -1; - for (unsigned int i = 0; i < boost::num_vertices(graph); ++i) { - const int system_id = pointer_property_map[i]->ID(); // get system ID of this vertex - if (system_id == system1_id) system1_index = i; // check if this vertex is one of the endpoint systems whose index needs to be kept track of - if (system_id == system2_id) system2_index = i; - } - if (-1 == system1_index || -1 == system2_index) - throw std::out_of_range("LeastJumpsPathImpl was given an invalid system ID"); + int system1_index = SystemGraphIndex(graph, system1_id); + int system2_index = SystemGraphIndex(graph, system2_id); // early exit if systems are the same if (system1_id == system2_id) { @@ -615,18 +611,22 @@ if (retval.first.empty()) { // there is no path between the specified nodes retval.second = -1; - return retval; + } else { + // add start system to path, as it wasn't added by traversing predecessors array + retval.first.push_front(pointer_property_map[system1_index]); } return retval; } template <class Graph> - bool SystemReachableImpl(const Graph& graph, int system) - { return boost::in_degree(system, graph); } + bool SystemReachableImpl(const Graph& graph, int system_id) + { + return boost::in_degree(SystemGraphIndex(graph, system_id), graph); + } template <class Graph> - std::map<double, System*> ImmediateNeighborsImpl(const Graph& graph, int system) + std::map<double, System*> ImmediateNeighborsImpl(const Graph& graph, int system_id) { typedef typename Graph::out_edge_iterator OutEdgeIterator; typedef typename boost::property_map<Graph, Universe::vertex_system_pointer_t>::const_type ConstSystemPointerPropertyMap; @@ -635,7 +635,7 @@ std::map<double, System*> retval; ConstEdgeWeightPropertyMap edge_weight_map = boost::get(boost::edge_weight, graph); ConstSystemPointerPropertyMap pointer_property_map = boost::get(Universe::vertex_system_pointer_t(), graph); - std::pair<OutEdgeIterator, OutEdgeIterator> edges = boost::out_edges(system, graph); + std::pair<OutEdgeIterator, OutEdgeIterator> edges = boost::out_edges(SystemGraphIndex(graph, system_id), graph); for (OutEdgeIterator it = edges.first; it != edges.second; ++it) { retval[edge_weight_map[*it]] = pointer_property_map[boost::target(*it, graph)]; } @@ -1029,64 +1029,64 @@ return (it != m_destroyed_objects.end() ? it->second : 0); } -double Universe::LinearDistance(int system1, int system2) const +double Universe::LinearDistance(int system1_id, int system2_id) const { - return m_system_distances.at(std::max(system1, system2)).at(std::min(system1, system2)); + int system1_index = SystemGraphIndex(m_system_graph, system1_id); + int system2_index = SystemGraphIndex(m_system_graph, system2_id); + return m_system_distances.at(std::max(system1_index, system2_index)).at(std::min(system1_index, system2_index)); } -std::pair<std::list<System*>, double> Universe::ShortestPath(int system1, int system2, int empire_id/* = ALL_EMPIRES*/) const +std::pair<std::list<System*>, double> Universe::ShortestPath(int system1_id, int system2_id, int empire_id/* = ALL_EMPIRES*/) const { - double linear_distance = LinearDistance(system1, system2); + double linear_distance = LinearDistance(system1_id, system2_id); if (empire_id == ALL_EMPIRES) { - return ShortestPathImpl(m_system_graph, system1, system2, linear_distance); + return ShortestPathImpl(m_system_graph, system1_id, system2_id, linear_distance); } else { EmpireViewSystemGraphMap::const_iterator graph_it = m_empire_system_graph_views.find(empire_id); if (graph_it != m_empire_system_graph_views.end()) - return ShortestPathImpl(*graph_it->second, system1, system2, linear_distance); + return ShortestPathImpl(*graph_it->second, system1_id, system2_id, linear_distance); } return std::pair<std::list<System*>, double>(); } -std::pair<std::list<System*>, int> Universe::LeastJumpsPath(int system1, int system2, int empire_id/* = ALL_EMPIRES*/) const +std::pair<std::list<System*>, int> Universe::LeastJumpsPath(int system1_id, int system2_id, int empire_id/* = ALL_EMPIRES*/) const { if (empire_id == ALL_EMPIRES) { - return LeastJumpsPathImpl(m_system_graph, system1, system2); + return LeastJumpsPathImpl(m_system_graph, system1_id, system2_id); } else { EmpireViewSystemGraphMap::const_iterator graph_it = m_empire_system_graph_views.find(empire_id); if (graph_it != m_empire_system_graph_views.end()) - return LeastJumpsPathImpl(*graph_it->second, system1, system2); + return LeastJumpsPathImpl(*graph_it->second, system1_id, system2_id); } return std::pair<std::list<System*>, int>(); } -bool Universe::SystemsConnected(int system1, int system2, int empire_id) const +bool Universe::SystemsConnected(int system1_id, int system2_id, int empire_id) const { - std::pair<std::list<System*>, int> path = LeastJumpsPath(system1, system2, empire_id); + std::pair<std::list<System*>, int> path = LeastJumpsPath(system1_id, system2_id, empire_id); return (!path.first.empty()); } -bool Universe::SystemReachable(int system, int empire_id) const +bool Universe::SystemReachable(int system_id, int empire_id) const { - m_system_distances.at(system); // for an exception-throwing bounds check if (empire_id == ALL_EMPIRES) { - return SystemReachableImpl(m_system_graph, system); + return SystemReachableImpl(m_system_graph, system_id); } else { EmpireViewSystemGraphMap::const_iterator graph_it = m_empire_system_graph_views.find(empire_id); if (graph_it != m_empire_system_graph_views.end()) - return SystemReachableImpl(*graph_it->second, system); + return SystemReachableImpl(*graph_it->second, system_id); } return false; } -std::map<double, System*> Universe::ImmediateNeighbors(int system, int empire_id/* = ALL_EMPIRES*/) const +std::map<double, System*> Universe::ImmediateNeighbors(int system_id, int empire_id/* = ALL_EMPIRES*/) const { - m_system_distances.at(system); // for an exception-throwing bounds check if (empire_id == ALL_EMPIRES) { - return ImmediateNeighborsImpl(m_system_graph, system); + return ImmediateNeighborsImpl(m_system_graph, system_id); } else { EmpireViewSystemGraphMap::const_iterator graph_it = m_empire_system_graph_views.find(empire_id); if (graph_it != m_empire_system_graph_views.end()) - return ImmediateNeighborsImpl(*graph_it->second, system); + return ImmediateNeighborsImpl(*graph_it->second, system_id); } return std::map<double, System*>(); } Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2007-06-11 13:12:45 UTC (rev 2074) +++ trunk/FreeOrion/universe/Universe.h 2007-06-12 06:41:43 UTC (rev 2075) @@ -135,40 +135,40 @@ const_iterator endDestroyed() const {return m_destroyed_objects.end();} ///< returns the end const_iterator for the destroyed objects from the universe - double LinearDistance(int system1, int system2) const; ///< returns the straight-line distance between the systems with the given IDs. \throw std::out_of_range This function will throw if either system ID is out of range. + double LinearDistance(int system1_id, int system2_id) const; ///< returns the straight-line distance between the systems with the given IDs. \throw std::out_of_range This function will throw if either system ID is out of range. /** returns the sequence of systems, including \a system1 and \a system2, that defines the shortest path from \a system1 to \a system2, and the distance travelled to get there. If no such path exists, the list will be empty. Note that the path returned may be via one or more starlane, or may be "offroad". The path is calculated using the visiblity for empire \a empire_id, or without regard to visibility if \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function will throw if either system ID is out of range. */ - std::pair<std::list<System*>, double> ShortestPath(int system1, int system2, int empire_id = ALL_EMPIRES) const; + std::pair<std::list<System*>, double> ShortestPath(int system1_id, int system2_id, int empire_id = ALL_EMPIRES) const; /** returns the sequence of systems, including \a system1 and \a system2, that defines the path with the fewest jumps from \a system1 to \a system2, and the number of jumps to get there. If no such path exists, the list will be empty. The path is calculated using the visiblity for empire \a empire_id, or without regard to visibility if \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function will throw if either system ID is out of range. */ - std::pair<std::list<System*>, int> LeastJumpsPath(int system1, int system2, int empire_id = ALL_EMPIRES) const; + std::pair<std::list<System*>, int> LeastJumpsPath(int system1_id, int system2_id, int empire_id = ALL_EMPIRES) const; /** returns whether there is a path known to empire \a empire_id between system \a system1 and system \a system2. The path is calculated using the visiblity for empire \a empire_id, or without regard to visibility if \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function will throw if either system ID is out of range. */ - bool SystemsConnected(int system1, int system2, int empire_id = ALL_EMPIRES) const; + bool SystemsConnected(int system1_id, int system2_id, int empire_id = ALL_EMPIRES) const; /** returns true iff \a system is reachable from another system (i.e. it has at least one known starlane to it). This does not guarantee that the system is reachable from any other system, as two separate groups of locally but not globally internonnected systems may exist. The starlanes considered depend on their visiblity for empire \a empire_id, or without regard to visibility if \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function will throw if the system ID is out of range. */ - bool SystemReachable(int system, int empire_id = ALL_EMPIRES) const; + bool SystemReachable(int system_id, int empire_id = ALL_EMPIRES) const; /** returns the systems that are one starlane hop away from system \a system. The returned systems are indexed by distance from \a system. The neighborhood is calculated using the visiblity for empire \a empire_id, or without regard to visibility if \a empire_id == ALL_EMPIRES. \throw std::out_of_range This function will throw if the system ID is out of range. */ - std::map<double, System*> ImmediateNeighbors(int system, int empire_id = ALL_EMPIRES) const; + std::map<double, System*> ImmediateNeighbors(int system_id, int empire_id = ALL_EMPIRES) const; mutable UniverseObjectDeleteSignalType UniverseObjectDeleteSignal; ///< the state changed signal object for this UniverseObject //@} |
From: <geo...@us...> - 2007-07-15 05:39:09
|
Revision: 2159 http://svn.sourceforge.net/freeorion/revision/?rev=2159&view=rev Author: geoffthemedio Date: 2007-07-14 22:39:06 -0700 (Sat, 14 Jul 2007) Log Message: ----------- Made Universe set meter initial and previous values when creating universe, so that these values are present on the first turn. This allows calculations that depend on these values, such a meter-effect accounting and meter max value estimation in the clients to work properly. Modified Paths: -------------- trunk/FreeOrion/universe/Meter.cpp trunk/FreeOrion/universe/Meter.h trunk/FreeOrion/universe/PopCenter.cpp trunk/FreeOrion/universe/PopCenter.h trunk/FreeOrion/universe/Universe.cpp Modified: trunk/FreeOrion/universe/Meter.cpp =================================================================== --- trunk/FreeOrion/universe/Meter.cpp 2007-07-15 04:27:37 UTC (rev 2158) +++ trunk/FreeOrion/universe/Meter.cpp 2007-07-15 05:39:06 UTC (rev 2159) @@ -23,6 +23,16 @@ m_previous_max(METER_MIN) {} +Meter::Meter(double current, double max, double initial_current, double initial_max, double previous_current, double previous_max) : + m_current(current), + m_max(max), + m_initial_current(initial_current), + m_initial_max(initial_max), + m_previous_current(previous_current), + m_previous_max(previous_max) +{} + + double Meter::Current() const { return m_current; Modified: trunk/FreeOrion/universe/Meter.h =================================================================== --- trunk/FreeOrion/universe/Meter.h 2007-07-15 04:27:37 UTC (rev 2158) +++ trunk/FreeOrion/universe/Meter.h 2007-07-15 05:39:06 UTC (rev 2159) @@ -16,7 +16,9 @@ public: Meter(); ///< default ctor. Meter(double current, double max); ///< basic ctor + Meter(double current, double max, double initial_current, double initial_max, double previous_current, double previous_max); ///< basic ctor + double Current() const; ///< returns the current value of the meter, which will be in [METER_MIN, Max()] double Max() const; ///< returns the maximum value of the meter, which will be in [METER_MIN, METER_MAX] Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2007-07-15 04:27:37 UTC (rev 2158) +++ trunk/FreeOrion/universe/PopCenter.cpp 2007-07-15 05:39:06 UTC (rev 2159) @@ -46,18 +46,29 @@ PopCenter::PopCenter() : m_growth(0), m_race(0), - m_available_food(0) + m_available_food(0), + m_pop(), + m_health() {} -PopCenter::PopCenter(double max_pop_mod, double max_health_mod) +PopCenter::PopCenter(double max_pop_mod, double max_health_mod) : + m_growth(0), + m_race(0), + m_available_food(0), + m_pop(), + m_health() { Reset(max_pop_mod, max_health_mod); } -PopCenter::PopCenter(int race, double max_pop_mod, double max_health_mod) +PopCenter::PopCenter(int race, double max_pop_mod, double max_health_mod) : + m_growth(0), + m_race(race), + m_available_food(0), + m_pop(), + m_health() { Reset(max_pop_mod, max_health_mod); - m_race = race; } PopCenter::~PopCenter() @@ -93,17 +104,27 @@ double PopCenter::FuturePopGrowth() const { - return std::min(FuturePopGrowthMax(), std::min(AvailableFood(), m_pop.Max()) - m_pop.Current()); + Logger().debugStream() << "PopCenter::FuturePopGrowth(): id: " << dynamic_cast<const UniverseObject* const>(this)->ID(); + Logger().debugStream() << "FuturePopGrowthMax(): " << FuturePopGrowthMax(); + Logger().debugStream() << "std::min(AvailableFood(), m_pop.Max()) - m_pop.Current(): " << std::min(AvailableFood(), m_pop.Max()) - m_pop.Current(); + return std::max(-m_pop.Current(), std::min(FuturePopGrowthMax(), std::min(AvailableFood(), m_pop.Max()) - m_pop.Current())); } double PopCenter::FuturePopGrowthMax() const { + Logger().debugStream() << "PopCenter::FuturePopGrowthMax(): id: " << dynamic_cast<const UniverseObject* const>(this)->ID(); if (20.0 < m_health.Current()) { - return m_pop.Current() * (((m_pop.Max() + 1.0) - m_pop.Current()) / (m_pop.Max() + 1.0)) * (m_health.Current() - 20.0) * 0.01; + Logger().debugStream() << "health " << m_health.Current() <<" > 20"; + Logger().debugStream() << "m_pop.Max(): " << m_pop.Max(); + Logger().debugStream() << "m_pop.Current(): " << m_pop.Current(); + return std::min(m_pop.Max() - m_pop.Current(), m_pop.Current() * (((m_pop.Max() + 1.0) - m_pop.Current()) / (m_pop.Max() + 1.0)) * (m_health.Current() - 20.0) * 0.01); } else if (m_health.Current() == 20.0) { return 0.0; } else { // m_health.Current() < 20.0 - return -m_pop.Current()*( exp( (m_health.Current()-20)*(m_health.Current()-20) / (400/log(2.0)) ) - 1 ); + Logger().debugStream() << "health " << m_health.Current() << " < 20"; + Logger().debugStream() << "m_pop.Max(): " << m_pop.Max(); + Logger().debugStream() << "m_pop.Current(): " << m_pop.Current(); + return std::max(-m_pop.Current(), -m_pop.Current()*( exp( (m_health.Current()-20)*(m_health.Current()-20) / (400/log(2.0)) ) - 1 )); } } @@ -144,8 +165,8 @@ void PopCenter::Reset(double max_pop_mod, double max_health_mod) { - m_pop = Meter(0.0, max_pop_mod); - m_health = Meter(max_health_mod, max_health_mod); + m_pop = Meter(0.0, max_pop_mod, m_pop.InitialCurrent(), m_pop.InitialMax(), m_pop.PreviousCurrent(), m_pop.PreviousMax()); + m_health = Meter(max_health_mod, max_health_mod, m_health.InitialCurrent(), m_health.InitialMax(), m_health.PreviousCurrent(), m_health.PreviousMax()); m_growth = 0.0; m_race = -1; m_available_food = 0.0; Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2007-07-15 04:27:37 UTC (rev 2158) +++ trunk/FreeOrion/universe/PopCenter.h 2007-07-15 05:39:06 UTC (rev 2159) @@ -101,6 +101,7 @@ & BOOST_SERIALIZATION_NVP(m_growth) & BOOST_SERIALIZATION_NVP(m_race) & BOOST_SERIALIZATION_NVP(m_available_food); + Logger().debugStream() << "PopCenter::serialize: m_pop.InitialMax(): " << m_pop.InitialMax(); } #endif // _PopCenter_h_ Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2007-07-15 04:27:37 UTC (rev 2158) +++ trunk/FreeOrion/universe/Universe.cpp 2007-07-15 05:39:06 UTC (rev 2159) @@ -589,6 +589,8 @@ // discrepancy is the difference between expected and actual meter values at start of turn double discrepancy = meter->InitialMax() - meter->Max(); + Logger().debugStream() << "object " << object_id << " has meter " << type << " initial max: " << meter->InitialMax() << " discrepancy: " << discrepancy << " and final max: " << meter->Max(); + // add to discrepancy map m_effect_discrepancy_map[object_id][type] = discrepancy; @@ -625,7 +627,7 @@ for (MeterType type = MeterType(0); type != NUM_METER_TYPES; type = MeterType(type + 1)) { Meter* meter = obj->GetMeter(type); if (meter) { - Logger().debugStream() << "object " << object_id << " has meter " << type << " with starting max: " << meter->Max(); + Logger().debugStream() << "object " << object_id << " has meter " << type << " with table-only max: " << meter->Max(); EffectAccountingInfo info; info.source_id = UniverseObject::INVALID_OBJECT_ID; @@ -667,6 +669,8 @@ Meter* meter = obj->GetMeter(type); if (meter) { + Logger().debugStream() << "object " << object_id << " has meter " << type << " discrepancy: " << discrepancy << " and final max: " << meter->Max(); + meter->AdjustMax(discrepancy); EffectAccountingInfo info; @@ -1908,7 +1912,28 @@ NamePlanets(); GenerateEmpires(players + ai_players, homeworlds, player_setup_data); + // Apply non-effect meter adjustments + for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { + it->second->ResetMaxMeters(); // zero all meters + it->second->ApplyUniverseTableMaxMeterAdjustments(); // apply non-effects max meter modifications, including focus mods + } + + // Apply effects for 1st turn ApplyEffects(); + + // update initial and previous meter values + for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { + it->second->ClampMeters(); // limit current meters by max meters + for (MeterType i = MeterType(0); i != NUM_METER_TYPES; i = MeterType(i + 1)) { + if (Meter* meter = it->second->GetMeter(i)) { + meter->m_previous_current = meter->m_current; + meter->m_previous_max = meter->m_max; + meter->m_initial_current = meter->m_current; + meter->m_initial_max = meter->m_max; + } + } + } + #else throw std::runtime_error("Non-server called Universe::CreateUniverse; only server should call this while creating the universe"); #endif |
From: <geo...@us...> - 2007-09-02 20:42:18
|
Revision: 2248 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2248&view=rev Author: geoffthemedio Date: 2007-09-02 13:42:17 -0700 (Sun, 02 Sep 2007) Log Message: ----------- -Removed unused m_growth from PopCenter -Trivial tweakage of ResourceCenter.h whitespace so a few function names line up Modified Paths: -------------- trunk/FreeOrion/universe/PopCenter.cpp trunk/FreeOrion/universe/PopCenter.h trunk/FreeOrion/universe/ResourceCenter.h Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2007-09-02 18:08:07 UTC (rev 2247) +++ trunk/FreeOrion/universe/PopCenter.cpp 2007-09-02 20:42:17 UTC (rev 2248) @@ -43,12 +43,12 @@ } PopCenter::PopCenter(int race) : - m_growth(0.0), m_race(race), m_available_food(0.0) + m_race(race), m_available_food(0.0) { } PopCenter::PopCenter() : - m_growth(0.0), m_race(-1), m_available_food(0.0) + m_race(-1), m_available_food(0.0) { } @@ -207,7 +207,6 @@ { GetMeter(METER_POPULATION)->Set(0.0, max_pop_mod); GetMeter(METER_HEALTH)->Set(max_health_mod, max_health_mod); - m_growth = 0.0; m_race = -1; m_available_food = 0.0; } Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2007-09-02 18:08:07 UTC (rev 2247) +++ trunk/FreeOrion/universe/PopCenter.h 2007-09-02 20:42:17 UTC (rev 2248) @@ -74,7 +74,6 @@ double FuturePopGrowthMax() const; ///< predicts by which amount the population will grow at maximum next turn (assuming there is enough food) double FutureHealthGrowth() const; ///< predicts by which amount the health meter will grow next turn - double m_growth; int m_race; ///< the id of the race that occupies this planet double m_available_food; Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2007-09-02 18:08:07 UTC (rev 2247) +++ trunk/FreeOrion/universe/ResourceCenter.h 2007-09-02 20:42:17 UTC (rev 2248) @@ -26,8 +26,8 @@ //@} /** \name Accessors */ //@{ - FocusType PrimaryFocus() const {return m_primary;} - FocusType SecondaryFocus() const {return m_secondary;} + FocusType PrimaryFocus() const {return m_primary;} + FocusType SecondaryFocus() const {return m_secondary;} virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn 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) @@ -37,14 +37,14 @@ //@} /** \name Mutators */ //@{ - void SetPrimaryFocus(FocusType focus); - void SetSecondaryFocus(FocusType focus); + void SetPrimaryFocus(FocusType focus); + void SetSecondaryFocus(FocusType focus); - virtual void ApplyUniverseTableMaxMeterAdjustments(); - virtual void PopGrowthProductionResearchPhase(); + virtual void ApplyUniverseTableMaxMeterAdjustments(); + virtual void PopGrowthProductionResearchPhase(); /// Resets the meters, etc. This should be called when a ResourceCenter is wiped out due to starvation, etc. - void Reset(); + void Reset(); //@} protected: |
From: <geo...@us...> - 2007-12-23 01:12:25
|
Revision: 2275 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2275&view=rev Author: geoffthemedio Date: 2007-12-22 17:12:30 -0800 (Sat, 22 Dec 2007) Log Message: ----------- Minor progress implementing PartType, HullType and ShipDesign Modified Paths: -------------- trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2007-12-22 20:51:24 UTC (rev 2274) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2007-12-23 01:12:30 UTC (rev 2275) @@ -189,8 +189,7 @@ m_power(1.0), m_range(1.0), m_effects(), - m_graphic(""), - m_battle_animation("") + m_graphic("") {} PartType::PartType(std::string name, std::string description, ShipPartClass part_class, std::string upgrade, @@ -204,19 +203,50 @@ m_power(power), m_range(range), m_effects(), - m_graphic(graphic), - m_battle_animation("") + m_graphic(graphic) {} std::string PartType::Name() const { return m_name; } - + +std::string PartType::Description() const { + return m_description; +} + std::string PartType::Upgrade() const { return m_upgrade; } +ShipPartClass PartType::Class() const { + return m_class; +} +double PartType::Mass() const { + return m_mass; +} + +double PartType::Power() const { + return m_power; +} + +double PartType::Range() const { + return m_range; +} + +double PartType::Cost() const { + return 10; /// TEMPORARY /// +} + +std::string PartType::Graphic() const { + return m_graphic; +} + +const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& PartType::Effects() const { + return m_effects; +} + + //////////////////////////////////////////////// // HullType //////////////////////////////////////////////// @@ -245,7 +275,31 @@ return m_name; } +std::string HullType::Description() const { + return m_description; +} +double HullType::Mass() const { + return m_mass; +} + +double HullType::Speed() const { + return m_speed; +} + +double HullType::Cost() const { + return 30; //// TEMPORARY //// +} + +int HullType::NumberSlots() const { + return m_number_slots; +} + +const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& HullType::Effects() const { + return m_effects; +} + + ///////////////////////////////////// // HullTypeManager // ///////////////////////////////////// @@ -321,13 +375,21 @@ m_parts(parts), m_graphic(graphic), m_3D_model(model) -{} +{ + const HullType* hull_type = GetHullTypeManager().GetHullType(hull); + if (!hull_type) { + Logger().errorStream() << "ShipDesign created with invalid hull: " << hull; + } else { + if (hull_type->NumberSlots() < static_cast<int>(parts.size())) + Logger().errorStream() << "ShipDesign created with too many parts (" << parts.size() << ") for its hull (capacity " << hull_type->NumberSlots(); + } +} std::string ShipDesign::Name() const { return m_name; } - + int ShipDesign::DesignedByEmpire() const { return m_designed_by_empire_id; @@ -357,7 +419,7 @@ return "misc/mark3.png"; if (m_name == "Mark IV") return "misc/mark4.png"; - return ""; + return m_graphic; } std::string ShipDesign::Description() const @@ -377,6 +439,24 @@ return "A nonspecific ship"; } + +std::string ShipDesign::Hull() const { + return m_hull; +} + +const HullType* ShipDesign::GetHull() const { + return GetHullTypeManager().GetHullType(m_hull); +} + +const std::vector<std::string>& ShipDesign::Parts() const { + return m_parts; +} + +std::string ShipDesign::Model() const { + return m_3D_model; +} + +//// TEMPORARY double ShipDesign::Defense() const { if (m_name == "Mark I") @@ -404,7 +484,7 @@ return 30.0; if (m_name == "Mark IV") return 25.0; - return 50.0; + return GetHull()->Speed(); } double ShipDesign::Attack() const @@ -417,7 +497,18 @@ return 10.0; if (m_name == "Mark IV") return 15.0; - return 0.0; + + // accumulate attack power from all weapon parts in design + const PartTypeManager& manager = GetPartTypeManager(); + + double total_attack = 0.0; + for (std::vector<std::string>::const_iterator it = m_parts.begin(); it != m_parts.end(); ++it) { + const PartType* part = manager.GetPartType(*it); + if (part && part->Class() == PC_SHORT_RANGE_BEAM) + total_attack += part->Power(); + } + + return total_attack; } bool ShipDesign::Colonize() const @@ -441,5 +532,23 @@ return 60.0; if (m_name == "Mark IV") return 80.0; - return 0; + + // accumulate cost from hull and all parts in design + double total_cost = 0.001; // default small value + + const PartTypeManager& part_manager = GetPartTypeManager(); + for (std::vector<std::string>::const_iterator it = m_parts.begin(); it != m_parts.end(); ++it) { + const PartType* part = part_manager.GetPartType(*it); + if (part) + total_cost += part->Cost(); + } + + const HullTypeManager& hull_manager = GetHullTypeManager(); + const HullType* hull = hull_manager.GetHullType(m_hull); + if (hull) + total_cost += hull->Cost(); + + return total_cost; } + +//// TEMPORARY \ No newline at end of file Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2007-12-22 20:51:24 UTC (rev 2274) +++ trunk/FreeOrion/universe/ShipDesign.h 2007-12-23 01:12:30 UTC (rev 2275) @@ -26,8 +26,9 @@ double Power() const; ///< returns how good the part is at its function. might be weapon or shield strength, or cargo hold capacity double Range() const; ///< returns the range of a part. may not have meaning for all part types. + double Cost() const; ///< returns cost of part + std::string Graphic() const; ///< returns graphic that represents part in UI - std::string Animation() const; ///< returns name of animation that is played when part activates in battle const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& Effects() const; ///< returns the EffectsGroups that encapsulate the effects this part has @@ -48,7 +49,6 @@ m_effects; std::string m_graphic; - std::string m_battle_animation; friend class boost::serialization::access; template <class Archive> @@ -110,8 +110,10 @@ double Mass() const; ///< returns mass of hull double Speed() const; ///< returns speed (?) of hull - int NumberSlots(); ///< returns number of part slots in hull + double Cost() const; ///< returns cost of hull + int NumberSlots() const; ///< returns number of part slots in hull + const std::vector<boost::shared_ptr<const Effect::EffectsGroup> >& Effects() const; ///< returns the EffectsGroups that encapsulate the effects this part hull has //@} @@ -245,8 +247,7 @@ & BOOST_SERIALIZATION_NVP(m_power) & BOOST_SERIALIZATION_NVP(m_range) & BOOST_SERIALIZATION_NVP(m_effects) - & BOOST_SERIALIZATION_NVP(m_graphic) - & BOOST_SERIALIZATION_NVP(m_battle_animation); + & BOOST_SERIALIZATION_NVP(m_graphic); } template <class Archive> |
From: <geo...@us...> - 2008-02-17 01:45:52
|
Revision: 2333 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2333&view=rev Author: geoffthemedio Date: 2008-02-16 17:45:51 -0800 (Sat, 16 Feb 2008) Log Message: ----------- Tweaked colour parser to only accept unsigned ints in range 0 to 255. This seems to work, as the parser barfs if given a number outside that range... however the parsed uints still aren't being passed into the GG::Clr object properly, as these end up with seemingly random (but consistent between Clr's) values in them when constructed by the parser, as seen in console debug output. These Clr still aren't used for anything, though, and presumably won't until this is fixed. Modified Paths: -------------- trunk/FreeOrion/universe/Parser.h trunk/FreeOrion/universe/ParserUtil.cpp trunk/FreeOrion/universe/ShipDesign.cpp Modified: trunk/FreeOrion/universe/Parser.h =================================================================== --- trunk/FreeOrion/universe/Parser.h 2008-02-16 17:18:16 UTC (rev 2332) +++ trunk/FreeOrion/universe/Parser.h 2008-02-17 01:45:51 UTC (rev 2333) @@ -63,7 +63,7 @@ member1 this_; }; -struct ColourClosure : boost::spirit::closure<ColourClosure, GG::Clr, GLubyte, GLubyte, GLubyte, GLubyte> +struct ColourClosure : boost::spirit::closure<ColourClosure, GG::Clr, unsigned int, unsigned int, unsigned int, unsigned int> { member1 this_; member2 r; Modified: trunk/FreeOrion/universe/ParserUtil.cpp =================================================================== --- trunk/FreeOrion/universe/ParserUtil.cpp 2008-02-16 17:18:16 UTC (rev 2332) +++ trunk/FreeOrion/universe/ParserUtil.cpp 2008-02-17 01:45:51 UTC (rev 2333) @@ -36,10 +36,10 @@ lexeme_d['"' >> (*(alnum_p | '_' | '-' | '/' | '.'))[file_name_p.this_ = construct_<std::string>(arg1, arg2)] >> '"']; colour_p = - ('(' >> uint_p[colour_p.r] >> ',' - >> uint_p[colour_p.g] >> ',' - >> uint_p[colour_p.b] >> ',' - >> uint_p[colour_p.a] >> ')') + ('(' >> limit_d(0u, 255u)[uint_p[colour_p.r]] >> ',' + >> limit_d(0u, 255u)[uint_p[colour_p.g]] >> ',' + >> limit_d(0u, 255u)[uint_p[colour_p.b]] >> ',' + >> limit_d(0u, 255u)[uint_p[colour_p.a]] >> ')') [colour_p.this_ = construct_<GG::Clr>(colour_p.r, colour_p.g, colour_p.b, colour_p.a)]; planet_size_p.add Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2008-02-16 17:18:16 UTC (rev 2332) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2008-02-17 01:45:51 UTC (rev 2333) @@ -27,7 +27,7 @@ }; const phoenix::function<store_part_type_impl> store_part_type_; - + struct store_hull_type_impl { template <class T1, class T2> struct result {typedef void type;}; @@ -317,7 +317,7 @@ settings_dir += '/'; std::string filename = settings_dir + "ship_hulls.txt"; std::ifstream ifs(filename.c_str()); - + std::string input; std::getline(ifs, input, '\0'); ifs.close(); |
From: <tz...@us...> - 2008-03-31 00:58:32
|
Revision: 2438 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2438&view=rev Author: tzlaine Date: 2008-03-30 17:58:38 -0700 (Sun, 30 Mar 2008) Log Message: ----------- Made UniverseObject::SetSystem() virtual, and added an overload in Fleet. This should ensure that Ships always have the same system ID as the Fleets they're in. Modified Paths: -------------- trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2008-03-30 23:29:41 UTC (rev 2437) +++ trunk/FreeOrion/universe/Fleet.cpp 2008-03-31 00:58:38 UTC (rev 2438) @@ -389,6 +389,16 @@ return retval; } +void Fleet::SetSystem(int sys) +{ + UniverseObject::SetSystem(sys); + for (iterator it = begin(); it != end(); ++it) { + UniverseObject* obj = GetUniverse().Object(*it); + assert(obj); + obj->SetSystem(sys); + } +} + void Fleet::MovementPhase() { if (m_moving_to != INVALID_OBJECT_ID) { Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2008-03-30 23:29:41 UTC (rev 2437) +++ trunk/FreeOrion/universe/Fleet.h 2008-03-31 00:58:38 UTC (rev 2438) @@ -105,6 +105,7 @@ iterator begin(); ///< returns the begin iterator for the ships in the fleet iterator end(); ///< returns the end iterator for the ships in the fleet + virtual void SetSystem(int sys); virtual void MovementPhase(); virtual void PopGrowthProductionResearchPhase(); //@} Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2008-03-30 23:29:41 UTC (rev 2437) +++ trunk/FreeOrion/universe/UniverseObject.h 2008-03-31 00:58:38 UTC (rev 2438) @@ -117,7 +117,7 @@ virtual void AddOwner(int id); ///< adds the Empire with ID \a id to the list of owners of this object virtual void RemoveOwner(int id); ///< removes the Empire with ID \a id to the list of owners of this object - void SetSystem(int sys); ///< assigns this object to a System + virtual void SetSystem(int sys); ///< assigns this object to a System virtual void AddSpecial(const std::string& name); ///< adds the Special \a name to this object, if it is not already present virtual void RemoveSpecial(const std::string& name); ///< removes the Special \a name from this object, if it is already present |
From: <geo...@us...> - 2008-04-27 03:02:54
|
Revision: 2529 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2529&view=rev Author: geoffthemedio Date: 2008-04-26 19:55:07 -0700 (Sat, 26 Apr 2008) Log Message: ----------- -Modified UpdateMeterEstimates, ResetMaxMeters and ApplyUniverseTableMaxMeterAdjustments so that a particular meter can be updated, without updating other meters. -In-process is modification so that a particular object, or an object and its contents can have their meter estimates updated without updating every UniverseObject in the Universe. Modified Paths: -------------- 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/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/UniverseObject.h Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/Planet.cpp 2008-04-27 02:55:07 UTC (rev 2529) @@ -447,13 +447,13 @@ { } -void Planet::ApplyUniverseTableMaxMeterAdjustments() +void Planet::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) { - ResourceCenter::ApplyUniverseTableMaxMeterAdjustments(); - PopCenter::ApplyUniverseTableMaxMeterAdjustments(); + ResourceCenter::ApplyUniverseTableMaxMeterAdjustments(meter_type); + PopCenter::ApplyUniverseTableMaxMeterAdjustments(meter_type); } -void Planet::PopGrowthProductionResearchPhase( ) +void Planet::PopGrowthProductionResearchPhase() { // do not do production if planet was just conquered if (m_just_conquered) Modified: trunk/FreeOrion/universe/Planet.h =================================================================== --- trunk/FreeOrion/universe/Planet.h 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/Planet.h 2008-04-27 02:55:07 UTC (rev 2529) @@ -92,24 +92,24 @@ //@} /** \name Accessors */ //@{ - PlanetType Type() const {return m_type;} - PlanetSize Size() const {return m_size;} - PlanetEnvironment Environment() const; + PlanetType Type() const {return m_type;} + PlanetSize Size() const {return m_size;} + PlanetEnvironment Environment() const; - Year OrbitalPeriod() const; - Radian InitialOrbitalPosition() const; - Day RotationalPeriod() const; - Degree AxialTilt() const; + Year OrbitalPeriod() const; + Radian InitialOrbitalPosition() const; + Day RotationalPeriod() const; + Degree AxialTilt() const; - const std::set<int>& Buildings() const {return m_buildings;} + const std::set<int>& Buildings() const {return m_buildings;} - double AvailableTrade() const; ///< returns the trade available at this planet for use in building maintenance - double BuildingCosts() const; ///< returns the cost in trade for the upkeep of all currently-enabled buildings + double AvailableTrade() const; ///< returns the trade available at this planet for use in building maintenance + double BuildingCosts() const; ///< returns the cost in trade for the upkeep of all currently-enabled buildings /** Returns true iff this Planet contains a building with ID \a id. */ - bool ContainsBuilding(int id) const {return m_buildings.find(id) != m_buildings.end();} + bool ContainsBuilding(int id) const {return m_buildings.find(id) != m_buildings.end();} - bool IsAboutToBeColonized() const {return m_is_about_to_be_colonized;} + bool IsAboutToBeColonized() const {return m_is_about_to_be_colonized;} ///////////////////////////////////////////////////////////////////////////// // V0.3 ONLY!!!! @@ -117,91 +117,85 @@ // V0.3 ONLY!!!! ///////////////////////////////////////////////////////////////////////////// - virtual UniverseObject::Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. + virtual UniverseObject::Visibility GetVisibility(int empire_id) const; ///< returns the visibility status of this universe object relative to the input empire. - virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; + virtual UniverseObject* Accept(const UniverseObjectVisitor& visitor) const; - virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn - 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 + virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn + 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 - virtual const Meter* GetMeter(MeterType type) const {return UniverseObject::GetMeter(type);} + virtual const Meter* GetMeter(MeterType type) const {return UniverseObject::GetMeter(type);} //@} /** \name Mutators */ //@{ - virtual void MovementPhase(); - virtual void ApplyUniverseTableMaxMeterAdjustments(); - virtual void PopGrowthProductionResearchPhase(); + virtual void MovementPhase(); + virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); + virtual void PopGrowthProductionResearchPhase(); - virtual Meter* GetMeter(MeterType type) {return UniverseObject::GetMeter(type);} + virtual Meter* GetMeter(MeterType type) {return UniverseObject::GetMeter(type);} ///////////////////////////////////////////////////////////////////////////// // V0.3 ONLY!!!! - void AdjustDefBases(int bases) {m_def_bases += bases; if (m_def_bases < 0) m_def_bases = 0; StateChangedSignal();} + void AdjustDefBases(int bases) {m_def_bases += bases; if (m_def_bases < 0) m_def_bases = 0; StateChangedSignal();} // V0.3 ONLY!!!! ///////////////////////////////////////////////////////////////////////////// - void SetType(PlanetType type); ///< sets the type of this Planet to \a type - void SetSize(PlanetSize size); ///< sets the size of this Planet to \a size + void SetType(PlanetType type); ///< sets the type of this Planet to \a type + void SetSize(PlanetSize size); ///< sets the size of this Planet to \a size /** randomly generates an orbital period based on the orbit this planet is in, and whether it is tidally locked. */ - void SetOrbitalPeriod(int orbit, bool tidal_lock); + void SetOrbitalPeriod(int orbit, bool tidal_lock); - void SetRotationalPeriod(Day days); ///< sets the rotational period of this planet - void SetHighAxialTilt(); ///< randomly generates a new, high axial tilt + void SetRotationalPeriod(Day days); ///< sets the rotational period of this planet + void SetHighAxialTilt(); ///< randomly generates a new, high axial tilt - void AddBuilding(int building_id); ///< adds the building to the planet - bool RemoveBuilding(int building_id); ///< removes the building from the planet; returns false if no such building was found - bool DeleteBuilding(int building_id); ///< removes the building from the planet and deletes it; returns false if no such building was found + void AddBuilding(int building_id); ///< adds the building to the planet + bool RemoveBuilding(int building_id); ///< removes the building from the planet; returns false if no such building was found + bool DeleteBuilding(int building_id); ///< removes the building from the planet and deletes it; returns false if no such building was found - void SetAvailableTrade(double trade); ///< sets the trade available at this planet for use in building maintenance + void SetAvailableTrade(double trade); ///< sets the trade available at this planet for use in building maintenance - virtual void AddOwner (int id); ///< adds the Empire with ID \a id to the list of owners of this planet, update system owners and empire planets - virtual void RemoveOwner(int id); ///< removes the Empire with ID \a id to the list of owners of this planet, update system owners and empire planets + virtual void AddOwner (int id); ///< adds the Empire with ID \a id to the list of owners of this planet, update system owners and empire planets + virtual void RemoveOwner(int id); ///< removes the Empire with ID \a id to the list of owners of this planet, update system owners and empire planets - /// Resets the meters, specials, etc., of a planet to an unowned state. This should be called when a planet is wiped out due to starvation, etc. - void Reset(); + void Reset(); ///< Resets the meters, specials, etc., of a planet to an unowned state. This should be called when a planet is wiped out due to starvation, etc. - /// Called during combat when a planet changes hands - void Conquer(int conquerer); - - /// Called during colonization when a planet is about to be colonized - void SetIsAboutToBeColonized(bool b); - - /// Called after colonization, to reset the number of prospective colonizers to 0 - void ResetIsAboutToBeColonized(); + void Conquer(int conquerer); ///< Called during combat when a planet changes hands + void SetIsAboutToBeColonized(bool b); ///< Called during colonization when a planet is about to be colonized + void ResetIsAboutToBeColonized(); ///< Called after colonization, to reset the number of prospective colonizers to 0 //@} - static PlanetEnvironment Environment(PlanetType type); ///< returns the environment that corresponds to each planet type + static PlanetEnvironment Environment(PlanetType type); ///< returns the environment that corresponds to each planet type protected: void Init(); private: - UniverseObject* This() {return this;} + UniverseObject* This() {return this;} - virtual void InsertMeter(MeterType meter_type, Meter meter) {UniverseObject::InsertMeter(meter_type, meter);} + virtual void InsertMeter(MeterType meter_type, Meter meter) {UniverseObject::InsertMeter(meter_type, meter);} - virtual const Meter* GetPopMeter() const {return GetMeter(METER_POPULATION);} + virtual const Meter* GetPopMeter() const {return GetMeter(METER_POPULATION);} - PlanetType m_type; - PlanetSize m_size; - Year m_orbital_period; - Radian m_initial_orbital_position; - Day m_rotational_period; - Degree m_axial_tilt; + PlanetType m_type; + PlanetSize m_size; + Year m_orbital_period; + Radian m_initial_orbital_position; + Day m_rotational_period; + Degree m_axial_tilt; - std::set<int> m_buildings; - double m_available_trade; + std::set<int> m_buildings; + double m_available_trade; - bool m_just_conquered; + bool m_just_conquered; - bool m_is_about_to_be_colonized; + bool m_is_about_to_be_colonized; ///////////////////////////////////////////////////////////////////////////// // V0.3 ONLY!!!! - int m_def_bases; + int m_def_bases; // V0.3 ONLY!!!! ///////////////////////////////////////////////////////////////////////////// Modified: trunk/FreeOrion/universe/PopCenter.cpp =================================================================== --- trunk/FreeOrion/universe/PopCenter.cpp 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/PopCenter.cpp 2008-04-27 02:55:07 UTC (rev 2529) @@ -170,13 +170,16 @@ } } -void PopCenter::ApplyUniverseTableMaxMeterAdjustments() +void PopCenter::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) { UniverseObject* object = GetObjectSignal(); assert(object); - // determine meter maxes; they should have been previously reset to 0, then adjusted by Specials, Building effects, etc. - GetMeter(METER_POPULATION)->AdjustMax(MaxPopModFromObject(object)); - GetMeter(METER_HEALTH)->AdjustMax(MaxHealthModFromObject(object)); + + if (meter_type == INVALID_METER_TYPE || meter_type == METER_POPULATION) + GetMeter(METER_POPULATION)->AdjustMax(MaxPopModFromObject(object)); + + if (meter_type == INVALID_METER_TYPE || meter_type == METER_HEALTH) + GetMeter(METER_HEALTH)->AdjustMax(MaxHealthModFromObject(object)); } void PopCenter::PopGrowthProductionResearchPhase() Modified: trunk/FreeOrion/universe/PopCenter.h =================================================================== --- trunk/FreeOrion/universe/PopCenter.h 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/PopCenter.h 2008-04-27 02:55:07 UTC (rev 2529) @@ -38,13 +38,13 @@ DensityType PopDensity() const; ///< returns the density of this center, based on its population double AvailableFood() const {return m_available_food;} ///< returns the amount of food which is currently available - virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn - 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 + virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn + 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 - double FuturePopGrowth() const; ///< predicts by which amount the population will grow next turn, AvailableFood might limit growth rate - double FuturePopGrowthMax() const; ///< predicts by which amount the population will grow at maximum next turn (assuming there is enough food) - double FutureHealthGrowth() const; ///< predicts by which amount the health meter will grow next turn + double FuturePopGrowth() const; ///< predicts by which amount the population will grow next turn, AvailableFood might limit growth rate + double FuturePopGrowthMax() const; ///< predicts by which amount the population will grow at maximum next turn (assuming there is enough food) + double FutureHealthGrowth() const; ///< predicts by which amount the health meter will grow next turn //@} /** \name Mutators */ //@{ @@ -52,32 +52,32 @@ /** adjusts the population by \a pop, down to a minimum of 0.0, or up to a maximum of MaxPop(). This function returns the (positive) pop surplus, or the (negative) pop deficit that would result from adjusting the population by \a pop points, or 0 if the adjustment falls within [0.0, MaxPop()]*/ - double AdjustPop(double pop); + double AdjustPop(double pop); - void SetRace(int race) {m_race = race;} ///< sets the race of the population to \a race - void SetAvailableFood(double available_food) {m_available_food = available_food;} ///< sets the amount of food which is currently available + void SetRace(int race) {m_race = race;} ///< sets the race of the population to \a race + void SetAvailableFood(double available_food) {m_available_food = available_food;} ///< sets the amount of food which is currently available - virtual void ApplyUniverseTableMaxMeterAdjustments(); - virtual void PopGrowthProductionResearchPhase(); + virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); + virtual void PopGrowthProductionResearchPhase(); - void Reset(double max_pop_mod, double max_health_mod); ///< Resets the meters, etc. This should be called when a PopCenter is wiped out due to starvation, etc. + void Reset(double max_pop_mod, double max_health_mod); ///< Resets the meters, etc. This should be called when a PopCenter is wiped out due to starvation, etc. //@} protected: - mutable GetObjectSignalType GetObjectSignal; ///< the UniverseObject-retreiving signal object for this PopCenter + mutable GetObjectSignalType GetObjectSignal; ///< the UniverseObject-retreiving signal object for this PopCenter - void Init(double max_pop_mod, double max_health_mod); ///< initialization that needs to be called by derived class after derived class is constructed + void Init(double max_pop_mod, double max_health_mod); ///< initialization that needs to be called by derived class after derived class is constructed private: - PopCenter(); ///< default ctor + PopCenter(); ///< default ctor - virtual const Meter* GetMeter(MeterType type) const = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object - virtual Meter* GetMeter(MeterType type) = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object + virtual const Meter* GetMeter(MeterType type) const = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object + virtual Meter* GetMeter(MeterType type) = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object - virtual void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implimentation should add \a meter to the object so that it can be accessed with the GetMeter() functions + virtual void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implimentation should add \a meter to the object so that it can be accessed with the GetMeter() functions - int m_race; ///< the id of the race that occupies this planet - double m_available_food; + int m_race; ///< the id of the race that occupies this planet + double m_available_food; friend class boost::serialization::access; template <class Archive> Modified: trunk/FreeOrion/universe/ResourceCenter.cpp =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.cpp 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/ResourceCenter.cpp 2008-04-27 02:55:07 UTC (rev 2529) @@ -187,51 +187,47 @@ ResourceCenterChangedSignal(); } -void ResourceCenter::ApplyUniverseTableMaxMeterAdjustments() +void ResourceCenter::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) { // determine meter maxes; they should have been previously reset to 0 double primary_specialized_factor = ProductionDataTables()["FocusMods"][0][0]; double secondary_specialized_factor = ProductionDataTables()["FocusMods"][1][0]; double primary_balanced_factor = ProductionDataTables()["FocusMods"][2][0]; double secondary_balanced_factor = ProductionDataTables()["FocusMods"][3][0]; - GetMeter(METER_CONSTRUCTION)->AdjustMax(10.0); // default construction max is 20 + UniverseObject* object = GetObjectSignal(); assert(object); - GetMeter(METER_FARMING)->AdjustMax(MaxFarmingModFromObject(object)); - GetMeter(METER_INDUSTRY)->AdjustMax(MaxIndustryModFromObject(object)); - switch (m_primary) { - case FOCUS_BALANCED: - GetMeter(METER_FARMING)->AdjustMax(primary_balanced_factor); - GetMeter(METER_INDUSTRY)->AdjustMax(primary_balanced_factor); - GetMeter(METER_MINING)->AdjustMax(primary_balanced_factor); - GetMeter(METER_RESEARCH)->AdjustMax(primary_balanced_factor); - GetMeter(METER_TRADE)->AdjustMax(primary_balanced_factor); - break; - case FOCUS_FARMING: GetMeter(METER_FARMING)->AdjustMax(primary_specialized_factor); break; - case FOCUS_INDUSTRY: GetMeter(METER_INDUSTRY)->AdjustMax(primary_specialized_factor); break; - case FOCUS_MINING: GetMeter(METER_MINING)->AdjustMax(primary_specialized_factor); break; - case FOCUS_RESEARCH: GetMeter(METER_RESEARCH)->AdjustMax(primary_specialized_factor ); break; - case FOCUS_TRADE: GetMeter(METER_TRADE)->AdjustMax(primary_specialized_factor); break; + // special cases for construction, farming and industry + if (meter_type == INVALID_METER_TYPE || meter_type == METER_CONSTRUCTION) + GetMeter(METER_CONSTRUCTION)->AdjustMax(10.0); // default construction max is 20 + if (meter_type == INVALID_METER_TYPE || meter_type == METER_FARMING) + GetMeter(METER_FARMING)->AdjustMax(MaxFarmingModFromObject(object)); + if (meter_type == INVALID_METER_TYPE || meter_type == METER_INDUSTRY) + GetMeter(METER_INDUSTRY)->AdjustMax(MaxIndustryModFromObject(object)); - default: break; - } - switch (m_secondary) { - case FOCUS_BALANCED: - GetMeter(METER_FARMING)->AdjustMax(secondary_balanced_factor); - GetMeter(METER_INDUSTRY)->AdjustMax(secondary_balanced_factor); - GetMeter(METER_MINING)->AdjustMax(secondary_balanced_factor); - GetMeter(METER_RESEARCH)->AdjustMax(secondary_balanced_factor); - GetMeter(METER_TRADE)->AdjustMax(secondary_balanced_factor); - break; + // general-cases for all resource meters + std::vector<MeterType> res_meter_types; + res_meter_types.push_back(METER_FARMING); res_meter_types.push_back(METER_MINING); res_meter_types.push_back(METER_INDUSTRY); + res_meter_types.push_back(METER_RESEARCH); res_meter_types.push_back(METER_TRADE); - case FOCUS_FARMING: GetMeter(METER_FARMING)->AdjustMax(secondary_specialized_factor); break; - case FOCUS_INDUSTRY: GetMeter(METER_INDUSTRY)->AdjustMax(secondary_specialized_factor); break; - case FOCUS_MINING: GetMeter(METER_MINING)->AdjustMax(secondary_specialized_factor); break; - case FOCUS_RESEARCH: GetMeter(METER_RESEARCH)->AdjustMax(secondary_specialized_factor); break; - case FOCUS_TRADE: GetMeter(METER_TRADE)->AdjustMax(secondary_specialized_factor); break; + // all meters matching parameter meter_type should be adjusted, depending on focus + for (unsigned int i = 0; i < res_meter_types.size(); ++i) { + const MeterType CUR_METER_TYPE = res_meter_types[i]; - default: break; + if (meter_type == INVALID_METER_TYPE || meter_type == CUR_METER_TYPE) { + Meter* meter = GetMeter(CUR_METER_TYPE); + + if (m_primary == MeterToFocus(CUR_METER_TYPE)) + meter->AdjustMax(primary_specialized_factor); + else if (m_primary == FOCUS_BALANCED) + meter->AdjustMax(primary_balanced_factor); + + if (m_secondary == MeterToFocus(CUR_METER_TYPE)) + meter->AdjustMax(secondary_specialized_factor); + else if (m_secondary == FOCUS_BALANCED) + meter->AdjustMax(secondary_balanced_factor); + } } } Modified: trunk/FreeOrion/universe/ResourceCenter.h =================================================================== --- trunk/FreeOrion/universe/ResourceCenter.h 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/ResourceCenter.h 2008-04-27 02:55:07 UTC (rev 2529) @@ -31,42 +31,41 @@ //@} /** \name Accessors */ //@{ - FocusType PrimaryFocus() const {return m_primary;} - FocusType SecondaryFocus() const {return m_secondary;} + FocusType PrimaryFocus() const {return m_primary;} + FocusType SecondaryFocus() const {return m_secondary;} - virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn - 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 + virtual double ProjectedCurrentMeter(MeterType type) const; ///< returns expected value of specified meter current value on the next turn + 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 ResourceCenterChangedSignalType ResourceCenterChangedSignal; ///< the state changed signal object for this ResourceCenter //@} /** \name Mutators */ //@{ - void SetPrimaryFocus(FocusType focus); - void SetSecondaryFocus(FocusType focus); + void SetPrimaryFocus(FocusType focus); + void SetSecondaryFocus(FocusType focus); - virtual void ApplyUniverseTableMaxMeterAdjustments(); - virtual void PopGrowthProductionResearchPhase(); + virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); + virtual void PopGrowthProductionResearchPhase(); - /// Resets the meters, etc. This should be called when a ResourceCenter is wiped out due to starvation, etc. - void Reset(); + void Reset(); /// Resets the meters, etc. This should be called when a ResourceCenter is wiped out due to starvation, etc. //@} protected: mutable GetObjectSignalType GetObjectSignal; ///< the UniverseObject-retreiving signal object for this ResourceCenter - void Init(); ///< initialization that needs to be called by derived class after derived class is constructed + void Init(); ///< initialization that needs to be called by derived class after derived class is constructed private: FocusType m_primary; FocusType m_secondary; - virtual const Meter* GetPopMeter() const = 0; ///< implimentation should return the population meter to use when calculating meter points for this resource center + virtual const Meter* GetPopMeter() const = 0; ///< implimentation should return the population meter to use when calculating meter points for this resource center - virtual const Meter* GetMeter(MeterType type) const = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object - virtual Meter* GetMeter(MeterType type) = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object + virtual const Meter* GetMeter(MeterType type) const = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object + virtual Meter* GetMeter(MeterType type) = 0; ///< implimentation should return the requested Meter, or 0 if no such Meter of that type is found in this object - virtual void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implimentation should add \a meter to the object so that it can be accessed with the GetMeter() functions + virtual void InsertMeter(MeterType meter_type, Meter meter) = 0; ///< implimentation should add \a meter to the object so that it can be accessed with the GetMeter() functions friend class boost::serialization::access; template <class Archive> Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/Universe.cpp 2008-04-27 02:55:07 UTC (rev 2529) @@ -580,8 +580,15 @@ } } -void Universe::UpdateMeterEstimates() +void Universe::UpdateMeterEstimates(MeterType meter_type, bool update_contained_objects) { + UpdateMeterEstimates(UniverseObject::INVALID_OBJECT_ID, meter_type, update_contained_objects); +} + +void Universe::UpdateMeterEstimates(int object_id, MeterType meter_type, bool update_contained_objects) +{ + //std::vector<int> + m_effect_accounting_map.clear(); // for all objects to see if they have meters that need to be processed @@ -590,10 +597,10 @@ int object_id = obj_it->first; // Reset max meters to METER_MIN - obj->ResetMaxMeters(); + obj->ResetMaxMeters(meter_type); // Apply non-effect focus mods from tables - obj->ApplyUniverseTableMaxMeterAdjustments(); + obj->ApplyUniverseTableMaxMeterAdjustments(meter_type); // record value of max meters after applying universe table adjustments for (MeterType type = MeterType(0); type != NUM_METER_TYPES; type = MeterType(type + 1)) { @@ -1972,8 +1979,8 @@ // Apply non-effect meter adjustments for (Universe::const_iterator it = GetUniverse().begin(); it != GetUniverse().end(); ++it) { - it->second->ResetMaxMeters(); // zero all meters - it->second->ApplyUniverseTableMaxMeterAdjustments(); // apply non-effects max meter modifications, including focus mods + it->second->ResetMaxMeters(); // zero all meters + it->second->ApplyUniverseTableMaxMeterAdjustments(); // apply non-effects max meter modifications, including focus mods } // Apply effects for 1st turn Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/Universe.h 2008-04-27 02:55:07 UTC (rev 2529) @@ -231,10 +231,17 @@ */ void InitMeterEstimatesAndDiscrepancies(); - /** Based on (known, if in a client) universe and any orders given so far this turn, estimates what meter maxes will be - * next turn, and updates the predicted values accordingly. + /** Based on (known subset of, if in a client) universe and any orders given so far this turn, estimates what meter maxes + * will be next turn, and updates the predicted values accordingly. If \a object_id is INVALID_OBJECT_ID, all objects + * in universe have their meter(s) updated. If \a object_id is a valid object id, just that object's meter(s) are updated, + * unless \a update_contained_object is true, in which case all objects contained within the object with id \a object_id + * also have their meters updated. If \a meter_type is INVALID_METER_TYPE, all meter types are updated, but if + * \a meter_type is a valid meter type, just that type of meter is updated. */ - void UpdateMeterEstimates(); + void UpdateMeterEstimates(int object_id, MeterType meter_type = INVALID_METER_TYPE, bool update_contained_objects = false); + /** Calls 3-parameter UpdateMeterEstimates with object_id = UniverseObject::INVALID_METER_TYPE + */ + void UpdateMeterEstimates(MeterType meter_type = INVALID_METER_TYPE, bool update_contained_objects = false); /** 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 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2008-04-27 02:55:07 UTC (rev 2529) @@ -237,13 +237,20 @@ m_specials.erase(name); } -void UniverseObject::ResetMaxMeters() +void UniverseObject::ResetMaxMeters(MeterType meter_type) { - for (std::map<MeterType, Meter>::iterator it = m_meters.begin(); it != m_meters.end(); ++it) - it->second.ResetMax(); + if (meter_type == INVALID_METER_TYPE) { + for (std::map<MeterType, Meter>::iterator it = m_meters.begin(); it != m_meters.end(); ++it) + it->second.ResetMax(); + } else { + if (Meter* meter = GetMeter(meter_type)) + meter->ResetMax(); + else + Logger().errorStream() << "UniverseObject::ResetMaxMeters called with MeterType this object does not have"; + } } -void UniverseObject::ApplyUniverseTableMaxMeterAdjustments() +void UniverseObject::ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type) {} void UniverseObject::ClampMeters() Modified: trunk/FreeOrion/universe/UniverseObject.h =================================================================== --- trunk/FreeOrion/universe/UniverseObject.h 2008-04-27 01:31:48 UTC (rev 2528) +++ trunk/FreeOrion/universe/UniverseObject.h 2008-04-27 02:55:07 UTC (rev 2529) @@ -125,13 +125,17 @@ a turn. */ virtual void MovementPhase() = 0; - /** sets all the max meter values for all meters in this UniverseObject to Meter::METER_MIN. This should be done before any - Effects act on the object. */ - void ResetMaxMeters(); + /** sets max meter value(s) for meter(s) in this UniverseObject to Meter::METER_MIN. This should be done before any + * Effects that alter meter(s) act on the object. if \a meter_type is INVALID_METER_TYPE, all meters are reset. if + * \a meter_type is a valid meter type, just that meter is reset. + */ + void ResetMaxMeters(MeterType meter_type = INVALID_METER_TYPE); - /** adjusts the max meter values for all meters in this UniverseObject, based on its own properties. This does not include - Effects acting on the object, which should already have been executed before this function is called. */ - virtual void ApplyUniverseTableMaxMeterAdjustments(); + /** adjusts max meter value(s) for meter(s) in this UniverseObject, based on its own properties (ie. not due to effects). + * if \a meter_type is INVALID_METER_TYPE, all meter(s) are adjusted. If \a meter_type is a valid meter type, just that + * meter is adjusted. + */ + virtual void ApplyUniverseTableMaxMeterAdjustments(MeterType meter_type = INVALID_METER_TYPE); /** calls Clamp() on each meter in this UniverseObject, to ensure that no Meter's Max() falls outisde the range [Meter::METER_MIN, METER::METER_MAX]and that no Meter's Current() value exceed its Max() value. */ void ClampMeters(); |
From: <geo...@us...> - 2007-09-04 00:30:11
|
Revision: 2249 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=2249&view=rev Author: geoffthemedio Date: 2007-09-03 17:30:13 -0700 (Mon, 03 Sep 2007) Log Message: ----------- Fixed crash bug with fleet move paths that would occur if Universe::ALL_OBJECTS_VISIBLE was set true. The issue was related to fleet route filtering being based on whether the encoding empire could reach a system, instead of the fleet's owner. Modified Paths: -------------- trunk/FreeOrion/universe/Fleet.cpp trunk/FreeOrion/universe/Fleet.h Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2007-09-02 20:42:17 UTC (rev 2248) +++ trunk/FreeOrion/universe/Fleet.cpp 2007-09-04 00:30:13 UTC (rev 2249) @@ -16,8 +16,9 @@ namespace { const double MAX_SHIP_SPEED = 500.0; // max allowed speed of ship movement - inline bool SystemNotReachable(System* system) - { return !GetUniverse().SystemReachable(system->ID(), Universe::s_encoding_empire); } + inline bool SystemNotReachable(System* system, int empire_id) { + return !GetUniverse().SystemReachable(system->ID(), empire_id); + } } // static(s) @@ -97,6 +98,7 @@ if (route.empty()) return retval; // nowhere to go => empty path if (route.size() == 2 && route.front() == route.back()) return retval; // nowhere to go => empty path + if (this->Speed() < 1.0e-5) return retval; // unable to move (epsilon taken from Fleet::MovementPhase()) MovePathNode cur_pos(this->X(), this->Y(), true, 0); // initialize to initial position of fleet. @@ -523,17 +525,25 @@ } } -void Fleet::GetVisibleRoute(std::list<System*>& travel_route, int moving_to) +void Fleet::ShortenRouteToEndAtSystem(std::list<System*>& travel_route, int last_system) { std::list<System*>::iterator visible_end_it; - if (moving_to != m_moving_to) { - System* final_destination = GetUniverse().Object<System>(moving_to); + if (last_system != m_moving_to) { + // The system the fleet will appear to be moving to it's actually it's final destination. remove any + // extra systems from the route after the apparent destination + System* final_destination = GetUniverse().Object<System>(last_system); assert(std::find(m_travel_route.begin(), m_travel_route.end(), final_destination) != m_travel_route.end()); visible_end_it = ++std::find(m_travel_route.begin(), m_travel_route.end(), final_destination); } else { visible_end_it = m_travel_route.end(); } - std::list<System*>::iterator end_it = std::find_if(m_travel_route.begin(), visible_end_it, boost::bind(&SystemNotReachable, _1)); + + int fleet_owner = -1; + const std::set<int>& owners = Owners(); + if (owners.size() == 1) + fleet_owner = *(owners.begin()); + + std::list<System*>::iterator end_it = std::find_if(m_travel_route.begin(), visible_end_it, boost::bind(&SystemNotReachable, _1, fleet_owner)); std::copy(m_travel_route.begin(), end_it, std::back_inserter(travel_route)); // If no Systems in a nonempty route are known reachable, put a null pointer in the route as a sentinel indicating // that the route is unknown, but needs not be recomputed. Modified: trunk/FreeOrion/universe/Fleet.h =================================================================== --- trunk/FreeOrion/universe/Fleet.h 2007-09-02 20:42:17 UTC (rev 2248) +++ trunk/FreeOrion/universe/Fleet.h 2007-09-04 00:30:13 UTC (rev 2249) @@ -113,7 +113,7 @@ private: void CalculateRoute() const; // sets m_travel_route and m_travel_distance to their proper values based on the other member data void RecalculateFleetSpeed(); // recalculates the speed of the fleet by finding the lowest speed of the ships in the fleet. - void GetVisibleRoute(std::list<System*>& travel_route, int moving_to); + void ShortenRouteToEndAtSystem(std::list<System*>& travel_route, int last_system); // removes any systems on the route after the specified system ShipIDSet m_ships; int m_moving_to; @@ -150,7 +150,7 @@ if (Archive::is_saving::value) { moving_to = (Universe::ALL_OBJECTS_VISIBLE || vis == FULL_VISIBILITY) ? m_moving_to : m_next_system; if (1 <= version) { - GetVisibleRoute(travel_route, moving_to); + ShortenRouteToEndAtSystem(travel_route, moving_to); travel_distance = m_travel_distance; if (!travel_route.empty() && travel_route.front() != 0 && travel_route.size() != m_travel_route.size()) { if (moving_to == m_moving_to) |