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