From: <geo...@us...> - 2014-08-16 09:43:14
|
Revision: 7475 http://sourceforge.net/p/freeorion/code/7475 Author: geoffthemedio Date: 2014-08-16 09:43:05 +0000 (Sat, 16 Aug 2014) Log Message: ----------- Removed some do-nothing safety checks to quiet warnings. Modified Paths: -------------- trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/System.cpp Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2014-08-16 09:33:02 UTC (rev 7474) +++ trunk/FreeOrion/universe/Condition.cpp 2014-08-16 09:43:05 UTC (rev 7475) @@ -230,9 +230,6 @@ if (this == &rhs) return true; - if (!this) - return false; - if (typeid(*this) != typeid(rhs)) return false; Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2014-08-16 09:33:02 UTC (rev 7474) +++ trunk/FreeOrion/universe/System.cpp 2014-08-16 09:43:05 UTC (rev 7475) @@ -216,8 +216,6 @@ const std::string& System::ApparentName(int empire_id, bool blank_unexplored_and_none/* = false*/) const { static const std::string EMPTY_STRING; - if (!this) - return EMPTY_STRING; if (empire_id == ALL_EMPIRES) return this->PublicName(empire_id); |
From: <dil...@us...> - 2014-08-17 09:15:02
|
Revision: 7486 http://sourceforge.net/p/freeorion/code/7486 Author: dilvish-fo Date: 2014-08-17 09:14:57 +0000 (Sun, 17 Aug 2014) Log Message: ----------- changes TechManager::RecursivePrereqs so that unless directed to ignore knowledge, prereqs already researched by the empire will not be included in the results and will not be recursed into. Modified Paths: -------------- trunk/FreeOrion/universe/Tech.cpp trunk/FreeOrion/universe/Tech.h Modified: trunk/FreeOrion/universe/Tech.cpp =================================================================== --- trunk/FreeOrion/universe/Tech.cpp 2014-08-17 08:52:58 UTC (rev 7485) +++ trunk/FreeOrion/universe/Tech.cpp 2014-08-17 09:14:57 UTC (rev 7486) @@ -530,7 +530,7 @@ return manager; } -std::vector<std::string> TechManager::RecursivePrereqs(const std::string& tech_name, int empire_id) const { +std::vector<std::string> TechManager::RecursivePrereqs(const std::string& tech_name, int empire_id, bool min_required /*= true*/) const { const Tech* tech = this->GetTech(tech_name); if (!tech) return std::vector<std::string>(); @@ -543,6 +543,7 @@ // initialize working list with 1st order prereqs std::set<std::string> cur_prereqs = tech->Prerequisites(); std::copy(cur_prereqs.begin(), cur_prereqs.end(), std::back_inserter(prereqs_list)); + const Empire* empire = Empires().Lookup(empire_id); // traverse list, appending new prereqs to it, and putting unique prereqs into set for (std::list<std::string>::iterator it = prereqs_list.begin(); it != prereqs_list.end(); ++it) { @@ -552,6 +553,10 @@ // check if this tech is already in the map of prereqs. If so, it has already been processed, and can be skipped. if (prereqs_set.find(cur_name) != prereqs_set.end()) continue; + // if this tech is already known and min_required==true, can skip. + if (min_required && empire && (empire->GetTechStatus(cur_name) == TS_COMPLETE)) + continue; + // tech is new, so put it into the set of already-processed prereqs prereqs_set.insert(cur_name); // and the map of techs, sorted by cost Modified: trunk/FreeOrion/universe/Tech.h =================================================================== --- trunk/FreeOrion/universe/Tech.h 2014-08-17 08:52:58 UTC (rev 7485) +++ trunk/FreeOrion/universe/Tech.h 2014-08-17 09:14:57 UTC (rev 7486) @@ -261,8 +261,9 @@ category_iterator category_end(const std::string& name) const; /** Returns names of indicated tech's prerequisites, and all prereqs of - * those techs, etc. recursively. */ - std::vector<std::string> RecursivePrereqs(const std::string& tech_name, int empire_id) const; + * those techs, etc. recursively. If \a min_required is false then prereqs + * will be included and recursed into even if already known to the empire. */ + std::vector<std::string> RecursivePrereqs(const std::string& tech_name, int empire_id, bool min_required = true) const; //@} /** returns the instance of this singleton class; you should use the free function GetTechManager() instead */ |
From: <geo...@us...> - 2014-08-22 21:34:40
|
Revision: 7565 http://sourceforge.net/p/freeorion/code/7565 Author: geoffthemedio Date: 2014-08-22 21:34:32 +0000 (Fri, 22 Aug 2014) Log Message: ----------- Initial structure / code for Condition::Location, which gets the location condition of some content (building type, focus, special, etc.) and evaluates that on its input. Modified Paths: -------------- trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Condition.h Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2014-08-22 21:27:51 UTC (rev 7564) +++ trunk/FreeOrion/universe/Condition.cpp 2014-08-22 21:34:32 UTC (rev 7565) @@ -12,6 +12,7 @@ #include "Planet.h" #include "System.h" #include "Species.h" +#include "Special.h" #include "Meter.h" #include "ValueRef.h" #include "../Empire/Empire.h" @@ -89,6 +90,9 @@ boost::bind(&std::map< int, TemporaryPtr< UniverseObject > >::value_type::second,_1) ); } + /** Attempts to cast \a obj to a Fleet pointer. If that fails, attempts to + * cast \a obj to a Ship pointer, and then get the Fleet of the ship. If + * both fail then returns a null object Fleet pointer. */ TemporaryPtr<const Fleet> FleetFromObject(TemporaryPtr<const UniverseObject> obj) { TemporaryPtr<const Fleet> retval = boost::dynamic_pointer_cast<const Fleet>(obj); if (!retval) { @@ -98,6 +102,11 @@ return retval; } + /** Used by 4-parameter ConditionBase::Eval function, and some of its + * overrides, to scan through \a matches or \a non_matches set and apply + * \a pred to each object, to test if it should remain in its current set + * or be transferred from the \a search_domain specified set into the + * other. */ template <class Pred> void EvalImpl(Condition::ObjectSet& matches, Condition::ObjectSet& non_matches, Condition::SearchDomain search_domain, const Pred& pred) @@ -106,7 +115,9 @@ Condition::ObjectSet& to_set = search_domain == Condition::MATCHES ? non_matches : matches; for (Condition::ObjectSet::iterator it = from_set.begin(); it != from_set.end(); ) { bool match = pred(*it); - if ((search_domain == Condition::MATCHES && !match) || (search_domain == Condition::NON_MATCHES && match)) { + if ((search_domain == Condition::MATCHES && !match) || + (search_domain == Condition::NON_MATCHES && match)) + { to_set.push_back(*it); *it = from_set.back(); from_set.pop_back(); @@ -217,10 +228,12 @@ m_this(this_), m_parent_context(parent_context) {} + bool operator()(TemporaryPtr<const UniverseObject> candidate) const { return m_this->Match(ScriptingContext(m_parent_context, candidate)); } + const Condition::ConditionBase* m_this; - const ScriptingContext& m_parent_context; + const ScriptingContext& m_parent_context; }; Condition::ConditionBase::~ConditionBase() @@ -6667,7 +6680,195 @@ return low <= value && value <= high; } +/////////////////////////////////////////////////////////// +// Location // +/////////////////////////////////////////////////////////// +namespace { + const Condition::ConditionBase* GetLocationCondition(Condition::ContentType content_type, + const std::string& name1, + const std::string& name2) + { + if (name1.empty()) + return 0; + switch (content_type) { + case Condition::CONTENT_BUILDING: { + if (const BuildingType* bt = GetBuildingType(name1)) + return bt->Location(); + break; + } + case Condition::CONTENT_SPECIES: { + return 0; // species have no location conditions (but their foci do...) + } + case Condition::CONTENT_SHIP_HULL: { + if (const HullType* h = GetHullType(name1)) + return h->Location(); + break; + } + case Condition::CONTENT_SHIP_PART: { + if (const PartType* p = GetPartType(name1)) + return p->Location(); + break; + } + case Condition::CONTENT_SPECIAL: { + if (const Special* s = GetSpecial(name1)) + return s->Location(); + break; + } + case Condition::CONTENT_FOCUS : { + if (name2.empty()) + return 0; + // get species, then focus from that species + if (const Species* s = GetSpecies(name1)) { + const std::vector<FocusType>& foci = s->Foci(); + for (std::vector<FocusType>::const_iterator it = foci.begin(); + it != foci.end(); ++it) + { + const FocusType& f = *it; + if (f.Name() == name2) + return f.Location(); + } + } + break; + } + default: + return 0; + } + return 0; + } +} +Condition::Location::~Location() { + delete m_name1; + delete m_name2; +} + +bool Condition::Location::operator==(const Condition::ConditionBase& rhs) const { + if (this == &rhs) + return true; + if (typeid(*this) != typeid(rhs)) + return false; + + const Condition::Location& rhs_ = static_cast<const Condition::Location&>(rhs); + + if (m_content_type != rhs_.m_content_type) + return false; + + CHECK_COND_VREF_MEMBER(m_name1) + CHECK_COND_VREF_MEMBER(m_name2) + + return true; +} + +void Condition::Location::Eval(const ScriptingContext& parent_context, + ObjectSet& matches, ObjectSet& non_matches, + SearchDomain search_domain/* = NON_MATCHES*/) const +{ + bool simple_eval_safe = ((!m_name1 || m_name1->LocalCandidateInvariant()) && + (!m_name2 || m_name2->LocalCandidateInvariant()) && + (parent_context.condition_root_candidate || RootCandidateInvariant())); + + if (simple_eval_safe) { + // evaluate value and range limits once, use to match all candidates + TemporaryPtr<const UniverseObject> no_object; + ScriptingContext local_context(parent_context, no_object); + + std::string name1 = (m_name1 ? m_name1->Eval(local_context) : ""); + std::string name2 = (m_name2 ? m_name2->Eval(local_context) : ""); + + // get condition from content, apply to matches / non_matches + const ConditionBase* condition = GetLocationCondition(m_content_type, name1, name2); + if (condition && condition != this) { + condition->Eval(parent_context, matches, non_matches, search_domain); + } else { + // if somehow in a cyclical loop because some content's location + // was defined as Condition::Location or if there is no location + // condition, match nothing + if (search_domain == MATCHES) { + non_matches.insert(non_matches.end(), matches.begin(), matches.end()); + matches.clear(); + } + } + + } else { + // re-evaluate value and ranges for each candidate object + Condition::ConditionBase::Eval(parent_context, matches, non_matches, search_domain); + } +} + +bool Condition::Location::RootCandidateInvariant() const { + return (!m_name1 || m_name1->RootCandidateInvariant()) && + (!m_name2 || m_name2->RootCandidateInvariant()); +} + +bool Condition::Location::TargetInvariant() const { + return (!m_name1 || m_name1->TargetInvariant()) && + (!m_name2 || m_name2->TargetInvariant()); +} + +bool Condition::Location::SourceInvariant() const { + return (!m_name1 || m_name1->SourceInvariant()) && + (!m_name2 || m_name2->SourceInvariant()); +} + +std::string Condition::Location::Description(bool negated/* = false*/) const { + std::string name1_str; + if (m_name1) + name1_str = m_name1->Description(); + + std::string name2_str; + if (m_name2) + name2_str = m_name2->Description(); + + std::string content_type_str; + // todo: get content type as string + + return str(FlexibleFormat((!negated) + ? UserString("DESC_LOCATION") + : UserString("DESC_LOCATION_NOT")) + % content_type_str + % name1_str + % name2_str); +} + +std::string Condition::Location::Dump() const { + std::string retval = DumpIndent() + "Location content_type = "; + + switch (m_content_type) { + case CONTENT_BUILDING: retval += "Building"; break; + case CONTENT_FOCUS: retval += "Focus"; break; + case CONTENT_SHIP_HULL: retval += "Hull"; break; + case CONTENT_SHIP_PART: retval += "Part"; break; + case CONTENT_SPECIAL: retval += "Special"; break; + case CONTENT_SPECIES: retval += "Species"; break; + default: retval += "???"; + } + + if (m_name1) + retval += " name1 = " + m_name1->Dump(); + if (m_name2) + retval += " name2 = " + m_name2->Dump(); + return retval; +} + +bool Condition::Location::Match(const ScriptingContext& local_context) const { + TemporaryPtr<const UniverseObject> candidate = local_context.condition_local_candidate; + if (!candidate) { + Logger().errorStream() << "Location::Match passed no candidate object"; + return false; + } + + std::string name1 = (m_name1 ? m_name1->Eval(local_context) : ""); + std::string name2 = (m_name2 ? m_name2->Eval(local_context) : ""); + + const ConditionBase* condition = GetLocationCondition(m_content_type, name1, name2); + if (!condition || condition == this) + return false; + + // other Conditions' Match functions not directly callable, so can't do any + // better than just calling Eval for each candidate... + return condition->Eval(local_context, candidate); +} + /////////////////////////////////////////////////////////// // And // /////////////////////////////////////////////////////////// Modified: trunk/FreeOrion/universe/Condition.h =================================================================== --- trunk/FreeOrion/universe/Condition.h 2014-08-22 21:27:51 UTC (rev 7564) +++ trunk/FreeOrion/universe/Condition.h 2014-08-22 21:34:32 UTC (rev 7565) @@ -41,6 +41,15 @@ SORT_RANDOM ///< Objects will be selected randomly, without consideration of property values }; + enum ContentType { + CONTENT_BUILDING, + CONTENT_SPECIES, + CONTENT_SHIP_HULL, + CONTENT_SHIP_PART, + CONTENT_SPECIAL, + CONTENT_FOCUS + }; + struct ConditionBase; struct All; struct EmpireAffiliation; @@ -99,6 +108,7 @@ struct CanProduceShips; struct OrderedBombarded; struct ValueTest; + struct Location; } /** Returns a single string which describes a vector of Conditions. If multiple @@ -111,8 +121,8 @@ * subconditions the candidate matches, and indicate if the overall combination * of conditions matches the object. */ FO_COMMON_API std::string ConditionDescription(const std::vector<const Condition::ConditionBase*>& conditions, - TemporaryPtr<const UniverseObject> candidate_object = TemporaryPtr<const UniverseObject>(), - TemporaryPtr<const UniverseObject> source_object = TemporaryPtr<const UniverseObject>()); + TemporaryPtr<const UniverseObject> candidate_object = TemporaryPtr<const UniverseObject>(), + TemporaryPtr<const UniverseObject> source_object = TemporaryPtr<const UniverseObject>()); /** The base class for all Conditions. */ struct FO_COMMON_API Condition::ConditionBase { @@ -295,6 +305,8 @@ virtual bool operator==(const Condition::ConditionBase& rhs) const; virtual void Eval(const ScriptingContext& parent_context, Condition::ObjectSet& matches, Condition::ObjectSet& non_matches, SearchDomain search_domain = NON_MATCHES) const; + void Eval(Condition::ObjectSet& matches, Condition::ObjectSet& non_matches, + SearchDomain search_domain = NON_MATCHES) const { ConditionBase::Eval(matches, non_matches, search_domain); } virtual bool RootCandidateInvariant() const; virtual bool TargetInvariant() const; virtual bool SourceInvariant() const; @@ -331,6 +343,7 @@ virtual bool TargetInvariant() const { return true; } virtual bool SourceInvariant() const { return true; } +private: friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); @@ -1814,6 +1827,42 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Matches objects that match the location condition of the specified + * content. */ +struct FO_COMMON_API Condition::Location : public Condition::ConditionBase { +public: + Location(ContentType content_type, const ValueRef::ValueRefBase<std::string>* name1, + const ValueRef::ValueRefBase<std::string>* name2 = 0) : + m_name1(name1), + m_name2(name2), + m_content_type(content_type) + {} + virtual ~Location(); + virtual bool operator==(const Condition::ConditionBase& rhs) const; + virtual void Eval(const ScriptingContext& parent_context, Condition::ObjectSet& matches, + Condition::ObjectSet& non_matches, SearchDomain search_domain = NON_MATCHES) const; + void Eval(Condition::ObjectSet& matches, Condition::ObjectSet& non_matches, + SearchDomain search_domain = NON_MATCHES) const { ConditionBase::Eval(matches, non_matches, search_domain); } + virtual bool RootCandidateInvariant() const; + virtual bool TargetInvariant() const; + virtual bool SourceInvariant() const; + virtual std::string Description(bool negated = false) const; + virtual std::string Dump() const; + const ValueRef::ValueRefBase<std::string>* GetName1() const { return m_name1; } + const ValueRef::ValueRefBase<std::string>* GetName2() const { return m_name2; } + +private: + virtual bool Match(const ScriptingContext& local_context) const; + + const ValueRef::ValueRefBase<std::string>* m_name1; + const ValueRef::ValueRefBase<std::string>* m_name2; + ContentType m_content_type; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Matches all objects that match every Condition in \a operands. */ struct FO_COMMON_API Condition::And : public Condition::ConditionBase { And(const std::vector<const ConditionBase*>& operands) : @@ -2268,6 +2317,15 @@ } template <class Archive> +void Condition::Location::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) + & BOOST_SERIALIZATION_NVP(m_name1) + & BOOST_SERIALIZATION_NVP(m_name2) + & BOOST_SERIALIZATION_NVP(m_content_type); +} + +template <class Archive> void Condition::And::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) |
From: <geo...@us...> - 2015-01-14 21:36:14
|
Revision: 7833 http://sourceforge.net/p/freeorion/code/7833 Author: geoffthemedio Date: 2015-01-14 21:36:05 +0000 (Wed, 14 Jan 2015) Log Message: ----------- Added a Location condition getter function to Species, returning a Condition defined in C++ code. Modified Paths: -------------- trunk/FreeOrion/universe/Species.cpp trunk/FreeOrion/universe/Species.h Modified: trunk/FreeOrion/universe/Species.cpp =================================================================== --- trunk/FreeOrion/universe/Species.cpp 2015-01-13 03:41:00 UTC (rev 7832) +++ trunk/FreeOrion/universe/Species.cpp 2015-01-14 21:36:05 UTC (rev 7833) @@ -2,6 +2,7 @@ #include "Effect.h" #include "Condition.h" +#include "ValueRef.h" #include "../parse/Parse.h" #include "../util/OptionsDB.h" #include "../util/Directories.h" @@ -68,6 +69,9 @@ } } +Species::~Species() +{ delete m_location; } + std::string Species::Dump() const { std::string retval = DumpIndent() + "Species\n"; ++g_indent; @@ -131,6 +135,25 @@ return retval; } +const Condition::ConditionBase* Species::Location() const { + if (!m_location) { + // set up a Condition structure to match popcenters that have (not uninhabitable) environment for this species + std::vector<const ValueRef::ValueRefBase< ::PlanetEnvironment>*> environments_vec; + environments_vec.push_back(new ValueRef::Constant<PlanetEnvironment>( ::PE_UNINHABITABLE)); + const ValueRef::Constant<std::string>* this_species_name_ref = new ValueRef::Constant<std::string>(m_name); // m_name specifies this species + Condition::ConditionBase* enviro_cond = new Condition::Not(new Condition::PlanetEnvironment(environments_vec, this_species_name_ref)); + + Condition::ConditionBase* type_cond = new Condition::Type(new ValueRef::Constant<UniverseObjectType>( ::OBJ_POP_CENTER)); + + std::vector<const Condition::ConditionBase*> operands; + operands.push_back(enviro_cond); + operands.push_back(type_cond); + + m_location = new Condition::And(operands); + } + return m_location; +} + PlanetEnvironment Species::GetPlanetEnvironment(PlanetType planet_type) const { std::map<PlanetType, PlanetEnvironment>::const_iterator it = m_planet_environments.find(planet_type); if (it == m_planet_environments.end()) Modified: trunk/FreeOrion/universe/Species.h =================================================================== --- trunk/FreeOrion/universe/Species.h 2015-01-13 03:41:00 UTC (rev 7832) +++ trunk/FreeOrion/universe/Species.h 2015-01-14 21:36:05 UTC (rev 7833) @@ -101,6 +101,7 @@ m_preferred_focus(preferred_focus), m_planet_environments(planet_environments), m_effects(effects), + m_location(0), m_playable(params.playable), m_native(params.native), m_can_colonize(params.can_colonize), @@ -108,6 +109,8 @@ m_tags(tags), m_graphic(graphic) {} + + ~Species(); //@} /** \name Accessors */ //@{ @@ -119,6 +122,8 @@ const std::map<int, double>& EmpireOpinions() const { return m_empire_opinions; } ///< returns the positive/negative opinions of this species about empires const std::map<std::string, double>& OtherSpeciesOpinions() const{ return m_other_species_opinions; }///< returns the positive/negative opinions of this species about other species + const Condition::ConditionBase* Location() const; + std::string Dump() const; ///< returns a data file format representation of this object const std::vector<FocusType>& Foci() const { return m_foci; } ///< returns the focus types this species can use const std::string& PreferredFocus() const { return m_preferred_focus; } ///< returns the name of the planetary focus this species prefers. Default for new colonies and may affect happiness if on a different focus? @@ -159,6 +164,8 @@ std::vector<boost::shared_ptr<const Effect::EffectsGroup> > m_effects; + mutable Condition::ConditionBase* m_location; + bool m_playable; bool m_native; bool m_can_colonize; |
From: <geo...@us...> - 2015-01-16 14:46:50
|
Revision: 7845 http://sourceforge.net/p/freeorion/code/7845 Author: geoffthemedio Date: 2015-01-16 14:46:48 +0000 (Fri, 16 Jan 2015) Log Message: ----------- Changed ValueRef::NameToMeter parameter from by-value to const-reference. Modified Paths: -------------- trunk/FreeOrion/universe/ValueRef.cpp trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-01-16 11:13:47 UTC (rev 7844) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-01-16 14:46:48 UTC (rev 7845) @@ -203,7 +203,7 @@ } } -MeterType ValueRef::NameToMeter(std::string name) { +MeterType ValueRef::NameToMeter(const std::string& name) { MeterType retval = INVALID_METER_TYPE; std::map<std::string, MeterType>::const_iterator it = GetMeterNameMap().find(name); if (it != GetMeterNameMap().end()) Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2015-01-16 11:13:47 UTC (rev 7844) +++ trunk/FreeOrion/universe/ValueRef.h 2015-01-16 14:46:48 UTC (rev 7845) @@ -379,7 +379,7 @@ }; namespace ValueRef { - FO_COMMON_API MeterType NameToMeter(std::string name); + FO_COMMON_API MeterType NameToMeter(const std::string& name); FO_COMMON_API std::string MeterToName(MeterType meter); FO_COMMON_API std::string ReconstructName(const std::vector<std::string>& property_name, |
From: <geo...@us...> - 2015-01-17 09:53:48
|
Revision: 7846 http://sourceforge.net/p/freeorion/code/7846 Author: geoffthemedio Date: 2015-01-17 09:53:40 +0000 (Sat, 17 Jan 2015) Log Message: ----------- Added PartType::Capacity function (to be replaced with SDL branch equivalent), allowing implementing ComplexVariable<double>::Eval case for the variable name "PartCapacity". Not yet with parsing. Modified Paths: -------------- trunk/FreeOrion/universe/ShipDesign.cpp trunk/FreeOrion/universe/ShipDesign.h trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/universe/ShipDesign.cpp =================================================================== --- trunk/FreeOrion/universe/ShipDesign.cpp 2015-01-16 14:46:48 UTC (rev 7845) +++ trunk/FreeOrion/universe/ShipDesign.cpp 2015-01-17 09:53:40 UTC (rev 7846) @@ -413,6 +413,34 @@ PartType::~PartType() { delete m_location; } +double PartType::Capacity() const { + switch (m_class) { + case PC_SHORT_RANGE: + case PC_POINT_DEFENSE: { + if (const DirectFireStats* stats = boost::get<DirectFireStats>(&m_stats)) + return stats->m_damage; + break; + } + case PC_MISSILES: { + if (const LRStats* stats = boost::get<LRStats>(&m_stats)) + return stats->m_damage; + break; + } + case PC_FIGHTERS: { + if (const FighterStats* stats = boost::get<FighterStats>(&m_stats)) + return stats->m_anti_ship_damage; + break; + } + default: { + if (const float* stat = boost::get<float>(&m_stats)) + return *stat; + break; + } + } + + return 0.0; +} + bool PartType::CanMountInSlotType(ShipSlotType slot_type) const { if (INVALID_SHIP_SLOT_TYPE == slot_type) return false; Modified: trunk/FreeOrion/universe/ShipDesign.h =================================================================== --- trunk/FreeOrion/universe/ShipDesign.h 2015-01-16 14:46:48 UTC (rev 7845) +++ trunk/FreeOrion/universe/ShipDesign.h 2015-01-17 09:53:40 UTC (rev 7846) @@ -205,6 +205,7 @@ const std::string& Description() const { return m_description; } ///< returns description, including a description of the stats and effects of this part ShipPartClass Class() const { return m_class; } ///< returns that class of part that this is. const PartTypeStats& Stats() const { return m_stats; } ///< returns how good the part is at its function. might be weapon or shield strength, or cargo hold capacity + double Capacity() const; bool CanMountInSlotType(ShipSlotType slot_type) const; ///< returns true if this part can be placed in a slot of the indicated type const std::vector<ShipSlotType>& MountableSlotTypes() const { return m_mountable_slot_types; } Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-01-16 14:46:48 UTC (rev 7845) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-01-17 09:53:40 UTC (rev 7846) @@ -931,37 +931,42 @@ namespace ValueRef { template <> PlanetSize ComplexVariable<PlanetSize>::Eval(const ScriptingContext& context) const - { - return INVALID_PLANET_SIZE; - } + { return INVALID_PLANET_SIZE; } template <> PlanetType ComplexVariable<PlanetType>::Eval(const ScriptingContext& context) const - { - return INVALID_PLANET_TYPE; - } + { return INVALID_PLANET_TYPE; } template <> PlanetEnvironment ComplexVariable<PlanetEnvironment>::Eval(const ScriptingContext& context) const - { - return INVALID_PLANET_ENVIRONMENT; - } + { return INVALID_PLANET_ENVIRONMENT; } template <> UniverseObjectType ComplexVariable<UniverseObjectType>::Eval(const ScriptingContext& context) const - { - return INVALID_UNIVERSE_OBJECT_TYPE; - } + { return INVALID_UNIVERSE_OBJECT_TYPE; } template <> StarType ComplexVariable<StarType>::Eval(const ScriptingContext& context) const - { - return INVALID_STAR_TYPE; - } + { return INVALID_STAR_TYPE; } template <> double ComplexVariable<double>::Eval(const ScriptingContext& context) const { + const std::string& variable_name = m_property_name.back(); + + if (variable_name == "PartCapacity") { + std::string part_type_name; + if (m_string_ref1) { + part_type_name = m_string_ref1->Eval(context); + } + + const PartType* part_type = GetPartType(part_type_name); + if (!part_type) + return 0.0; + + return part_type->Capacity(); + } + return 0.0; } @@ -1330,9 +1335,7 @@ template <> std::string ComplexVariable<std::string>::Eval(const ScriptingContext& context) const - { - return ""; - } + { return ""; } #undef IF_CURRENT_VALUE } |
From: <geo...@us...> - 2015-01-23 11:00:15
|
Revision: 7860 http://sourceforge.net/p/freeorion/code/7860 Author: geoffthemedio Date: 2015-01-23 11:00:07 +0000 (Fri, 23 Jan 2015) Log Message: ----------- Added extra constructors to various Cast ValueRefs, to enable creating them from other ValueRefs not derived from ValueRef::Variable, but still retaining the constructors taking Variable so that the Variable-derived members of the Cast classes can be set when appropriate. Modified Paths: -------------- trunk/FreeOrion/universe/ValueRef.cpp trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-01-23 10:57:48 UTC (rev 7859) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-01-23 11:00:07 UTC (rev 7860) @@ -1366,6 +1366,11 @@ m_value_ref(value_ref) {} +ValueRef::UserStringLookup::UserStringLookup(const ValueRef::ValueRefBase<std::string>* value_ref) : + ValueRef::Variable<std::string>(ValueRef::NON_OBJECT_REFERENCE), + m_value_ref(value_ref) +{} + ValueRef::UserStringLookup::~UserStringLookup() { delete m_value_ref; } Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2015-01-23 10:57:48 UTC (rev 7859) +++ trunk/FreeOrion/universe/ValueRef.h 2015-01-23 11:00:07 UTC (rev 7860) @@ -276,6 +276,7 @@ struct FO_COMMON_API ValueRef::StaticCast : public ValueRef::Variable<ToType> { StaticCast(const ValueRef::Variable<FromType>* value_ref); + StaticCast(const ValueRef::ValueRefBase<FromType>* value_ref); ~StaticCast(); virtual bool operator==(const ValueRef::ValueRefBase<ToType>& rhs) const; @@ -303,6 +304,7 @@ struct FO_COMMON_API ValueRef::StringCast : public ValueRef::Variable<std::string> { StringCast(const ValueRef::Variable<FromType>* value_ref); + StringCast(const ValueRef::ValueRefBase<FromType>* value_ref); ~StringCast(); virtual bool operator==(const ValueRef::ValueRefBase<std::string>& rhs) const; @@ -326,7 +328,9 @@ /** Looks up a string ValueRef and returns the UserString equivalent. */ struct FO_COMMON_API ValueRef::UserStringLookup : public ValueRef::Variable<std::string> { UserStringLookup(const ValueRef::Variable<std::string>* value_ref); + UserStringLookup(const ValueRef::ValueRefBase<std::string>* value_ref); ~UserStringLookup(); + virtual bool operator==(const ValueRef::ValueRefBase<std::string>& rhs) const; virtual std::string Eval(const ScriptingContext& context) const; virtual bool RootCandidateInvariant() const; @@ -1141,6 +1145,12 @@ {} template <class FromType, class ToType> +ValueRef::StaticCast<FromType, ToType>::StaticCast(const ValueRef::ValueRefBase<FromType>* value_ref) : + ValueRef::Variable<ToType>(ValueRef::NON_OBJECT_REFERENCE), + m_value_ref(value_ref) +{} + +template <class FromType, class ToType> ValueRef::StaticCast<FromType, ToType>::~StaticCast() { delete m_value_ref; } @@ -1212,6 +1222,12 @@ {} template <class FromType> +ValueRef::StringCast<FromType>::StringCast(const ValueRef::ValueRefBase<FromType>* value_ref) : + ValueRef::Variable<std::string>(ValueRef::NON_OBJECT_REFERENCE), + m_value_ref(value_ref) +{} + +template <class FromType> ValueRef::StringCast<FromType>::~StringCast() { delete m_value_ref; } |
From: <geo...@us...> - 2015-01-27 10:47:30
|
Revision: 7878 http://sourceforge.net/p/freeorion/code/7878 Author: geoffthemedio Date: 2015-01-27 10:47:27 +0000 (Tue, 27 Jan 2015) Log Message: ----------- -Fixed some ValueRef::Operation::Description cases using the wrong operands' sub-descriptions. -Updated randomnumber operation description text. Modified Paths: -------------- trunk/FreeOrion/universe/ValueRef.cpp trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-01-26 20:51:01 UTC (rev 7877) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-01-27 10:47:27 UTC (rev 7878) @@ -1490,11 +1490,11 @@ if (m_op_type == COSINE) return "cos(" + m_operand1->Description() + ")"; if (m_op_type == MINIMUM) - return "min(" + m_operand1->Description() + ", " + m_operand1->Description() + ")"; + return "min(" + m_operand1->Description() + ", " + m_operand2->Description() + ")"; if (m_op_type == MAXIMUM) - return "max(" + m_operand1->Description() + ", " + m_operand1->Description() + ")"; + return "max(" + m_operand1->Description() + ", " + m_operand2->Description() + ")"; if (m_op_type == RANDOM_UNIFORM) - return "random(" + m_operand1->Description() + ", " + m_operand1->Description() + ")"; + return "random(" + m_operand1->Description() + ", " + m_operand2->Description() + ")"; bool parenthesize_lhs = false; Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2015-01-26 20:51:01 UTC (rev 7877) +++ trunk/FreeOrion/universe/ValueRef.h 2015-01-27 10:47:27 UTC (rev 7878) @@ -1499,11 +1499,11 @@ if (m_op_type == COSINE) return "cos(" + m_operand1->Description() + ")"; if (m_op_type == MINIMUM) - return "min(" + m_operand1->Description() + ", " + m_operand1->Description() + ")"; + return "min(" + m_operand1->Description() + ", " + m_operand2->Description() + ")"; if (m_op_type == MAXIMUM) - return "max(" + m_operand1->Description() + ", " + m_operand1->Description() + ")"; + return "max(" + m_operand1->Description() + ", " + m_operand2->Description() + ")"; if (m_op_type == RANDOM_UNIFORM) - return "random(" + m_operand1->Description() + ", " + m_operand1->Description() + ")"; + return "randomnumber(" + m_operand1->Description() + ", " + m_operand2->Description() + ")"; bool parenthesize_lhs = false; |
From: <geo...@us...> - 2015-02-04 09:34:57
|
Revision: 7903 http://sourceforge.net/p/freeorion/code/7903 Author: geoffthemedio Date: 2015-02-04 09:34:50 +0000 (Wed, 04 Feb 2015) Log Message: ----------- -Added unimplemented species opinion getters. -Added some effect initial value context setting in Execute functions. Modified Paths: -------------- trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Species.cpp trunk/FreeOrion/universe/Species.h Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2015-02-04 09:32:57 UTC (rev 7902) +++ trunk/FreeOrion/universe/Effect.cpp 2015-02-04 09:34:50 UTC (rev 7903) @@ -1115,10 +1115,11 @@ { delete m_empire_id; } void SetOwner::Execute(const ScriptingContext& context) const { - int empire_id = m_empire_id->Eval(context); if (!context.effect_target) return; int initial_owner = context.effect_target->Owner(); + + int empire_id = m_empire_id->Eval(ScriptingContext(context, initial_owner)); if (initial_owner == empire_id) return; @@ -1185,15 +1186,21 @@ } void SetSpeciesEmpireOpinion::Execute(const ScriptingContext& context) const { - int empire_id = m_empire_id->Eval(context); if (!context.effect_target) return; + if (!m_species_name || !m_opinion || !m_empire_id) + return; + int empire_id = m_empire_id->Eval(context); + if (empire_id == ALL_EMPIRES) + return; + std::string species_name = m_species_name->Eval(context); if (species_name.empty()) return; - double opinion = m_opinion->Eval(context); + double initial_opinion = GetSpeciesManager().SpeciesEmpireOpinion(species_name, empire_id); + double opinion = m_opinion->Eval(ScriptingContext(context, initial_opinion)); GetSpeciesManager().SetSpeciesEmpireOpinion(species_name, empire_id, opinion); } @@ -1234,6 +1241,11 @@ } void SetSpeciesSpeciesOpinion::Execute(const ScriptingContext& context) const { + if (!context.effect_target) + return; + if (!m_opinionated_species_name || !m_opinion || !m_rated_species_name) + return; + std::string opinionated_species_name = m_opinionated_species_name->Eval(context); if (opinionated_species_name.empty()) return; @@ -1242,7 +1254,8 @@ if (rated_species_name.empty()) return; - double opinion = m_opinion->Eval(context); + double initial_opinion = GetSpeciesManager().SpeciesSpeciesOpinion(opinionated_species_name, rated_species_name); + double opinion = m_opinion->Eval(ScriptingContext(context, initial_opinion)); GetSpeciesManager().SetSpeciesSpeciesOpinion(opinionated_species_name, rated_species_name, opinion); } Modified: trunk/FreeOrion/universe/Species.cpp =================================================================== --- trunk/FreeOrion/universe/Species.cpp 2015-02-04 09:32:57 UTC (rev 7902) +++ trunk/FreeOrion/universe/Species.cpp 2015-02-04 09:34:50 UTC (rev 7903) @@ -440,6 +440,14 @@ const std::map<std::string, std::map<std::string, double> >& SpeciesManager::GetSpeciesSpeciesOpinionsMap(int encoding_empire/* = ALL_EMPIRES*/) const { return m_species_species_opinions; } +double SpeciesManager::SpeciesEmpireOpinion(const std::string& species_name, int empire_id) const { + return 0.0; +} + +double SpeciesManager::SpeciesSpeciesOpinion(const std::string& opinionated_species_name, const std::string& rated_species_name) const { + return 0.0; +} + void SpeciesManager::ClearSpeciesOpinions() { m_species_empire_opinions.clear(); m_species_species_opinions.clear(); Modified: trunk/FreeOrion/universe/Species.h =================================================================== --- trunk/FreeOrion/universe/Species.h 2015-02-04 09:32:57 UTC (rev 7902) +++ trunk/FreeOrion/universe/Species.h 2015-02-04 09:34:50 UTC (rev 7903) @@ -233,10 +233,21 @@ * species' opinion of the empire */ const std::map<std::string, std::map<int, double> >& GetSpeciesEmpireOpinionsMap(int encoding_empire = ALL_EMPIRES) const; + /** returns opinion of species with name \a species_name about empire with + * id \a empire_id or 0.0 if there is no such opinion yet recorded. */ + double SpeciesEmpireOpinion(const std::string& species_name, + int empire_id) const; + /** returns a map from species name to a map from other species names to the * opinion of the first species about the other species. */ const std::map<std::string, std::map<std::string, double> >& GetSpeciesSpeciesOpinionsMap(int encoding_empire = ALL_EMPIRES) const; + /** returns opinion of species with name \a opinionated_species_name about + * other species with name \a rated_species_name or 0.0 if there is no + * such opinion yet recorded. */ + double SpeciesSpeciesOpinion(const std::string& opinionated_species_name, + const std::string& rated_species_name) const; + /** returns the instance of this singleton class; you should use the free * function GetSpeciesManager() instead */ static SpeciesManager& GetSpeciesManager(); |
From: <geo...@us...> - 2015-02-04 09:36:00
|
Revision: 7904 http://sourceforge.net/p/freeorion/code/7904 Author: geoffthemedio Date: 2015-02-04 09:35:59 +0000 (Wed, 04 Feb 2015) Log Message: ----------- grooming Modified Paths: -------------- trunk/FreeOrion/universe/EnableTemporaryFromThis.h trunk/FreeOrion/universe/Fleet.cpp Modified: trunk/FreeOrion/universe/EnableTemporaryFromThis.h =================================================================== --- trunk/FreeOrion/universe/EnableTemporaryFromThis.h 2015-02-04 09:34:50 UTC (rev 7903) +++ trunk/FreeOrion/universe/EnableTemporaryFromThis.h 2015-02-04 09:35:59 UTC (rev 7904) @@ -13,7 +13,7 @@ class EnableTemporaryFromThis : public boost::enable_shared_from_this<T> { public: typedef EnableTemporaryFromThis<T> enable_temporary_from_this_type; - EnableTemporaryFromThis(); + EnableTemporaryFromThis(); TemporaryPtr<T> TemporaryFromThis(); TemporaryPtr<const T> TemporaryFromThis() const; Modified: trunk/FreeOrion/universe/Fleet.cpp =================================================================== --- trunk/FreeOrion/universe/Fleet.cpp 2015-02-04 09:34:50 UTC (rev 7903) +++ trunk/FreeOrion/universe/Fleet.cpp 2015-02-04 09:35:59 UTC (rev 7904) @@ -256,7 +256,7 @@ } // determine if, given fuel available and supplyable systems, fleet will ever be able to move - if (fuel < 1.0 && + if (fuel < 1.0f && this->SystemID() != INVALID_OBJECT_ID && fleet_supplied_systems.find(this->SystemID()) == fleet_supplied_systems.end()) { @@ -298,7 +298,7 @@ // " next system: " << (next_system ? next_system->Name() : "(none)"); - bool isPostBlockade=false; + bool isPostBlockade = false; if (cur_system) { //Logger().debugStream() << "Fleet::MovePath starting in system "<< SystemID(); if (flag_blockades && next_system->ID() != m_arrival_starlane && @@ -351,21 +351,21 @@ // Logger().debugStream() << " at system " << cur_system->Name() << " with id " << cur_system->ID(); //else // Logger().debugStream() << " at (" << cur_x << ", " << cur_y << ")"; - + // Make sure that there actually still is a starlane between the two systems // we are between - TemporaryPtr<const System>* prev_or_cur = NULL; - if(cur_system){ - prev_or_cur = &cur_system; - }else if(prev_system){ - prev_or_cur = &prev_system; - }else{ + TemporaryPtr<const System> prev_or_cur; + if (cur_system) { + prev_or_cur = cur_system; + } else if (prev_system) { + prev_or_cur = prev_system; + } else { Logger().errorStream() << "Fleet::MovePath: No previous or current system!?"; } - if(prev_or_cur){ - if(!(*prev_or_cur)->HasStarlaneTo(next_system->ID())){ - Logger().debugStream() << "Fleet::MovePath: There starlane to follow between Systems " << (*prev_or_cur)->ID() << " and " << next_system->ID() - << ". Abandoning the rest of the route."; + if (prev_or_cur) { + if (!prev_or_cur->HasStarlaneTo(next_system->ID())) { + Logger().debugStream() << "Fleet::MovePath: No starlane connection between systems " << prev_or_cur->ID() << " and " << next_system->ID() + << ". Abandoning the rest of the route."; return retval; } } |
From: <geo...@us...> - 2015-02-04 10:22:03
|
Revision: 7906 http://sourceforge.net/p/freeorion/code/7906 Author: geoffthemedio Date: 2015-02-04 10:21:59 +0000 (Wed, 04 Feb 2015) Log Message: ----------- -Adjusted CanAddStarlaneConnection::Dump to match form expected in parser. -grooming Modified Paths: -------------- trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Effect.cpp Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2015-02-04 10:20:41 UTC (rev 7905) +++ trunk/FreeOrion/universe/Condition.cpp 2015-02-04 10:21:59 UTC (rev 7906) @@ -5853,7 +5853,7 @@ } std::string Condition::CanAddStarlaneConnection::Dump() const { - std::string retval = DumpIndent() + "CanAddStarlaneConnection condition =\n"; + std::string retval = DumpIndent() + "CanAddStarlaneTo condition =\n"; ++g_indent; retval += m_condition->Dump(); --g_indent; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2015-02-04 10:20:41 UTC (rev 7905) +++ trunk/FreeOrion/universe/Effect.cpp 2015-02-04 10:21:59 UTC (rev 7906) @@ -2728,6 +2728,7 @@ std::string SetDestination::Dump() const { return DumpIndent() + "SetDestination destination = " + m_location_condition->Dump() + "\n"; } + /////////////////////////////////////////////////////////// // SetAggression // /////////////////////////////////////////////////////////// |
From: <geo...@us...> - 2015-02-04 10:23:06
|
Revision: 7907 http://sourceforge.net/p/freeorion/code/7907 Author: geoffthemedio Date: 2015-02-04 10:23:04 +0000 (Wed, 04 Feb 2015) Log Message: ----------- -Implemented SpeciesManager::SpeciesEmpireOpinion and ::SpeciesSpeciesOpinion getters. -Removed equivalent code and replaced with call in ComplexVariable<double>::Eval. Modified Paths: -------------- trunk/FreeOrion/universe/Species.cpp trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/universe/Species.cpp =================================================================== --- trunk/FreeOrion/universe/Species.cpp 2015-02-04 10:21:59 UTC (rev 7906) +++ trunk/FreeOrion/universe/Species.cpp 2015-02-04 10:23:04 UTC (rev 7907) @@ -441,11 +441,25 @@ { return m_species_species_opinions; } double SpeciesManager::SpeciesEmpireOpinion(const std::string& species_name, int empire_id) const { - return 0.0; + std::map<std::string, std::map<int, double> >::const_iterator sp_it = m_species_empire_opinions.find(species_name); + if (sp_it == m_species_empire_opinions.end()) + return 0.0; + const std::map<int, double>& emp_map = sp_it->second; + std::map<int, double>::const_iterator emp_it = emp_map.find(empire_id); + if (emp_it == emp_map.end()) + return 0.0; + return emp_it->second; } double SpeciesManager::SpeciesSpeciesOpinion(const std::string& opinionated_species_name, const std::string& rated_species_name) const { - return 0.0; + std::map<std::string, std::map<std::string, double> >::const_iterator sp_it = m_species_species_opinions.find(opinionated_species_name); + if (sp_it == m_species_species_opinions.end()) + return 0.0; + const std::map<std::string, double>& ra_sp_map = sp_it->second; + std::map<std::string, double>::const_iterator ra_sp_it = ra_sp_map.find(rated_species_name); + if (ra_sp_it == ra_sp_map.end()) + return 0.0; + return ra_sp_it->second; } void SpeciesManager::ClearSpeciesOpinions() { Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-02-04 10:21:59 UTC (rev 7906) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-02-04 10:23:04 UTC (rev 7907) @@ -984,18 +984,8 @@ if (m_string_ref1) species_name = m_string_ref1->Eval(context); - const std::map<std::string, std::map<int, double> >& seo_map = GetSpeciesManager().GetSpeciesEmpireOpinionsMap(); - std::map<std::string, std::map<int, double> >::const_iterator sp_it = seo_map.find(species_name); - if (sp_it == seo_map.end()) - return 0.0; + return GetSpeciesManager().SpeciesEmpireOpinion(species_name, empire_id); - const std::map<int, double>& emp_map = sp_it->second; - std::map<int, double>::const_iterator emp_it = emp_map.find(empire_id); - if (emp_it == emp_map.end()) - return 0.0; - - return emp_it->second; - } else if (variable_name == "SpeciesSpeciesOpinion") { std::string opinionated_species_name; if (m_string_ref1) @@ -1005,17 +995,7 @@ if (m_string_ref2) rated_species_name = m_string_ref2->Eval(context); - const std::map<std::string, std::map<std::string, double> >& sso_map = GetSpeciesManager().GetSpeciesSpeciesOpinionsMap(); - std::map<std::string, std::map<std::string, double> >::const_iterator sp_op_it = sso_map.find(opinionated_species_name); - if (sp_op_it == sso_map.end()) - return 0.0; - - const std::map<std::string, double>& sp_ra_map = sp_op_it->second; - std::map<std::string, double>::const_iterator sp_ra_it = sp_ra_map.find(rated_species_name); - if (sp_ra_it == sp_ra_map.end()) - return 0.0; - - return sp_ra_it->second; + return GetSpeciesManager().SpeciesSpeciesOpinion(opinionated_species_name, rated_species_name); } return 0.0; |
From: <geo...@us...> - 2015-03-03 14:13:13
|
Revision: 8002 http://sourceforge.net/p/freeorion/code/8002 Author: geoffthemedio Date: 2015-03-03 14:13:11 +0000 (Tue, 03 Mar 2015) Log Message: ----------- -Added function to Universe to return the id of the closest system to a map location. -Further modified UniverseObject::Dump to include that info when not in a system. -Added ValueRef::Variable<int> case for NearestSystemID property, though didn't add parsing. Modified Paths: -------------- trunk/FreeOrion/universe/Universe.cpp trunk/FreeOrion/universe/Universe.h trunk/FreeOrion/universe/UniverseObject.cpp trunk/FreeOrion/universe/ValueRef.cpp Modified: trunk/FreeOrion/universe/Universe.cpp =================================================================== --- trunk/FreeOrion/universe/Universe.cpp 2015-03-03 14:11:22 UTC (rev 8001) +++ trunk/FreeOrion/universe/Universe.cpp 2015-03-03 14:13:11 UTC (rev 8002) @@ -1023,6 +1023,28 @@ return std::multimap<double, int>(); } +int Universe::NearestSystemTo(double x, double y) const { + double min_dist2 = DBL_MAX; + int min_dist2_sys_id = INVALID_OBJECT_ID; + + std::vector<TemporaryPtr<const System> > systems = m_objects.FindObjects<System>(); + + for (std::vector<TemporaryPtr<const System> >::const_iterator sys_it = systems.begin(); + sys_it != systems.end(); ++sys_it) + { + double xs = (*sys_it)->X(); + double ys = (*sys_it)->Y(); + double dist2 = (xs-x)*(xs-x) + (ys-y)*(ys-y); + if (dist2 == 0.0) { + return (*sys_it)->ID(); + } else if (dist2 < min_dist2) { + min_dist2 = dist2; + min_dist2_sys_id = (*sys_it)->ID(); + } + } + return min_dist2_sys_id; +} + int Universe::GenerateObjectID() { if (m_last_allocated_object_id + 1 < MAX_ID) return ++m_last_allocated_object_id; Modified: trunk/FreeOrion/universe/Universe.h =================================================================== --- trunk/FreeOrion/universe/Universe.h 2015-03-03 14:11:22 UTC (rev 8001) +++ trunk/FreeOrion/universe/Universe.h 2015-03-03 14:13:11 UTC (rev 8002) @@ -217,6 +217,10 @@ * ID is out of range. */ std::multimap<double, int> ImmediateNeighbors(int system_id, int empire_id = ALL_EMPIRES) const; + /** Returns the id of the System object that is closest to the specified + * (\a x, \a y) location on the map, by direct-line distance. */ + int NearestSystemTo(double x, double y) const; + /** Returns map, indexed by object id, to map, indexed by MeterType, * to vector of EffectAccountInfo for the meter, in order effects * were applied to the meter. */ Modified: trunk/FreeOrion/universe/UniverseObject.cpp =================================================================== --- trunk/FreeOrion/universe/UniverseObject.cpp 2015-03-03 14:11:22 UTC (rev 8001) +++ trunk/FreeOrion/universe/UniverseObject.cpp 2015-03-03 14:13:11 UTC (rev 8002) @@ -164,18 +164,31 @@ << this->ID() << ": " << this->Name(); if (system) { - os << " at: " << system->Name(); + const std::string& sys_name = system->Name(); + if (sys_name.empty()) + os << " at: (System " << system->ID() << ")"; + else + os << " at: " << sys_name; } else { os << " at: (" << this->X() << ", " << this->Y() << ")"; + int near_id = GetUniverse().NearestSystemTo(this->X(), this->Y()); + TemporaryPtr<const System> system = GetSystem(near_id); + if (system) { + const std::string& sys_name = system->Name(); + if (sys_name.empty()) + os << " nearest (System " << system->ID() << ")"; + else + os << " nearest " << system->Name(); + } } if (Unowned()) { - os << " (Unowned) "; + os << " owner: (Unowned) "; } else { - std::string empire_name = EmpireManager().GetEmpireName(m_owner_empire_id); + std::string empire_name = Empires().GetEmpireName(m_owner_empire_id); if (!empire_name.empty()) - os << "owner: " << empire_name; + os << " owner: " << empire_name; else - os << "owner: (Unknown Empire)"; + os << " owner: (Unknown Empire)"; } os << " created on turn: " << m_created_on_turn << " specials: "; Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-03-03 14:11:22 UTC (rev 8001) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-03-03 14:13:11 UTC (rev 8002) @@ -713,6 +713,13 @@ return fleet->PreviousSystemID(); else return INVALID_OBJECT_ID; + + } else if (property_name == "NearestSystemID") { + if (object->SystemID() != INVALID_OBJECT_ID) + return object->SystemID(); + + return GetUniverse().NearestSystemTo(object->X(), object->Y()); + } else if (property_name == "NumShips") { if (TemporaryPtr<const Fleet> fleet = boost::dynamic_pointer_cast<const Fleet>(object)) return fleet->NumShips(); |
From: <geo...@us...> - 2015-03-04 02:26:13
|
Revision: 8009 http://sourceforge.net/p/freeorion/code/8009 Author: geoffthemedio Date: 2015-03-04 02:26:06 +0000 (Wed, 04 Mar 2015) Log Message: ----------- -Removed template specialization for StringCast<int>::Eval as it was equivalent to the general case. -Made the general case for that function more robust / safe. Modified Paths: -------------- trunk/FreeOrion/universe/ValueRef.cpp trunk/FreeOrion/universe/ValueRef.h Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2015-03-04 02:23:29 UTC (rev 8008) +++ trunk/FreeOrion/universe/ValueRef.cpp 2015-03-04 02:26:06 UTC (rev 8009) @@ -1651,12 +1651,6 @@ double temp = m_value_ref->Eval(context); return DoubleToString(temp, 3, false); } - - template <> - std::string StringCast<int>::Eval(const ScriptingContext& context) const - { - return boost::lexical_cast<std::string>(m_value_ref->Eval(context)); - } } /////////////////////////////////////////////////////////// Modified: trunk/FreeOrion/universe/ValueRef.h =================================================================== --- trunk/FreeOrion/universe/ValueRef.h 2015-03-04 02:23:29 UTC (rev 8008) +++ trunk/FreeOrion/universe/ValueRef.h 2015-03-04 02:26:06 UTC (rev 8009) @@ -1299,19 +1299,25 @@ return true; } +template <class FromType> +std::string ValueRef::StringCast<FromType>::Eval(const ScriptingContext& context) const +{ + if (!m_value_ref) + return ""; + std::string retval; + try { + retval = boost::lexical_cast<std::string>(m_value_ref->Eval(context)); + } catch (...) { + } + return retval; +} + namespace ValueRef { template <> std::string StringCast<double>::Eval(const ScriptingContext& context) const; - - template <> - std::string StringCast<int>::Eval(const ScriptingContext& context) const; } template <class FromType> -std::string ValueRef::StringCast<FromType>::Eval(const ScriptingContext& context) const -{ return boost::lexical_cast<std::string>(m_value_ref->Eval(context)); } - -template <class FromType> bool ValueRef::StringCast<FromType>::RootCandidateInvariant() const { return m_value_ref->RootCandidateInvariant(); } |
From: <geo...@us...> - 2015-03-07 14:20:33
|
Revision: 8019 http://sourceforge.net/p/freeorion/code/8019 Author: geoffthemedio Date: 2015-03-07 14:19:03 +0000 (Sat, 07 Mar 2015) Log Message: ----------- Commented out inherent stealth bonuses of 0.01 to buildings, planets, and systems. Modified Paths: -------------- trunk/FreeOrion/universe/Building.cpp trunk/FreeOrion/universe/Planet.cpp trunk/FreeOrion/universe/System.cpp Modified: trunk/FreeOrion/universe/Building.cpp =================================================================== --- trunk/FreeOrion/universe/Building.cpp 2015-03-06 12:31:56 UTC (rev 8018) +++ trunk/FreeOrion/universe/Building.cpp 2015-03-07 14:19:03 UTC (rev 8019) @@ -128,9 +128,9 @@ void Building::ResetTargetMaxUnpairedMeters() { UniverseObject::ResetTargetMaxUnpairedMeters(); - // give buildings base stealth slightly above 0, so that they can't be seen from a distance without high detection ability - if (Meter* stealth = GetMeter(METER_STEALTH)) - stealth->AddToCurrent(0.01f); + //// give buildings base stealth slightly above 0, so that they can't be seen from a distance without high detection ability + //if (Meter* stealth = GetMeter(METER_STEALTH)) + // stealth->AddToCurrent(0.01f); } void Building::Reset() { Modified: trunk/FreeOrion/universe/Planet.cpp =================================================================== --- trunk/FreeOrion/universe/Planet.cpp 2015-03-06 12:31:56 UTC (rev 8018) +++ trunk/FreeOrion/universe/Planet.cpp 2015-03-07 14:19:03 UTC (rev 8019) @@ -849,7 +849,7 @@ // seen from a distance without high detection ability if (Meter* stealth = GetMeter(METER_STEALTH)) { stealth->ResetCurrent(); - stealth->AddToCurrent(0.01f); + //stealth->AddToCurrent(0.01f); } GetMeter(METER_MAX_SUPPLY)->ResetCurrent(); Modified: trunk/FreeOrion/universe/System.cpp =================================================================== --- trunk/FreeOrion/universe/System.cpp 2015-03-06 12:31:56 UTC (rev 8018) +++ trunk/FreeOrion/universe/System.cpp 2015-03-07 14:19:03 UTC (rev 8019) @@ -485,7 +485,7 @@ // seen from a distance without high detection ability if (Meter* stealth = GetMeter(METER_STEALTH)) { stealth->ResetCurrent(); - stealth->AddToCurrent(0.01f); + //stealth->AddToCurrent(0.01f); } } |