Author: anonymissimus
Date: Wed Nov  9 01:22:25 2011
New Revision: 51930

URL: http://svn.gna.org/viewcvs/wesnoth?rev=51930&view=rev
Log:
delay/add variable substitution in unit::add_modification (fix for bug #18893)

Modified:
    trunk/src/actions.cpp
    trunk/src/dialogs.cpp
    trunk/src/game_events.cpp
    trunk/src/scripting/lua.cpp
    trunk/src/unit.cpp
    trunk/src/unit.hpp

Modified: trunk/src/actions.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/actions.cpp?rev=51930&r1=51929&r2=51930&view=diff
==============================================================================
--- trunk/src/actions.cpp (original)
+++ trunk/src/actions.cpp Wed Nov  9 01:22:25 2011
@@ -1658,7 +1658,7 @@
                                        config &variation = 
mod.add_child("effect");
                                        variation["apply_to"] = "variation";
                                        variation["name"] = undead_variation;
-                                       
newunit.add_modification("variation",mod);
+                                       newunit.add_modification("variation", 
vconfig(mod));
                                        newunit.heal_all();
                                }
                                units_.add(death_loc, newunit);

Modified: trunk/src/dialogs.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/dialogs.cpp?rev=51930&r1=51929&r2=51930&view=diff
==============================================================================
--- trunk/src/dialogs.cpp (original)
+++ trunk/src/dialogs.cpp Wed Nov  9 01:22:25 2011
@@ -99,7 +99,7 @@
        {
                if (mod["always_display"].to_bool()) always_display = true;
                sample_units.push_back(::get_advanced_unit(*u, u->type_id()));
-               sample_units.back().add_modification("advance", mod);
+               sample_units.back().add_modification("advance", vconfig(mod));
                const unit& type = sample_units.back();
                if (!mod["image"].empty()) {
                        lang_options.push_back(IMAGE_PREFIX + 
mod["image"].str() + COLUMN_SEPARATOR + mod["description"].str());
@@ -228,7 +228,7 @@
                }
 
                amla_unit.set_experience(amla_unit.experience() - 
amla_unit.max_experience());
-               amla_unit.add_modification("advance",mod_option);
+               amla_unit.add_modification("advance", vconfig(mod_option));
                resources::units->replace(loc, amla_unit);
 
                if(fire_event)

Modified: trunk/src/game_events.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/game_events.cpp?rev=51930&r1=51929&r2=51930&view=diff
==============================================================================
--- trunk/src/game_events.cpp (original)
+++ trunk/src/game_events.cpp Wed Nov  9 01:22:25 2011
@@ -1101,7 +1101,7 @@
                config &effect = mod.add_child("effect");
                effect["apply_to"] = "variation";
                effect["name"] = variation;
-               fake_unit->add_modification("variation",mod);
+               fake_unit->add_modification("variation", vconfig(mod));
        }
 
        if(!img_mods.empty()) {
@@ -1109,7 +1109,7 @@
                config &effect = mod.add_child("effect");
                effect["apply_to"] = "image_mod";
                effect["add"] = img_mods;
-               fake_unit->add_modification("image_mod",mod);
+               fake_unit->add_modification("image_mod", vconfig(mod));
        }
 
        return fake_unit;
@@ -1891,7 +1891,7 @@
        {
                text = cfg["description"].str();
 
-               u->add_modification("object", cfg.get_parsed_config());
+               u->add_modification("object", cfg);
 
                resources::screen->select_hex(event_info.loc1);
                resources::screen->invalidate_unit();

Modified: trunk/src/scripting/lua.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/scripting/lua.cpp?rev=51930&r1=51929&r2=51930&view=diff
==============================================================================
--- trunk/src/scripting/lua.cpp (original)
+++ trunk/src/scripting/lua.cpp Wed Nov  9 01:22:25 2011
@@ -3258,8 +3258,8 @@
        if (sm != "advance" && sm != "object" && sm != "trait")
                return luaL_argerror(L, 2, "unknown modification type");
 
-       config cfg = luaW_checkconfig(L, 3);
-       u->add_modification(sm, cfg);
+       const vconfig& vcfg = luaW_checkvconfig(L, 3);
+       u->add_modification(sm, vcfg);
        return 0;
 }
 

Modified: trunk/src/unit.cpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/unit.cpp?rev=51930&r1=51929&r2=51930&view=diff
==============================================================================
--- trunk/src/unit.cpp (original)
+++ trunk/src/unit.cpp Wed Nov  9 01:22:25 2011
@@ -2318,23 +2318,24 @@
        }
 }
 
-void unit::add_modification(const std::string& type, const config& mod, bool 
no_add)
+void unit::add_modification(const std::string& type, const vconfig& vcfg, bool 
no_add)
 {
        //some trait activate specific flags
        if(type == "trait") {
-               const std::string& id = mod["id"];
+               const std::string id = vcfg["id"].str();
                is_fearless_ = is_fearless_ || id == "fearless";
                is_healthy_ = is_healthy_ || id == "healthy";
        }
 
        config *new_child = NULL;
        if(no_add == false) {
-               new_child = &modifications_.add_child(type,mod);
+               new_child = &modifications_.add_child(type, vcfg.get_config());
        }
        config last_effect;
        std::vector<t_string> effects_description;
-       foreach (const config &effect, mod.child_range("effect"))
+       foreach (const vconfig& veffect, vcfg.get_children("effect"))
        {
+               const config& effect = veffect.get_parsed_config();
                // See if the effect only applies to certain unit types
                const std::string &type_filter = effect["unit_type"];
                if(type_filter.empty() == false) {
@@ -2354,8 +2355,9 @@
                }
                /** @todo The above two filters can be removed in 1.7 they're 
covered by the SUF. */
                // Apply SUF. (Filtering on location is probably a bad idea 
though.)
-               if (const config &afilter = effect.child("filter"))
-                   if (!matches_filter(vconfig(afilter), map_location(cfg_, 
NULL))) continue;
+               const vconfig& afilter = veffect.child("filter");
+               if (!afilter.null())
+                   if (!matches_filter(afilter, map_location(cfg_, NULL))) 
continue;
 
                const std::string &apply_to = effect["apply_to"];
                const std::string &apply_times = effect["times"];
@@ -2543,7 +2545,7 @@
                                        }
                                } else if (apply_to == "new_ability") {
                                        config &ab = 
cfg_.child_or_add("abilities");
-                                       if (const config &ab_effect = 
effect.child("abilities")) {
+                                       if (const config &ab_effect = 
veffect.child("abilities").get_config()) {
                                                config to_append;
                                                foreach (const 
config::any_child &ab, ab_effect.all_children_range()) {
                                                        
if(!has_ability_by_id(ab.cfg["id"])) {
@@ -2668,7 +2670,7 @@
 
        t_string description;
 
-       const t_string& mod_description = mod["description"];
+       const t_string mod_description = vcfg["description"].t_str();
        if (!mod_description.empty()) {
                description = mod_description + " ";
        }
@@ -2686,16 +2688,16 @@
 
        // store trait info
        if(type == "trait") {
-               add_trait_description(mod, description);
+               add_trait_description(vcfg, description);
        }
 
        //NOTE: if not a trait, description is currently not used
 }
 
-void unit::add_trait_description(const config& trait, const t_string& 
description)
+void unit::add_trait_description(const vconfig& trait, const t_string& 
description)
 {
        const std::string& gender_string = gender_ == unit_race::FEMALE ? 
"female_name" : "male_name";
-       t_string const &gender_specific_name = trait[gender_string];
+       t_string const gender_specific_name = trait[gender_string].t_str();
 
        // if this is a t_string& instead of a t_string, msvc9 compiled windows 
binaries
        // choke on the case where both gender_specific_name and trait["name"] 
are empty.
@@ -2745,7 +2747,7 @@
                const std::string& mod = ModificationTypes[i];
                foreach (const config &m, modifications_.child_range(mod)) {
                        log_scope("add mod");
-                       add_modification(ModificationTypes[i], m, true);
+                       add_modification(ModificationTypes[i], vconfig(m), 
true);
                }
        }
 

Modified: trunk/src/unit.hpp
URL: 
http://svn.gna.org/viewcvs/wesnoth/trunk/src/unit.hpp?rev=51930&r1=51929&r2=51930&view=diff
==============================================================================
--- trunk/src/unit.hpp (original)
+++ trunk/src/unit.hpp Wed Nov  9 01:22:25 2011
@@ -260,7 +260,7 @@
 
        size_t modification_count(const std::string& type, const std::string& 
id) const;
 
-       void add_modification(const std::string& type, const config& 
modification,
+       void add_modification(const std::string& type, const vconfig& vcfg,
                          bool no_add=false);
 
        bool move_interrupted() const { return movement_left() > 0 && 
interrupted_move_.x >= 0 && interrupted_move_.y >= 0; }
@@ -365,7 +365,7 @@
        void remove_ability_by_id(const std::string& ability);
 
        /** register a trait's name and its description for UI's use*/
-       void add_trait_description(const config& trait, const t_string& 
description);
+       void add_trait_description(const vconfig& trait, const t_string& 
description);
 
        void set_underlying_id();
 


_______________________________________________
Wesnoth-commits mailing list
[email protected]
https://mail.gna.org/listinfo/wesnoth-commits

Reply via email to