From: <geo...@us...> - 2012-03-11 07:38:40
|
Revision: 4707 http://freeorion.svn.sourceforge.net/freeorion/revision/?rev=4707&view=rev Author: geoffthemedio Date: 2012-03-11 07:38:33 +0000 (Sun, 11 Mar 2012) Log Message: ----------- -Implemented SetOverlayTexture effect for systems. -Added and implemented SetTexture effect for planets. -Added / tweaked parsing for these effects. Modified Paths: -------------- trunk/FreeOrion/parse/EffectParser.cpp trunk/FreeOrion/universe/Effect.cpp trunk/FreeOrion/universe/Effect.h Modified: trunk/FreeOrion/parse/EffectParser.cpp =================================================================== --- trunk/FreeOrion/parse/EffectParser.cpp 2012-03-11 07:36:50 UTC (rev 4706) +++ trunk/FreeOrion/parse/EffectParser.cpp 2012-03-11 07:38:33 UTC (rev 4707) @@ -281,12 +281,14 @@ set_overlay_texture = tok.SetOverlayTexture_ > parse::label(Name_name) > tok.string [ _a = _1 ] - >> ( - parse::label(Size_name) >> double_value_ref [ _val = new_<Effect::SetOverlayTexture>(_a, _1) ] - | eps [ _val = new_<Effect::SetOverlayTexture>(_a) ] - ) + > parse::label(Size_name) > double_value_ref [ _val = new_<Effect::SetOverlayTexture>(_a, _1) ] ; + set_texture + = tok.SetTexture_ + > parse::label(Name_name) > tok.string [ _val = new_<Effect::SetTexture>(_1) ] + ; + string_and_string_ref // TODO: Try to make this simpler. = parse::label(Tag_name) >> tok.string [ _a = _1 ] >> parse::label(Data_name) > string_value_ref [ _val = construct<string_and_string_ref_pair>(_a, _1) ] @@ -328,6 +330,7 @@ | set_empire_tech_progress | generate_sitrep_message | set_overlay_texture + | set_texture ; set_meter.name("SetMeter"); @@ -360,6 +363,7 @@ set_empire_tech_progress.name("SetEmpireTechProgress"); generate_sitrep_message.name("GenerateSitrepMessage"); set_overlay_texture.name("SetOverlayTexture"); + set_texture.name("SetTexture"); #if DEBUG_PARSER debug(set_meter); @@ -519,6 +523,7 @@ string_and_doubleref_rule set_empire_tech_progress; generate_sitrep_message_rule generate_sitrep_message; string_and_doubleref_rule set_overlay_texture; + parse::effect_parser_rule set_texture; string_and_string_ref_rule string_and_string_ref; string_and_string_ref_vector_rule string_and_string_ref_vector; parse::effect_parser_rule start; Modified: trunk/FreeOrion/universe/Effect.cpp =================================================================== --- trunk/FreeOrion/universe/Effect.cpp 2012-03-11 07:36:50 UTC (rev 4706) +++ trunk/FreeOrion/universe/Effect.cpp 2012-03-11 07:38:33 UTC (rev 4707) @@ -357,7 +357,9 @@ } } -void EffectsGroup::ExecuteSetMeter(int source_id, const TargetsAndCause& targets_and_cause, AccountingMap& accounting_map) const { +void EffectsGroup::ExecuteSetMeter(int source_id, const TargetsAndCause& targets_and_cause, + AccountingMap& accounting_map) const +{ const UniverseObject* source = GetUniverseObject(source_id); // execute effects on targets @@ -366,7 +368,6 @@ { UniverseObject* target = *target_it; - //Logger().debugStream() << "effectsgroup source: " << source->Name() << " target " << (*it)->Name(); for (std::vector<EffectBase*>::const_iterator effect_it = m_effects.begin(); effect_it != m_effects.end(); ++effect_it) { @@ -400,6 +401,24 @@ } } +void EffectsGroup::ExecuteAppearanceModifications(int source_id, const TargetSet& targets) const { + const UniverseObject* source = GetUniverseObject(source_id); + + // execute effects on targets + for (TargetSet::const_iterator target_it = targets.begin(); target_it != targets.end(); ++target_it) { + UniverseObject* target = *target_it; + + for (std::vector<EffectBase*>::const_iterator effect_it = m_effects.begin(); + effect_it != m_effects.end(); ++effect_it) + { + const EffectBase* effect = *effect_it; + if (!dynamic_cast<const SetTexture*>(effect) && !dynamic_cast<const SetOverlayTexture*>(effect)) + continue; + effect->Execute(ScriptingContext(source, target)); + } + } + +} const std::string& EffectsGroup::StackingGroup() const { return m_stacking_group; } @@ -2099,8 +2118,8 @@ std::string SetEmpireTechProgress::Description() const { std::string progress_str = ValueRef::ConstantExpr(m_research_progress) ? - lexical_cast<std::string>(m_research_progress->Eval()) : - m_research_progress->Description(); + lexical_cast<std::string>(m_research_progress->Eval()) : + m_research_progress->Description(); std::string empire_str; if (m_empire_id) { if (ValueRef::ConstantExpr(m_empire_id)) { @@ -2111,9 +2130,9 @@ } } return str(FlexibleFormat(UserString("DESC_SET_EMPIRE_TECH_PROGRESS")) - % UserString(m_tech_name) - % progress_str - % empire_str); + % UserString(m_tech_name) + % progress_str + % empire_str); } std::string SetEmpireTechProgress::Dump() const { @@ -2175,7 +2194,8 @@ std::string GiveEmpireTech::Dump() const { std::string retval = "GiveEmpireTech name = \"" + m_tech_name + "\""; if (m_empire_id) - retval += " empire = " + m_empire_id->Dump() + "\n"; + retval += " empire = " + m_empire_id->Dump(); + retval += "\n"; return retval; } @@ -2202,8 +2222,7 @@ m_affiliation(affiliation) {} -GenerateSitRepMessage::~GenerateSitRepMessage() -{ +GenerateSitRepMessage::~GenerateSitRepMessage() { for (std::vector<std::pair<std::string, const ValueRef::ValueRefBase<std::string>*> >::iterator it = m_message_parameters.begin(); it != m_message_parameters.end(); ++it) { @@ -2212,8 +2231,7 @@ delete m_recipient_empire_id; } -void GenerateSitRepMessage::Execute(const ScriptingContext& context) const -{ +void GenerateSitRepMessage::Execute(const ScriptingContext& context) const { Empire* empire = 0; if (m_recipient_empire_id) empire = Empires().Lookup(m_recipient_empire_id->Eval(context)); @@ -2240,8 +2258,7 @@ } } -std::string GenerateSitRepMessage::Description() const -{ +std::string GenerateSitRepMessage::Description() const { std::string empire_str; if (m_recipient_empire_id) { int empire_id = ALL_EMPIRES; @@ -2255,8 +2272,7 @@ return str(FlexibleFormat(UserString("DESC_GENERATE_SITREP")) % empire_str); } -std::string GenerateSitRepMessage::Dump() const -{ +std::string GenerateSitRepMessage::Dump() const { std::string retval = DumpIndent(); retval += "GenerateSitRepMessage\n"; ++g_indent; @@ -2291,10 +2307,9 @@ } /////////////////////////////////////////////////////////// -// SetOverlayTexture // +// SetOverlayTexture // /////////////////////////////////////////////////////////// -SetOverlayTexture::SetOverlayTexture(const std::string& texture, - const ValueRef::ValueRefBase<double>* size/* = 0*/) : +SetOverlayTexture::SetOverlayTexture(const std::string& texture, const ValueRef::ValueRefBase<double>* size) : m_texture(texture), m_size(size) {} @@ -2303,11 +2318,46 @@ { delete m_size; } void SetOverlayTexture::Execute(const ScriptingContext& context) const { + if (!context.effect_target) + return; + double size = 1.0; + if (m_size) + size = m_size->Eval(context); + + if (System* system = universe_object_cast<System*>(context.effect_target)) + system->SetOverlayTexture(m_texture, size); } std::string SetOverlayTexture::Description() const -{ return ""; } +{ return UserString("DESC_SET_OVERLAY_TEXTURE"); } -std::string SetOverlayTexture::Dump() const -{ return ""; } +std::string SetOverlayTexture::Dump() const { + std::string retval = DumpIndent() + "SetOverlayTexture texture = " + m_texture; + if (m_size) + retval += " size = " + m_size->Dump(); + retval += "\n"; + return retval; +} +/////////////////////////////////////////////////////////// +// SetTexture // +/////////////////////////////////////////////////////////// +SetTexture::SetTexture(const std::string& texture) : + m_texture(texture) +{} + +SetTexture::~SetTexture() +{} + +void SetTexture::Execute(const ScriptingContext& context) const { + if (!context.effect_target) + return; + if (Planet* planet = universe_object_cast<Planet*>(context.effect_target)) + planet->SetSurfaceTexture(m_texture); +} + +std::string SetTexture::Description() const +{ return UserString("DESC_SET_TEXTURE"); } + +std::string SetTexture::Dump() const +{ return DumpIndent() + "SetTexture texture = " + m_texture + "\n"; } Modified: trunk/FreeOrion/universe/Effect.h =================================================================== --- trunk/FreeOrion/universe/Effect.h 2012-03-11 07:36:50 UTC (rev 4706) +++ trunk/FreeOrion/universe/Effect.h 2012-03-11 07:38:33 UTC (rev 4707) @@ -49,6 +49,7 @@ class GenerateSitRepMessage; class SetDestination; class SetOverlayTexture; + class SetTexture; } namespace ValueRef { template <class T> @@ -96,12 +97,14 @@ void Execute(int source_id, const TargetSet& targets) const; void Execute(int source_id, const TargetsAndCause& targets_and_cause, AccountingMap& accounting_map) const; - /** execute all SetMeter effects in group. This is useful for doing meter + /** execute all SetMeter effects in group. This is useful for doing meter * estimate updates and effect accounting, for which executing non-meter * effects is neither needed nor useful. */ void ExecuteSetMeter(int source_id, const TargetSet& targets) const; void ExecuteSetMeter(int source_id, const TargetsAndCause& targets_and_cause, AccountingMap& accounting_map) const; + /** execute all appearance modifying effects in group. */ + void ExecuteAppearanceModifications(int source_id, const TargetSet& targets) const; const std::string& StackingGroup() const; const std::vector<EffectBase*>& EffectsList() const; @@ -714,8 +717,7 @@ /** Applies an overlay texture to Systems. */ class Effect::SetOverlayTexture : public Effect::EffectBase { public: - SetOverlayTexture(const std::string& texture, - const ValueRef::ValueRefBase<double>* size = 0); + SetOverlayTexture(const std::string& texture, const ValueRef::ValueRefBase<double>* size); virtual ~SetOverlayTexture(); virtual void Execute(const ScriptingContext& context) const; @@ -723,15 +725,32 @@ virtual std::string Dump() const; private: - std::string m_texture; - const ValueRef::ValueRefBase<double>* m_size; + std::string m_texture; + const ValueRef::ValueRefBase<double>* m_size; friend class boost::serialization::access; template <class Archive> void serialize(Archive& ar, const unsigned int version); }; +/** Applies a texture to Planets. */ +class Effect::SetTexture : public Effect::EffectBase { +public: + SetTexture(const std::string& texture); + virtual ~SetTexture(); + virtual void Execute(const ScriptingContext& context) const; + virtual std::string Description() const; + virtual std::string Dump() const; + +private: + std::string m_texture; + + friend class boost::serialization::access; + template <class Archive> + void serialize(Archive& ar, const unsigned int version); +}; + // template implementations template <class Archive> void Effect::EffectsGroup::serialize(Archive& ar, const unsigned int version) @@ -950,5 +969,12 @@ & BOOST_SERIALIZATION_NVP(m_size); } +template <class Archive> +void Effect::SetTexture::serialize(Archive& ar, const unsigned int version) +{ + ar & BOOST_SERIALIZATION_BASE_OBJECT_NVP(EffectBase) + & BOOST_SERIALIZATION_NVP(m_texture); +} + #endif // _Effect_h_ |