From efa30b38402fa9a6e27f38ef3fbaf6e11ab2d47b Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 27 Mar 2018 23:05:40 -0400 Subject: [PATCH] Schema: Accept [elseif] in [if] and change [switch][default] to [else] --- data/schema/units/modifications.cfg | 4 ++-- src/serialization/tag.cpp | 24 ++++++++++++++++++------ 2 files changed, 20 insertions(+), 8 deletions(-) diff --git a/data/schema/units/modifications.cfg b/data/schema/units/modifications.cfg index a3680a7e5dda..a057d5ca26b0 100644 --- a/data/schema/units/modifications.cfg +++ b/data/schema/units/modifications.cfg @@ -209,10 +209,10 @@ {SIMPLE_KEY types string_list} {SIMPLE_KEY amlas string_list} [/case] - [default] + [else] any_tag=yes {ANY_KEY string} - [/default] + [/else] [/switch] {WML_MERGE_KEYS} [/tag] diff --git a/src/serialization/tag.cpp b/src/serialization/tag.cpp index 885c0a19881a..63f1e4073fd3 100644 --- a/src/serialization/tag.cpp +++ b/src/serialization/tag.cpp @@ -513,24 +513,36 @@ void class_tag::add_switch(const config& switch_cfg) const std::string name = formatter() << get_name() << '[' << key << '=' << case_cfg["value"] << ']'; conditions_.back().set_name(name); } - if(switch_cfg.has_child("default")) { - conditions_.emplace_back(switch_cfg.child("default"), default_cfg); - const std::string name = formatter() << get_name() << "[default]"; + if(switch_cfg.has_child("else")) { + conditions_.emplace_back(switch_cfg.child("else"), default_cfg); + const std::string name = formatter() << get_name() << "[else]"; conditions_.back().set_name(name); } } void class_tag::add_filter(const config& cond_cfg) { - config filter = cond_cfg; - filter.clear_children("then", "else"); + config filter = cond_cfg, else_filter; + filter.clear_children("then", "else", "elseif"); + // Note in case someone gets trigger-happy: + // DO NOT MOVE THIS! It needs to be copied! + else_filter.add_child("not", filter); if(cond_cfg.has_child("then")) { conditions_.emplace_back(cond_cfg.child("then"), filter); const std::string name = formatter() << get_name() << "[then]"; conditions_.back().set_name(name); } + int i = 1; + for(auto elseif_cfg : cond_cfg.child_range("elseif")) { + config elseif_filter = elseif_cfg; + elseif_filter.clear_children("then"); + conditions_.emplace_back(elseif_cfg.child("then"), elseif_filter); + else_filter.add_child("not", elseif_filter); + const std::string name = formatter() << get_name() << "[elseif " << i++ << "]"; + conditions_.back().set_name(name); + } if(cond_cfg.has_child("else")) { - conditions_.emplace_back(cond_cfg.child("else"), config{"not", filter}); + conditions_.emplace_back(cond_cfg.child("else"), else_filter); const std::string name = formatter() << get_name() << "[else]"; conditions_.back().set_name(name); }