From: <geo...@us...> - 2011-07-19 06:42:52
|
Revision: 4063 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4063&view=rev Author: geoffthemedio Date: 2011-07-19 06:42:45 +0000 (Tue, 19 Jul 2011) Log Message: ----------- -Added ProducedByEmpire condition, which matches ships and buildings that were produced by the indicated empire. -Added ProducedByEmpireID scripting object property. -Modified Imperial Palace to only work on planets owned by the empire that produced the building. This prevents conquered planets' palaces from changing a conquering empire's capitol to the newly conquered planet. Modified Paths: -------------- trunk/FreeOrion/default/buildings.txt trunk/FreeOrion/default/eng_stringtable.txt trunk/FreeOrion/universe/Condition.cpp trunk/FreeOrion/universe/Condition.h trunk/FreeOrion/universe/ConditionParser2.cpp trunk/FreeOrion/universe/ValueRef.cpp trunk/FreeOrion/universe/ValueRefParser.cpp Modified: trunk/FreeOrion/default/buildings.txt =================================================================== --- trunk/FreeOrion/default/buildings.txt 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/default/buildings.txt 2011-07-19 06:42:45 UTC (rev 4063) @@ -35,7 +35,7 @@ EffectsGroup scope = And [ Planet - OwnedBy TheEmpire Source.Owner + OwnedBy TheEmpire Source.ProducedByEmpireID Contains Source ] effects = SetEmpireCapital @@ -43,7 +43,7 @@ EffectsGroup scope = And [ Planet - OwnedBy TheEmpire Source.Owner + OwnedBy TheEmpire Source.ProducedByEmpireID Contains Source ] stackinggroup = "IMERIAL_PALACE_SUPPLY_EFFECT" @@ -52,7 +52,7 @@ EffectsGroup scope = And [ Planet - OwnedBy TheEmpire Source.Owner + OwnedBy TheEmpire Source.ProducedByEmpireID Contains Source ] activation = Not Number low = 1 high = 999 And [ Modified: trunk/FreeOrion/default/eng_stringtable.txt =================================================================== --- trunk/FreeOrion/default/eng_stringtable.txt 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/default/eng_stringtable.txt 2011-07-19 06:42:45 UTC (rev 4063) @@ -2948,6 +2948,9 @@ DESC_VAR_AGE age in turns +DESC_VAR_PRODUCEDBYEMPIREID +producer + DESC_VAR_CREATIONTURN turn of creation @@ -3290,6 +3293,12 @@ DESC_CHANCE_NOT with a probability of 1 - %1% +DESC_PRODUCED_BY_EMPIRE + that was produced by %1% empire + +DESC_PRODUCED_BY_EMPIRE_NOT + that was not produced by %1% empire + DESC_METER_VALUE_MAX that has a max %1% between %2% and %3% Modified: trunk/FreeOrion/universe/Condition.cpp =================================================================== --- trunk/FreeOrion/universe/Condition.cpp 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/universe/Condition.cpp 2011-07-19 06:42:45 UTC (rev 4063) @@ -1719,7 +1719,9 @@ /////////////////////////////////////////////////////////// // DesignHasPartClass // /////////////////////////////////////////////////////////// -Condition::DesignHasPartClass::DesignHasPartClass(const ValueRef::ValueRefBase<int>* low, const ValueRef::ValueRefBase<int>* high, ShipPartClass part_class) : +Condition::DesignHasPartClass::DesignHasPartClass(const ValueRef::ValueRefBase<int>* low, + const ValueRef::ValueRefBase<int>* high, + ShipPartClass part_class) : m_low(low), m_high(high), m_class(part_class) @@ -1779,6 +1781,54 @@ } /////////////////////////////////////////////////////////// +// ProducedByEmpire // +/////////////////////////////////////////////////////////// +Condition::ProducedByEmpire::ProducedByEmpire(const ValueRef::ValueRefBase<int>* empire_id) : + m_empire_id(empire_id) +{} + +Condition::ProducedByEmpire::~ProducedByEmpire() +{ + delete m_empire_id; +} + +std::string Condition::ProducedByEmpire::Description(bool negated/* = false*/) const +{ + std::string empire_str = ValueRef::ConstantExpr(m_empire_id) ? + Empires().Lookup(m_empire_id->Eval())->Name() : + m_empire_id->Description(); + + std::string description_str = "DESC_PRODUCED_BY_EMPIRE"; + if (negated) + description_str += "_NOT"; + + return str(FlexibleFormat(UserString(description_str)) + % empire_str); +} + +std::string Condition::ProducedByEmpire::Dump() const +{ + return DumpIndent() + "ProducedByEmpire empire_id = " + m_empire_id->Dump(); +} + +bool Condition::ProducedByEmpire::Match(const ScriptingContext& local_context) const +{ + const UniverseObject* candidate = local_context.condition_local_candidate; + if (!candidate) { + Logger().errorStream() << "ProducedByEmpire::Match passed no candidate object"; + return false; + } + + if (const ::Building* building = universe_object_cast<const ::Building*>(candidate)) + return building->ProducedByEmpireID() == m_empire_id->Eval(local_context); + + if (const ::Ship* ship = universe_object_cast<const Ship*>(candidate)) + return ship->ProducedByEmpireID() == m_empire_id->Eval(local_context); + + return false; +} + +/////////////////////////////////////////////////////////// // Chance // /////////////////////////////////////////////////////////// Condition::Chance::Chance(const ValueRef::ValueRefBase<double>* chance) : Modified: trunk/FreeOrion/universe/Condition.h =================================================================== --- trunk/FreeOrion/universe/Condition.h 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/universe/Condition.h 2011-07-19 06:42:45 UTC (rev 4063) @@ -53,6 +53,7 @@ struct DesignHasHull; struct DesignHasPart; struct DesignHasPartClass; + struct ProducedByEmpire; struct Chance; struct MeterValue; struct EmpireStockpileValue; @@ -551,6 +552,24 @@ void serialize(Archive& ar, const unsigned int version); }; +/** Matches ships or buildings produced by the empire with id \a id.*/ +struct Condition::ProducedByEmpire : Condition::ConditionBase +{ + ProducedByEmpire(const ValueRef::ValueRefBase<int>* empire_id); + virtual ~ProducedByEmpire(); + virtual std::string Description(bool negated = false) const; + virtual std::string Dump() const; + +private: + virtual bool Match(const ScriptingContext& local_context) const; + + const ValueRef::ValueRefBase<int>* m_empire_id; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + /** Matches a given object with a linearly distributed probability of \a chance. */ struct Condition::Chance : Condition::ConditionBase { @@ -1040,6 +1059,13 @@ } template <class Archive> +void Condition::ProducedByEmpire::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) + & BOOST_SERIALIZATION_NVP(m_empire_id); +} + +template <class Archive> void Condition::Chance::serialize(Archive& ar, const unsigned int version) { ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(ConditionBase) Modified: trunk/FreeOrion/universe/ConditionParser2.cpp =================================================================== --- trunk/FreeOrion/universe/ConditionParser2.cpp 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/universe/ConditionParser2.cpp 2011-07-19 06:42:45 UTC (rev 4063) @@ -162,6 +162,7 @@ StringRule design_has_hull; DesignHasPartRule design_has_part; DesignHasPartClassRule design_has_part_class; + IntRefRule produced_by_empire; DoubleRefRule random; StockpileRule owner_stockpile; IntRefVecRule visible_to_empire; @@ -262,6 +263,11 @@ design_has_part_class.int_ref_1, design_has_part_class.part_class)]; + produced_by_empire = + (str_p("producedbyempire") + >> empire_label >> int_expr_p[fleet_supplyable.int_ref = arg1]) + [produced_by_empire.this_ = new_<Condition::ProducedByEmpire>(produced_by_empire.int_ref)]; + random = (str_p("random") >> probability_label @@ -313,6 +319,7 @@ | design_has_hull[condition2_p.this_ = arg1] | design_has_part[condition2_p.this_ = arg1] | design_has_part_class[condition2_p.this_ = arg1] + | produced_by_empire[condition2_p.this_ = arg1] | random[condition2_p.this_ = arg1] | owner_stockpile[condition2_p.this_ = arg1] | visible_to_empire[condition2_p.this_ = arg1] Modified: trunk/FreeOrion/universe/ValueRef.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRef.cpp 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/universe/ValueRef.cpp 2011-07-19 06:42:45 UTC (rev 4063) @@ -571,6 +571,13 @@ return object->CreationTurn(); } else if (boost::iequals(property_name, "Age")) { return object->AgeInTurns(); + } else if (boost::iequals(property_name, "ProducedByEmpireID")) { + if (const Ship* ship = universe_object_cast<const Ship*>(object)) + return ship->ProducedByEmpireID(); + else if (const Building* building = universe_object_cast<const Building*>(object)) + return building->ProducedByEmpireID(); + else + return ALL_EMPIRES; } else if (boost::iequals(property_name, "DesignID")) { if (const Ship* ship = universe_object_cast<const Ship*>(object)) return ship->DesignID(); Modified: trunk/FreeOrion/universe/ValueRefParser.cpp =================================================================== --- trunk/FreeOrion/universe/ValueRefParser.cpp 2011-07-19 04:28:56 UTC (rev 4062) +++ trunk/FreeOrion/universe/ValueRefParser.cpp 2011-07-19 06:42:45 UTC (rev 4063) @@ -11,8 +11,8 @@ // final variable tokens: object property names that have the appropriate type // for the ValueRef return type. SimpleRule int_variable_final = - str_p("owner") | "id" | "creationturn" | "age" | "designid" - | "fleetid" | "planetid" | "systemid" | "finaldestinationid" + str_p("owner") | "id" | "creationturn" | "age" | "producedbyempireid" + | "designid" | "fleetid" | "planetid" | "systemid" | "finaldestinationid" | "nextsystemid" | "previoussystemid" | "numships"; SimpleRule double_variable_final = |