From 6e0886434556975a4c51d04c1929f6823b835203 Mon Sep 17 00:00:00 2001 From: Boris Nagaev Date: Sat, 7 Nov 2015 11:53:36 +0300 Subject: [PATCH 001/240] respect CMAKE_MODULE_PATH provided by user Cross-compiling to Windows with MXE [1] requires providing custom CMAKE_MODULE_PATH variable for CMake: $ cmake -DCMAKE_MODULE_PATH=/file/provided/by/mxe.cmake As Wesnoth's CMakeLists.txt resets CMAKE_MODULE_PATH, the effect of CMAKE_MODULE_PATH provided by MXE is disabled and the build fails with linking errors [2]. This commit changes CMakeLists.txt to respect the value of user provided CMAKE_MODULE_PATH, so both MXE and Wesnoth customizations of CMake variables are applied. [1] http://mxe.cc/ [2] https://gist.github.com/starius/abfb9033d92f21ef521d --- CMakeLists.txt | 4 ++-- doc/man/CMakeLists.txt | 2 +- doc/manual/CMakeLists.txt | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 25dd76eeeee0..1073947a8a05 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -18,7 +18,7 @@ endif(COMMAND cmake_policy) set(CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true) # use our own version of FindBoost.cmake and other Find* scripts -set(CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake) +list(APPEND CMAKE_MODULE_PATH "${CMAKE_SOURCE_DIR}/cmake") # # Options @@ -723,7 +723,7 @@ install(FILES l10n-track DESTINATION ${DATADIR}) # configure_file( - "${CMAKE_MODULE_PATH}/uninstall.cmake.in" + "${CMAKE_SOURCE_DIR}/cmake/uninstall.cmake.in" "${CMAKE_CURRENT_BINARY_DIR}/uninstall.cmake" IMMEDIATE @ONLY ) diff --git a/doc/man/CMakeLists.txt b/doc/man/CMakeLists.txt index 2eb79b622b5e..782f1e57b7e4 100644 --- a/doc/man/CMakeLists.txt +++ b/doc/man/CMakeLists.txt @@ -23,7 +23,7 @@ if(ENABLE_POT_UPDATE_TARGET) COMMAND ${CMAKE_COMMAND} -DPROJECT_SOURCE_DIR="${PROJECT_SOURCE_DIR}" -DMANPAGES="${ALL_MANPAGES}" - -P "${CMAKE_MODULE_PATH}/po4a-man.cmake" + -P "${CMAKE_SOURCE_DIR}/cmake/po4a-man.cmake" DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/wesnoth.6 ${CMAKE_CURRENT_SOURCE_DIR}/wesnothd.6 diff --git a/doc/manual/CMakeLists.txt b/doc/manual/CMakeLists.txt index 3179de3ab612..7f193734303d 100644 --- a/doc/manual/CMakeLists.txt +++ b/doc/manual/CMakeLists.txt @@ -83,7 +83,7 @@ if(ENABLE_POT_UPDATE_TARGET) COMMAND ${CMAKE_COMMAND} -DSOURCE="manual.${LINGUA}.xml" -DCMD="${CMD}" - -P "${CMAKE_MODULE_PATH}/po4a-manual.cmake" + -P "${CMAKE_SOURCE_DIR}/cmake/po4a-manual.cmake" COMMAND ${CMAKE_COMMAND} -E remove manual.${LINGUA}.xml DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/manual.${LINGUA}.xml COMMENT "[update-po4a-manual ${LINGUA}] Building ${LINGUA}.html." From 97b33cfdfca346a1ef265b7c4cf9713577eff6f3 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sun, 27 Mar 2016 23:22:43 -0400 Subject: [PATCH 002/240] Allow the attacks aspect to be implemented with Lua Semi-related changes also included: - Unit filter now has empty() and to_config() methods - Advancements aspect now unrefs its function on destruction - Const correctness for ai.get_attacks() --- changelog | 4 + src/ai/default/aspect_attacks.cpp | 138 +++++++++++++++++++++++++---- src/ai/default/aspect_attacks.hpp | 44 +++++++-- src/ai/lua/aspect_advancements.cpp | 8 ++ src/ai/lua/aspect_advancements.hpp | 4 +- src/ai/lua/core.cpp | 12 +-- src/ai/lua/lua_object.cpp | 47 +++++++++- src/ai/lua/lua_object.hpp | 7 +- src/ai/registry.cpp | 3 + src/units/filter.cpp | 16 ++++ src/units/filter.hpp | 9 ++ 11 files changed, 256 insertions(+), 36 deletions(-) diff --git a/changelog b/changelog index 7edf271215c1..8ab47e4efd81 100644 --- a/changelog +++ b/changelog @@ -147,6 +147,10 @@ Version 1.13.4+dev: * New wesnoth.micro_ais table contains the loaders for all Micro AIs. New loaders can easily be installed by add-ons. See any built-in micro AI (in ai/micro_ais/mai-defs/) for an example of how to do this. + * The attacks aspect can now be defined as a Lua aspect. The code + should return a table with keys "own" and "enemy", each of which may + be either a unit filter table or a function which takes a unit as a + parameter and returns true or false. * Wesnoth formula engine: * Formulas in unit filters can now access nearly all unit attributes * New syntax features: diff --git a/src/ai/default/aspect_attacks.cpp b/src/ai/default/aspect_attacks.cpp index 91bbaf8afa41..93d42916ed98 100644 --- a/src/ai/default/aspect_attacks.cpp +++ b/src/ai/default/aspect_attacks.cpp @@ -30,6 +30,8 @@ #include "units/unit.hpp" #include "pathfind/pathfind.hpp" #include "units/filter.hpp" +#include "scripting/lua_api.hpp" +#include "lauxlib.h" namespace ai { @@ -40,30 +42,35 @@ static lg::log_domain log_ai_testing_aspect_attacks("ai/aspect/attacks"); #define LOG_AI LOG_STREAM(info, log_ai_testing_aspect_attacks) #define ERR_AI LOG_STREAM(err, log_ai_testing_aspect_attacks) -aspect_attacks::aspect_attacks(readonly_context &context, const config &cfg, const std::string &id) +aspect_attacks_base::aspect_attacks_base(readonly_context &context, const config &cfg, const std::string &id) : typesafe_aspect(context,cfg,id) +{ +} + +aspect_attacks::aspect_attacks(readonly_context &context, const config &cfg, const std::string &id) + : aspect_attacks_base(context,cfg,id) , filter_own_() , filter_enemy_() { if (const config &filter_own = cfg.child("filter_own")) { - filter_own_ = filter_own; + vconfig vcfg(filter_own); + vcfg.make_safe(); + filter_own_.reset(new unit_filter(vcfg, resources::filter_con)); } if (const config &filter_enemy = cfg.child("filter_enemy")) { - filter_enemy_ = filter_enemy; + vconfig vcfg(filter_enemy); + vcfg.make_safe(); + filter_enemy_.reset(new unit_filter(vcfg, resources::filter_con)); } } -aspect_attacks::~aspect_attacks() -{ -} - -void aspect_attacks::recalculate() const +void aspect_attacks_base::recalculate() const { this->value_ = analyze_targets(); this->valid_ = true; } -boost::shared_ptr aspect_attacks::analyze_targets() const +boost::shared_ptr aspect_attacks_base::analyze_targets() const { const move_map& srcdst = get_srcdst(); const move_map& dstsrc = get_dstsrc(); @@ -74,10 +81,9 @@ boost::shared_ptr aspect_attacks::analyze_targets() const unit_map& units_ = *resources::units; std::vector unit_locs; - const unit_filter filt_own(vconfig(filter_own_), resources::filter_con); for(unit_map::const_iterator i = units_.begin(); i != units_.end(); ++i) { if (i->side() == get_side() && i->attacks_left() && !(i->can_recruit() && get_passive_leader())) { - if (!filt_own(*i)) { + if (!is_allowed_attacker(*i)) { continue; } unit_locs.push_back(i->get_location()); @@ -93,7 +99,6 @@ boost::shared_ptr aspect_attacks::analyze_targets() const unit_stats_cache().clear(); - const unit_filter filt_en(vconfig(filter_enemy_), resources::filter_con); for(unit_map::const_iterator j = units_.begin(); j != units_.end(); ++j) { // Attack anyone who is on the enemy side, @@ -101,7 +106,7 @@ boost::shared_ptr aspect_attacks::analyze_targets() const if (current_team().is_enemy(j->side()) && !j->incapacitated() && !j->invisible(j->get_location())) { - if (!filt_en( *j)) { + if (!is_allowed_enemy(*j)) { continue; } map_location adjacent[6]; @@ -120,7 +125,7 @@ boost::shared_ptr aspect_attacks::analyze_targets() const -void aspect_attacks::do_attack_analysis( +void aspect_attacks_base::do_attack_analysis( const map_location& loc, const move_map& srcdst, const move_map& dstsrc, const move_map& fullmove_srcdst, const move_map& fullmove_dstsrc, @@ -361,7 +366,7 @@ void aspect_attacks::do_attack_analysis( } } -int aspect_attacks::rate_terrain(const unit& u, const map_location& loc) +int aspect_attacks_base::rate_terrain(const unit& u, const map_location& loc) { const gamemap &map_ = resources::gameboard->map(); const t_translation::t_terrain terrain = map_.get_terrain(loc); @@ -396,15 +401,110 @@ int aspect_attacks::rate_terrain(const unit& u, const map_location& loc) config aspect_attacks::to_config() const { config cfg = typesafe_aspect::to_config(); - if (!filter_own_.empty()) { - cfg.add_child("filter_own",filter_own_); + if (filter_own_ && !filter_own_->empty()) { + cfg.add_child("filter_own", filter_own_->to_config()); } - if (!filter_enemy_.empty()) { - cfg.add_child("filter_enemy",filter_enemy_); + if (filter_enemy_ && !filter_enemy_->empty()) { + cfg.add_child("filter_enemy", filter_enemy_->to_config()); } return cfg; } +bool aspect_attacks::is_allowed_attacker(const unit& u) const +{ + return (*filter_own_)(u); +} + +bool aspect_attacks::is_allowed_enemy(const unit& u) const +{ + return (*filter_enemy_)(u); +} + } // end of namespace testing_ai_default +aspect_attacks_lua::aspect_attacks_lua(readonly_context &context, const config &cfg, const std::string &id, boost::shared_ptr& l_ctx) + : aspect_attacks_base(context, cfg, id) + , handler_(), code_(), params_(cfg.child_or_empty("args")) +{ + this->name_ = "lua_aspect"; + if (cfg.has_attribute("code")) + { + code_ = cfg["code"].str(); + } + else if (cfg.has_attribute("value")) + { + code_ = "return " + cfg["value"].apply_visitor(lua_aspect_visitor()); + } + else + { + // error + return; + } + handler_ = boost::shared_ptr(resources::lua_kernel->create_lua_ai_action_handler(code_.c_str(), *l_ctx)); +} + +void aspect_attacks_lua::recalculate() const +{ + obj_.reset(new lua_object); + handler_->handle(params_, true, obj_); + aspect_attacks_lua_filter filt = *obj_->get(); + aspect_attacks_base::recalculate(); + if(filt.lua) { + if(filt.ref_own_ != -1) { + luaL_unref(filt.lua, LUA_REGISTRYINDEX, filt.ref_own_); + } + if(filt.ref_enemy_ != -1) { + luaL_unref(filt.lua, LUA_REGISTRYINDEX, filt.ref_enemy_); + } + } + obj_.reset(); +} + +config aspect_attacks_lua::to_config() const +{ + config cfg = aspect::to_config(); + cfg["code"] = code_; + if (!params_.empty()) { + cfg.add_child("args", params_); + } + return cfg; +} + +static bool call_lua_filter_fcn(lua_State* L, const unit& u, int idx) +{ + lua_rawgeti(L, LUA_REGISTRYINDEX, idx); + new(lua_newuserdata(L, sizeof(lua_unit))) lua_unit(u.underlying_id()); + lua_pushlightuserdata(L, getunitKey); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_setmetatable(L, -2); + luaW_pcall(L, 1, 1); + bool result = luaW_toboolean(L, -1); + lua_pop(L, 1); + return result; +} + +bool aspect_attacks_lua::is_allowed_attacker(const unit& u) const +{ + const aspect_attacks_lua_filter& filt = *obj_->get(); + if(filt.lua && filt.ref_own_ != -1) { + return call_lua_filter_fcn(filt.lua, u, filt.ref_own_); + } else if(filt.filter_own_) { + return (*filt.filter_own_)(u); + } else { + return true; + } +} + +bool aspect_attacks_lua::is_allowed_enemy(const unit& u) const +{ + const aspect_attacks_lua_filter& filt = *obj_->get(); + if(filt.lua && filt.ref_enemy_ != -1) { + return call_lua_filter_fcn(filt.lua, u, filt.ref_enemy_); + } else if(filt.filter_enemy_) { + return (*filt.filter_enemy_)(u); + } else { + return true; + } +} + } // end of namespace ai diff --git a/src/ai/default/aspect_attacks.hpp b/src/ai/default/aspect_attacks.hpp index c0507566627e..e02e9da82be9 100644 --- a/src/ai/default/aspect_attacks.hpp +++ b/src/ai/default/aspect_attacks.hpp @@ -21,6 +21,7 @@ #define AI_TESTING_ASPECT_ATTACKS_HPP_INCLUDED #include "ai/composite/aspect.hpp" +#include "units/filter.hpp" #ifdef _MSC_VER #pragma warning(push) @@ -33,18 +34,19 @@ namespace ai { namespace ai_default_rca { -class aspect_attacks: public typesafe_aspect { +class aspect_attacks_base : public typesafe_aspect { public: - aspect_attacks(readonly_context &context, const config &cfg, const std::string &id); + aspect_attacks_base(readonly_context &context, const config &cfg, const std::string &id); - virtual ~aspect_attacks(); + virtual ~aspect_attacks_base() {} virtual void recalculate() const; - virtual config to_config() const; + virtual bool is_allowed_attacker(const unit& u) const = 0; + virtual bool is_allowed_enemy(const unit& u) const = 0; protected: @@ -60,14 +62,44 @@ class aspect_attacks: public typesafe_aspect { attack_analysis& cur_analysis, const team ¤t_team) const; static int rate_terrain(const unit& u, const map_location& loc); - config filter_own_; - config filter_enemy_; }; +class aspect_attacks : public aspect_attacks_base { +public: + aspect_attacks(readonly_context &context, const config &cfg, const std::string &id); + virtual ~aspect_attacks() {} + virtual bool is_allowed_attacker(const unit& u) const; + virtual bool is_allowed_enemy(const unit& u) const; + virtual config to_config() const; +private: + boost::shared_ptr filter_own_, filter_enemy_; +}; } // end of namespace testing_ai_default +struct aspect_attacks_lua_filter { + lua_State* lua; + boost::shared_ptr filter_own_, filter_enemy_; + int ref_own_, ref_enemy_; +}; + +class aspect_attacks_lua : public ai_default_rca::aspect_attacks_base { +public: + aspect_attacks_lua(readonly_context &context, const config &cfg, const std::string &id, boost::shared_ptr& l_ctx); + virtual ~aspect_attacks_lua() {} + + virtual bool is_allowed_attacker(const unit& u) const; + virtual bool is_allowed_enemy(const unit& u) const; + virtual config to_config() const; + virtual void recalculate() const; +private: + boost::shared_ptr handler_; + mutable boost::shared_ptr > obj_; + std::string code_; + const config params_; +}; + } // end of namespace ai #ifdef _MSC_VER diff --git a/src/ai/lua/aspect_advancements.cpp b/src/ai/lua/aspect_advancements.cpp index 54355c351038..561625350e62 100644 --- a/src/ai/lua/aspect_advancements.cpp +++ b/src/ai/lua/aspect_advancements.cpp @@ -59,6 +59,14 @@ unit_advancements_aspect::unit_advancements_aspect(const std::string& val): val { } +unit_advancements_aspect::~unit_advancements_aspect() +{ + if(L_) { + // Remove the function from the registry + luaL_unref(L_, LUA_REGISTRYINDEX, ref_); + } +} + const std::vector unit_advancements_aspect::get_advancements(const unit_map::const_iterator& unit) const { diff --git a/src/ai/lua/aspect_advancements.hpp b/src/ai/lua/aspect_advancements.hpp index a0b4f70ec8b2..8c48ed42fa15 100644 --- a/src/ai/lua/aspect_advancements.hpp +++ b/src/ai/lua/aspect_advancements.hpp @@ -31,9 +31,7 @@ class unit_advancements_aspect unit_advancements_aspect(lua_State* L, int n); unit_advancements_aspect(const std::string& val); const std::vector get_advancements(const unit_map::const_iterator& unit) const; - virtual ~unit_advancements_aspect() - { - } + virtual ~unit_advancements_aspect(); const std::string get_value() const; private: diff --git a/src/ai/lua/core.cpp b/src/ai/lua/core.cpp index d8280fc95fce..5d327356510d 100644 --- a/src/ai/lua/core.cpp +++ b/src/ai/lua/core.cpp @@ -54,7 +54,7 @@ static char const aisKey = 0; namespace ai { -static void push_attack_analysis(lua_State *L, attack_analysis&); +static void push_attack_analysis(lua_State *L, const attack_analysis&); void lua_ai_context::init(lua_State *L) { @@ -410,11 +410,11 @@ static int cfun_ai_get_attack_depth(lua_State *L) static int cfun_ai_get_attacks(lua_State *L) { - ai::attacks_vector attacks = get_readonly_context(L).get_attacks(); + const ai::attacks_vector& attacks = get_readonly_context(L).get_attacks(); lua_createtable(L, attacks.size(), 0); int table_index = lua_gettop(L); - ai::attacks_vector::iterator it = attacks.begin(); + ai::attacks_vector::const_iterator it = attacks.begin(); for (int i = 1; it != attacks.end(); ++it, ++i) { push_attack_analysis(L, *it); @@ -546,7 +546,7 @@ static int cfun_attack_rating(lua_State *L) // the attack_analysis table should be on top of the stack lua_getfield(L, -1, "att_ptr"); // [-2: attack_analysis; -1: pointer to attack_analysis object in c++] // now the pointer to our attack_analysis C++ object is on top - attack_analysis* aa_ptr = static_cast< attack_analysis * >(lua_touserdata(L, -1)); + const attack_analysis* aa_ptr = static_cast< attack_analysis * >(lua_touserdata(L, -1)); //[-2: attack_analysis; -1: pointer to attack_analysis object in c++] @@ -586,13 +586,13 @@ static void push_movements(lua_State *L, const std::vector< std::pair < map_loca } -static void push_attack_analysis(lua_State *L, attack_analysis& aa) +static void push_attack_analysis(lua_State *L, const attack_analysis& aa) { lua_newtable(L); // Pushing a pointer to the current object lua_pushstring(L, "att_ptr"); - lua_pushlightuserdata(L, &aa); + lua_pushlightuserdata(L, const_cast(&aa)); lua_rawset(L, -3); // Registering callback function for the rating method diff --git a/src/ai/lua/lua_object.cpp b/src/ai/lua/lua_object.cpp index e037bdbe14e7..0b6a5ccffb87 100644 --- a/src/ai/lua/lua_object.cpp +++ b/src/ai/lua/lua_object.cpp @@ -18,7 +18,15 @@ */ -#include "lua_object.hpp" +#include "ai/lua/lua_object.hpp" +#include "ai/lua/engine_lua.hpp" +#include "ai/default/aspect_attacks.hpp" +#include "scripting/lua_types.hpp" +#include "scripting/lua_common.hpp" +#include "resources.hpp" + +#include +#include "lauxlib.h" namespace ai { @@ -26,5 +34,42 @@ namespace ai { { // empty } + + template <> + boost::shared_ptr lua_object::to_type(lua_State *L, int n) + { + boost::shared_ptr att(new aspect_attacks_lua_filter); + att->lua = NULL; + att->ref_own_ = att->ref_enemy_ = -1; + if(!lua_istable(L, n)) { + return att; + } + lua_getfield(L, n, "own"); + if(lua_istable(L, -1)) { + config cfg; + vconfig vcfg(cfg, true); + if(luaW_tovconfig(L, -1, vcfg)) { + att->filter_own_.reset(new unit_filter(vcfg, resources::filter_con)); + } + } else if(lua_isfunction(L, -1)) { + att->lua = L; + att->ref_own_ = luaL_ref(L, LUA_REGISTRYINDEX); + assert(att->ref_own_ != -1); + } + lua_getfield(L, n, "enemy"); + if(lua_istable(L, -1)) { + config cfg; + vconfig vcfg(cfg, true); + if(luaW_tovconfig(L, -1, vcfg)) { + att->filter_enemy_.reset(new unit_filter(vcfg, resources::filter_con)); + } + } else if(lua_isfunction(L, -1)) { + att->lua = L; + att->ref_enemy_ = luaL_ref(L, LUA_REGISTRYINDEX); + assert(att->ref_enemy_ != -1); + } + lua_pop(L, 2); + return att; + } } //end of namespace ai diff --git a/src/ai/lua/lua_object.hpp b/src/ai/lua/lua_object.hpp index ab994a85d653..6d90b0a46c3e 100644 --- a/src/ai/lua/lua_object.hpp +++ b/src/ai/lua/lua_object.hpp @@ -69,7 +69,7 @@ class lua_object : public lua_object_base void store(lua_State* L, int n) { - this->value_ = boost::shared_ptr(to_type(L, n)); + this->value_ = boost::shared_ptr(to_type(L, lua_absindex(L, n))); } protected: @@ -200,6 +200,11 @@ inline boost::shared_ptr lua_object uaa = boost::shared_ptr(new unit_advancements_aspect(L, n)); return uaa; } + +// This one is too complex to define in the header. +struct aspect_attacks_lua_filter; +template <> +boost::shared_ptr lua_object::to_type(lua_State *L, int n); } // end of namespace ai diff --git a/src/ai/registry.cpp b/src/ai/registry.cpp index ce9328e0c796..180cc1a60dcb 100644 --- a/src/ai/registry.cpp +++ b/src/ai/registry.cpp @@ -419,6 +419,9 @@ static register_lua_aspect_factory< lua_aspect > static register_lua_aspect_factory< lua_aspect > attack_depth__lua_aspect_factory("attack_depth*lua_aspect"); +static register_lua_aspect_factory< aspect_attacks_lua > + attacks__lua_aspect_factory("attacks*lua_aspect"); + static register_lua_aspect_factory< lua_aspect > avoid__lua_aspect_factory("avoid*lua_aspect"); diff --git a/src/units/filter.cpp b/src/units/filter.cpp index 96053e02ff21..e96ad007d617 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -48,6 +48,11 @@ static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) #define DBG_CF LOG_STREAM(debug, log_config) +// Defined out of line to avoid including config in unit_filter.hpp +config unit_filter::to_config() const { + return impl_->to_config(); +} + ///Defined out of line to prevent including unit at unit_filter.hpp bool unit_filter::matches(const unit & u) const { return matches (u, u.get_location()); @@ -95,6 +100,14 @@ class null_unit_filter_impl : public unit_filter_abstract_impl { virtual ~null_unit_filter_impl() {} + + config to_config() const { + return config(); + } + + bool empty() const { + return true; + } private: const filter_context & fc_; @@ -159,6 +172,9 @@ class basic_unit_filter_impl : public unit_filter_abstract_impl { virtual bool matches(const unit & u, const map_location & loc, const unit * u2) const; virtual std::vector all_matches_on_map(unsigned max_matches) const; virtual unit_const_ptr first_match_on_map() const; + config to_config() const { + return vcfg.get_config(); + } virtual ~basic_unit_filter_impl() {} private: diff --git a/src/units/filter.hpp b/src/units/filter.hpp index 6d0f0dcbaba4..409778af2a7c 100644 --- a/src/units/filter.hpp +++ b/src/units/filter.hpp @@ -33,6 +33,7 @@ class filter_context; class unit; +class config; class vconfig; struct map_location; @@ -41,6 +42,8 @@ class unit_filter_abstract_impl { virtual bool matches(const unit & u, const map_location & loc, const unit * u2 = NULL) const = 0; virtual std::vector all_matches_on_map(unsigned max_matches) const = 0; virtual unit_const_ptr first_match_on_map() const = 0; + virtual config to_config() const = 0; + virtual bool empty() const {return false;} virtual ~unit_filter_abstract_impl() {} }; @@ -95,6 +98,12 @@ class unit_filter { unit_const_ptr first_match_on_map() const { return impl_->first_match_on_map(); } + + config to_config() const; + + bool empty() const { + return impl_->empty(); + } private: boost::shared_ptr impl_; unsigned max_matches_; From 263227852a5f55e1a64b5c18b02bb8a1367899c1 Mon Sep 17 00:00:00 2001 From: mattsc Date: Sun, 27 Mar 2016 19:13:47 -0700 Subject: [PATCH 003/240] Micro AI CAs: use consistent indenting --- data/ai/micro_ais/cas/ca_zone_guardian.lua | 2 +- data/ai/micro_ais/micro_ai_wml_tag.lua | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/data/ai/micro_ais/cas/ca_zone_guardian.lua b/data/ai/micro_ais/cas/ca_zone_guardian.lua index 475ffdde94e3..9d3bfe2409dd 100644 --- a/data/ai/micro_ais/cas/ca_zone_guardian.lua +++ b/data/ai/micro_ais/cas/ca_zone_guardian.lua @@ -22,7 +22,7 @@ function ca_zone_guardian:execution(cfg) local guardian = get_guardian(cfg) local reach = wesnoth.find_reach(guardian) - local zone = H.get_child(cfg, "filter_location") + local zone = H.get_child(cfg, "filter_location") local zone_enemy = H.get_child(cfg, "filter_location_enemy") or zone local enemies = wesnoth.get_units { { "filter_side", { { "enemy_of", { side = wesnoth.current.side } } } }, diff --git a/data/ai/micro_ais/micro_ai_wml_tag.lua b/data/ai/micro_ais/micro_ai_wml_tag.lua index 9c92218624a6..123ec68d24c7 100644 --- a/data/ai/micro_ais/micro_ai_wml_tag.lua +++ b/data/ai/micro_ais/micro_ai_wml_tag.lua @@ -38,15 +38,15 @@ function wesnoth.wml_actions.micro_ai(cfg) if wesnoth.micro_ais[cfg.ai_type] == nil then H.wml_error("unknown value for ai_type= in [micro_ai]") end - + local required_keys, optional_keys, CA_parms = wesnoth.micro_ais[cfg.ai_type](cfg) - + -- Fixup any relative CA paths for i,v in ipairs(CA_parms) do - if v.location and v.location:find('~') ~= 1 then - v.location = CA_path .. v.location - end + if v.location and v.location:find('~') ~= 1 then + v.location = CA_path .. v.location + end end - + MAIH.micro_ai_setup(cfg, CA_parms, required_keys, optional_keys) end From 9ed1b39b90713650f94b025104ce8bce90872c06 Mon Sep 17 00:00:00 2001 From: mattsc Date: Sun, 27 Mar 2016 19:14:17 -0700 Subject: [PATCH 004/240] Random Recruiting MAI: use require() instead of dofile() --- data/ai/micro_ais/cas/ca_recruit_random.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/ai/micro_ais/cas/ca_recruit_random.lua b/data/ai/micro_ais/cas/ca_recruit_random.lua index fdacf885b5ae..3bdadd2253f8 100644 --- a/data/ai/micro_ais/cas/ca_recruit_random.lua +++ b/data/ai/micro_ais/cas/ca_recruit_random.lua @@ -1,6 +1,6 @@ local H = wesnoth.require "lua/helper.lua" local AH = wesnoth.require("ai/lua/ai_helper.lua") -local LS = wesnoth.dofile "lua/location_set.lua" +local LS = wesnoth.require "lua/location_set.lua" local recruit_type From 1e3d80df0ba43c95efaad628c3649d245f476cdd Mon Sep 17 00:00:00 2001 From: mattsc Date: Sun, 27 Mar 2016 20:38:35 -0700 Subject: [PATCH 005/240] Micro AI tests: do not change controller to null for active side --- data/ai/micro_ais/scenarios/animals.cfg | 21 +++++++++++++-------- data/ai/micro_ais/scenarios/goto.cfg | 11 +++++++---- data/ai/micro_ais/scenarios/wolves.cfg | 21 +++++++++++++-------- 3 files changed, 33 insertions(+), 20 deletions(-) diff --git a/data/ai/micro_ais/scenarios/animals.cfg b/data/ai/micro_ais/scenarios/animals.cfg index 549ca6e43838..da4716199c0c 100644 --- a/data/ai/micro_ais/scenarios/animals.cfg +++ b/data/ai/micro_ais/scenarios/animals.cfg @@ -360,14 +360,19 @@ Also note: The Animal AIs are coded as Micro AIs. A Micro AI can be added and ad [option] label= _ "I'll just watch the animals." [command] - [modify_side] - side=1 - controller=null - hidden=yes - [/modify_side] - [kill] - side=1 - [/kill] + [end_turn] + [/end_turn] + [event] + name=side 2 turn + [modify_side] + side=1 + controller=null + hidden=yes + [/modify_side] + [kill] + side=1 + [/kill] + [/event] [/command] [/option] [option] diff --git a/data/ai/micro_ais/scenarios/goto.cfg b/data/ai/micro_ais/scenarios/goto.cfg index 247271aae09a..e549d7097af9 100644 --- a/data/ai/micro_ais/scenarios/goto.cfg +++ b/data/ai/micro_ais/scenarios/goto.cfg @@ -365,12 +365,15 @@ {VARIABLE_CONDITIONAL scenario_name equals goto} [/show_if] [command] - [modify_side] - side=1 - controller=null - [/modify_side] [end_turn] [/end_turn] + [event] + name=side turn + [modify_side] + side=1 + controller=null + [/modify_side] + [/event] [/command] [/set_menu_item] [set_menu_item] diff --git a/data/ai/micro_ais/scenarios/wolves.cfg b/data/ai/micro_ais/scenarios/wolves.cfg index 42c555089771..b78d6dde8ca9 100644 --- a/data/ai/micro_ais/scenarios/wolves.cfg +++ b/data/ai/micro_ais/scenarios/wolves.cfg @@ -205,14 +205,19 @@ Also note that the wolves AI is coded as a Micro AI. A Micro AI can be added and [option] label= _ "I'll just watch the two wolf sides." [command] - [modify_side] - side=1 - controller=null - hidden=yes - [/modify_side] - [kill] - side=1 - [/kill] + [end_turn] + [/end_turn] + [event] + name=side 2 turn + [modify_side] + side=1 + controller=null + hidden=yes + [/modify_side] + [kill] + side=1 + [/kill] + [/event] [/command] [/option] [option] From 5b8e53855f32a63261eb4b3f026d370d0640b449 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sun, 27 Mar 2016 23:40:21 -0400 Subject: [PATCH 006/240] Fixup include --- src/ai/default/aspect_attacks.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ai/default/aspect_attacks.cpp b/src/ai/default/aspect_attacks.cpp index 93d42916ed98..4db985256c05 100644 --- a/src/ai/default/aspect_attacks.cpp +++ b/src/ai/default/aspect_attacks.cpp @@ -31,7 +31,7 @@ #include "pathfind/pathfind.hpp" #include "units/filter.hpp" #include "scripting/lua_api.hpp" -#include "lauxlib.h" +#include "lua/lauxlib.h" namespace ai { From 49e7e03718b36fc2176eb2da01671780728f9c75 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 28 Mar 2016 00:16:26 -0400 Subject: [PATCH 007/240] Fixup include - again --- src/ai/lua/lua_object.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/ai/lua/lua_object.cpp b/src/ai/lua/lua_object.cpp index 0b6a5ccffb87..64dc52b43358 100644 --- a/src/ai/lua/lua_object.cpp +++ b/src/ai/lua/lua_object.cpp @@ -26,7 +26,7 @@ #include "resources.hpp" #include -#include "lauxlib.h" +#include "lua/lauxlib.h" namespace ai { From b555bc2bb7e1eafc4154d4b31ac355b01b7fd229 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 28 Mar 2016 00:35:14 -0400 Subject: [PATCH 008/240] Delete empty source files --- projectfiles/CodeBlocks/wesnoth.cbp | 2 - projectfiles/VC9/wesnoth.vcproj | 56 ------------------- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 6 -- src/CMakeLists.txt | 1 - src/SConscript | 1 - src/hotkey/hotkey_handler_replay.cpp | 0 src/hotkey/hotkey_handler_replay.hpp | 0 7 files changed, 66 deletions(-) delete mode 100644 src/hotkey/hotkey_handler_replay.cpp delete mode 100644 src/hotkey/hotkey_handler_replay.hpp diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index 142cf3a0dfd6..a574df2f208c 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -740,8 +740,6 @@ - - diff --git a/projectfiles/VC9/wesnoth.vcproj b/projectfiles/VC9/wesnoth.vcproj index 7e319174f783..b99d2c3dbb7a 100644 --- a/projectfiles/VC9/wesnoth.vcproj +++ b/projectfiles/VC9/wesnoth.vcproj @@ -19062,62 +19062,6 @@ RelativePath="..\..\src\hotkey\hotkey_handler_mp.hpp" > - - - - - - - - - - - - - - - - - - - - - - diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 0a439fc58617..4b3b6b7c0400 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -889,7 +889,6 @@ ECA4A67C1A1EC319006BCCF2 /* lua_map_location_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA4A6791A1EC319006BCCF2 /* lua_map_location_ops.cpp */; }; ECA4A67D1A1EC319006BCCF2 /* lua_rng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA4A67A1A1EC319006BCCF2 /* lua_rng.cpp */; }; ECA563871A47BA36006278A5 /* hotkey_handler_mp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563831A47BA36006278A5 /* hotkey_handler_mp.cpp */; }; - ECA563881A47BA36006278A5 /* hotkey_handler_replay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563841A47BA36006278A5 /* hotkey_handler_replay.cpp */; }; ECA563891A47BA36006278A5 /* hotkey_handler_sp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563851A47BA36006278A5 /* hotkey_handler_sp.cpp */; }; ECA5638A1A47BA36006278A5 /* hotkey_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563861A47BA36006278A5 /* hotkey_handler.cpp */; }; ECA9E7471CA20AA800A947D6 /* libreadline.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = ECA9E7461CA20AA800A947D6 /* libreadline.6.dylib */; }; @@ -1269,7 +1268,6 @@ 91B6218D1B7670DE00B00E0F /* help_topic_generators.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = help_topic_generators.hpp; sourceTree = ""; }; 91B6218F1B76717400B00E0F /* hotkey_handler.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = hotkey_handler.hpp; sourceTree = ""; }; 91B621901B76717B00B00E0F /* hotkey_handler_sp.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = hotkey_handler_sp.hpp; sourceTree = ""; }; - 91B621911B76718000B00E0F /* hotkey_handler_replay.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = hotkey_handler_replay.hpp; sourceTree = ""; }; 91B621921B76718700B00E0F /* hotkey_handler_mp.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = hotkey_handler_mp.hpp; sourceTree = ""; }; 91B621931B76720B00B00E0F /* make_enum.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = make_enum.hpp; sourceTree = ""; }; 91B621941B76722E00B00E0F /* mp_ui_alerts.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = mp_ui_alerts.hpp; sourceTree = ""; }; @@ -2201,7 +2199,6 @@ ECA4A6791A1EC319006BCCF2 /* lua_map_location_ops.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lua_map_location_ops.cpp; sourceTree = ""; }; ECA4A67A1A1EC319006BCCF2 /* lua_rng.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lua_rng.cpp; sourceTree = ""; }; ECA563831A47BA36006278A5 /* hotkey_handler_mp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hotkey_handler_mp.cpp; sourceTree = ""; }; - ECA563841A47BA36006278A5 /* hotkey_handler_replay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hotkey_handler_replay.cpp; sourceTree = ""; }; ECA563851A47BA36006278A5 /* hotkey_handler_sp.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hotkey_handler_sp.cpp; sourceTree = ""; }; ECA563861A47BA36006278A5 /* hotkey_handler.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = hotkey_handler.cpp; sourceTree = ""; }; ECA9E7461CA20AA800A947D6 /* libreadline.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libreadline.6.dylib; path = lib/libreadline.6.dylib; sourceTree = ""; }; @@ -3128,8 +3125,6 @@ 91B6218F1B76717400B00E0F /* hotkey_handler.hpp */, ECA563831A47BA36006278A5 /* hotkey_handler_mp.cpp */, 91B621921B76718700B00E0F /* hotkey_handler_mp.hpp */, - ECA563841A47BA36006278A5 /* hotkey_handler_replay.cpp */, - 91B621911B76718000B00E0F /* hotkey_handler_replay.hpp */, ECA563851A47BA36006278A5 /* hotkey_handler_sp.cpp */, 91B621901B76717B00B00E0F /* hotkey_handler_sp.hpp */, ECFA82DE184E59F3006782FB /* hotkey_item.cpp */, @@ -4507,7 +4502,6 @@ B5795A680F05858100EB190E /* horizontal_scrollbar.cpp in Sources */, ECFA82E4184E59F3006782FB /* hotkey_command.cpp in Sources */, ECA563871A47BA36006278A5 /* hotkey_handler_mp.cpp in Sources */, - ECA563881A47BA36006278A5 /* hotkey_handler_replay.cpp in Sources */, ECA563891A47BA36006278A5 /* hotkey_handler_sp.cpp in Sources */, ECA5638A1A47BA36006278A5 /* hotkey_handler.cpp in Sources */, ECFA82E5184E59F3006782FB /* hotkey_item.cpp in Sources */, diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ba74c5e3b056..443f70daf234 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -881,7 +881,6 @@ set(wesnoth-main_SRC hotkey/hotkey_handler.cpp hotkey/hotkey_handler_sp.cpp hotkey/hotkey_handler_mp.cpp - hotkey/hotkey_handler_replay.cpp intro.cpp leader_scroll_dialog.cpp map/map.cpp diff --git a/src/SConscript b/src/SConscript index e9c389171957..aa5261599e87 100644 --- a/src/SConscript +++ b/src/SConscript @@ -461,7 +461,6 @@ wesnoth_sources = Split(""" hotkey/hotkey_handler.cpp hotkey/hotkey_handler_sp.cpp hotkey/hotkey_handler_mp.cpp - hotkey/hotkey_handler_replay.cpp intro.cpp leader_scroll_dialog.cpp lobby_preferences.cpp diff --git a/src/hotkey/hotkey_handler_replay.cpp b/src/hotkey/hotkey_handler_replay.cpp deleted file mode 100644 index e69de29bb2d1..000000000000 diff --git a/src/hotkey/hotkey_handler_replay.hpp b/src/hotkey/hotkey_handler_replay.hpp deleted file mode 100644 index e69de29bb2d1..000000000000 From 6026780539eafaf2ab057103b540d1bcc34aa007 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Mon, 28 Mar 2016 16:21:58 +0300 Subject: [PATCH 009/240] Fixed wmllint mistake in 2cd4298f --- data/core/terrain.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/core/terrain.cfg b/data/core/terrain.cfg index 13e51b0a9d18..69073f511467 100644 --- a/data/core/terrain.cfg +++ b/data/core/terrain.cfg @@ -1106,8 +1106,8 @@ Most units have about 50% defense in rocky caves, whereas cavalry are limited to symbol_image=void/void #editor_image=cave/earthy-wall-hewn-tile id=cavewall_earthy_hewn - name="Cave Wall" - editor_name=_ "Reinforced Earthy Cave Wall" + name= _ "Cave Wall" + editor_name="Reinforced Earthy Cave Wall" # wmllint: ignore string=Xuce aliasof=Xt editor_group=cave,obstacle From c82ae94ae97e7b08d56ff51fddb2e2ada39b6ff4 Mon Sep 17 00:00:00 2001 From: mattsc Date: Mon, 28 Mar 2016 07:22:52 -0700 Subject: [PATCH 010/240] Random Recruiting Micro AI: fix [probability] tag --- data/ai/micro_ais/mai-defs/recruiting.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/ai/micro_ais/mai-defs/recruiting.lua b/data/ai/micro_ais/mai-defs/recruiting.lua index 30a1425d6673..c4a4d64a823b 100644 --- a/data/ai/micro_ais/mai-defs/recruiting.lua +++ b/data/ai/micro_ais/mai-defs/recruiting.lua @@ -39,7 +39,7 @@ function wesnoth.micro_ais.recruit_rushers(cfg) end function wesnoth.micro_ais.recruit_random(cfg) - local optional_keys = { "skip_low_gold_recruiting", "type", "prob" } + local optional_keys = { "skip_low_gold_recruiting", "type", "probability" } local CA_parms = { ai_id = 'mai_random_recruit', { ca_id = "move", location = 'ca_recruit_random.lua', score = cfg.ca_score or 180000 } From dd02202fc8316bc1cbe44f8958efd120d4988e4d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 28 Mar 2016 12:04:23 -0400 Subject: [PATCH 011/240] Fix attacks aspect assert --- src/ai/default/aspect_attacks.cpp | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/ai/default/aspect_attacks.cpp b/src/ai/default/aspect_attacks.cpp index 4db985256c05..7e19d5ff5285 100644 --- a/src/ai/default/aspect_attacks.cpp +++ b/src/ai/default/aspect_attacks.cpp @@ -412,12 +412,18 @@ config aspect_attacks::to_config() const bool aspect_attacks::is_allowed_attacker(const unit& u) const { - return (*filter_own_)(u); + if (filter_own_) { + return (*filter_own_)(u); + } + return true; } bool aspect_attacks::is_allowed_enemy(const unit& u) const { - return (*filter_enemy_)(u); + if (filter_enemy_) { + return (*filter_enemy_)(u); + } + return true; } } // end of namespace testing_ai_default From 32c3abbbaf3c7bae6dcfdd3c814e0fe48aaedcf2 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 28 Mar 2016 12:54:25 -0400 Subject: [PATCH 012/240] Micro AIs: Distinguish attribute and tag parameters and copy all of the latter (Though currently only Protect Unit and Random Recruiting actually honour multiples of any tag.) --- data/ai/micro_ais/mai-defs/animals.lua | 12 +++++----- data/ai/micro_ais/mai-defs/escort.lua | 2 +- data/ai/micro_ais/mai-defs/fast.lua | 4 ++-- data/ai/micro_ais/mai-defs/guardian.lua | 10 ++++---- data/ai/micro_ais/mai-defs/healers.lua | 2 +- data/ai/micro_ais/mai-defs/misc.lua | 10 ++++---- data/ai/micro_ais/mai-defs/patrol.lua | 2 +- data/ai/micro_ais/mai-defs/protect.lua | 5 +--- data/ai/micro_ais/mai-defs/recruiting.lua | 2 +- data/ai/micro_ais/micro_ai_helper.lua | 29 ++++++++++++++++------- 10 files changed, 44 insertions(+), 34 deletions(-) diff --git a/data/ai/micro_ais/mai-defs/animals.lua b/data/ai/micro_ais/mai-defs/animals.lua index 2f88270f40ef..2b03684442e6 100644 --- a/data/ai/micro_ais/mai-defs/animals.lua +++ b/data/ai/micro_ais/mai-defs/animals.lua @@ -2,8 +2,8 @@ local H = wesnoth.require "lua/helper.lua" local MAIH = wesnoth.require("ai/micro_ais/micro_ai_helper.lua") function wesnoth.micro_ais.big_animals(cfg) - local required_keys = { "filter"} - local optional_keys = { "avoid_unit", "filter_location", "filter_location_wander" } + local required_keys = { "[filter]"} + local optional_keys = { "[avoid_unit]", "[filter_location]", "[filter_location_wander]" } local CA_parms = { ai_id = 'mai_big_animals', { ca_id = "move", location = 'ca_big_animals.lua', score = cfg.ca_score or 300000 } @@ -12,7 +12,7 @@ function wesnoth.micro_ais.big_animals(cfg) end function wesnoth.micro_ais.wolves(cfg) - local required_keys = { "filter", "filter_second" } + local required_keys = { "[filter]", "[filter_second]" } local optional_keys = { "attack_only_prey", "avoid_type" } local score = cfg.ca_score or 90000 local CA_parms = { @@ -66,7 +66,7 @@ function wesnoth.micro_ais.wolves(cfg) end function wesnoth.micro_ais.herding(cfg) - local required_keys = { "filter_location", "filter", "filter_second", "herd_x", "herd_y" } + local required_keys = { "[filter_location]", "[filter]", "[filter_second]", "herd_x", "herd_y" } local optional_keys = { "attention_distance", "attack_distance" } local score = cfg.ca_score or 300000 local CA_parms = { @@ -84,7 +84,7 @@ end function wesnoth.micro_ais.forest_animals(cfg) local optional_keys = { "rabbit_type", "rabbit_number", "rabbit_enemy_distance", "rabbit_hole_img", - "tusker_type", "tusklet_type", "deer_type", "filter_location" + "tusker_type", "tusklet_type", "deer_type", "[filter_location]" } local score = cfg.ca_score or 300000 local CA_parms = { @@ -124,7 +124,7 @@ function wesnoth.micro_ais.hunter(cfg) H.wml_error("Hunter [micro_ai] tag requires either id= key or [filter] tag") end local required_keys = { "home_x", "home_y" } - local optional_keys = { "id", "filter", "filter_location", "rest_turns", "show_messages" } + local optional_keys = { "id", "[filter]", "[filter_location]", "rest_turns", "show_messages" } local CA_parms = { ai_id = 'mai_hunter', { ca_id = "move", location = 'ca_hunter.lua', score = cfg.ca_score or 300000 } diff --git a/data/ai/micro_ais/mai-defs/escort.lua b/data/ai/micro_ais/mai-defs/escort.lua index 8806686d6c79..f6a597f5fa33 100644 --- a/data/ai/micro_ais/mai-defs/escort.lua +++ b/data/ai/micro_ais/mai-defs/escort.lua @@ -5,7 +5,7 @@ function wesnoth.micro_ais.messenger_escort(cfg) H.wml_error("Messenger [micro_ai] tag requires either id= key or [filter] tag") end local required_keys = { "waypoint_x", "waypoint_y" } - local optional_keys = { "id", "enemy_death_chance", "filter", "filter_second", "invert_order", "messenger_death_chance" } + local optional_keys = { "id", "enemy_death_chance", "[filter]", "[filter_second]", "invert_order", "messenger_death_chance" } local score = cfg.ca_score or 300000 local CA_parms = { ai_id = 'mai_messenger', diff --git a/data/ai/micro_ais/mai-defs/fast.lua b/data/ai/micro_ais/mai-defs/fast.lua index d65cda6f3ea1..cfd53f471fb4 100644 --- a/data/ai/micro_ais/mai-defs/fast.lua +++ b/data/ai/micro_ais/mai-defs/fast.lua @@ -3,8 +3,8 @@ local W = H.set_wml_action_metatable {} function wesnoth.micro_ais.fast_ai(cfg) local optional_keys = { - "attack_hidden_enemies", "avoid", "dungeon_mode", - "filter", "filter_second", "include_occupied_attack_hexes", + "attack_hidden_enemies", "[avoid]", "dungeon_mode", + "[filter]", "[filter_second]", "include_occupied_attack_hexes", "leader_additional_threat", "leader_attack_max_units", "leader_weight", "move_cost_factor", "weak_units_first", "skip_combat_ca", "skip_move_ca", "threatened_leader_fights" } diff --git a/data/ai/micro_ais/mai-defs/guardian.lua b/data/ai/micro_ais/mai-defs/guardian.lua index f600558dfc94..bf77db924e5c 100644 --- a/data/ai/micro_ais/mai-defs/guardian.lua +++ b/data/ai/micro_ais/mai-defs/guardian.lua @@ -5,7 +5,7 @@ function wesnoth.micro_ais.stationed_guardian(cfg) H.wml_error("Stationed Guardian [micro_ai] tag requires either id= key or [filter] tag") end local required_keys = { "distance", "station_x", "station_y" } - local optional_keys = { "id", "filter", "guard_x", "guard_y" } + local optional_keys = { "id", "[filter]", "guard_x", "guard_y" } local CA_parms = { ai_id = 'mai_stationed_guardian', { ca_id = 'move', location = 'ca_stationed_guardian.lua', score = cfg.ca_score or 300000 } @@ -17,8 +17,8 @@ function wesnoth.micro_ais.zone_guardian(cfg) if (cfg.action ~= 'delete') and (not cfg.id) and (not H.get_child(cfg, "filter")) then H.wml_error("Zone Guardian [micro_ai] tag requires either id= key or [filter] tag") end - local required_keys = { "filter_location" } - local optional_keys = { "id", "filter", "filter_location_enemy", "station_x", "station_y" } + local required_keys = { "[filter_location]" } + local optional_keys = { "id", "[filter]", "[filter_location_enemy]", "station_x", "station_y" } local CA_parms = { ai_id = 'mai_zone_guardian', { ca_id = 'move', location = 'ca_zone_guardian.lua', score = cfg.ca_score or 300000 } @@ -31,7 +31,7 @@ function wesnoth.micro_ais.return_guardian(cfg) H.wml_error("Return Guardian [micro_ai] tag requires either id= key or [filter] tag") end local required_keys = { "return_x", "return_y" } - local optional_keys = { "id", "filter" } + local optional_keys = { "id", "[filter]" } local CA_parms = { ai_id = 'mai_return_guardian', { ca_id = 'move', location = 'ca_return_guardian.lua', score = cfg.ca_score or 100010 } @@ -44,7 +44,7 @@ function wesnoth.micro_ais.coward(cfg) H.wml_error("Coward [micro_ai] tag requires either id= key or [filter] tag") end local required_keys = { "distance" } - local optional_keys = { "attack_if_trapped", "id", "filter", "filter_second", "seek_x", "seek_y","avoid_x","avoid_y" } + local optional_keys = { "attack_if_trapped", "id", "[filter]", "[filter_second]", "seek_x", "seek_y","avoid_x","avoid_y" } local CA_parms = { ai_id = 'mai_coward', { ca_id = 'move', location = 'ca_coward.lua', score = cfg.ca_score or 300000 } diff --git a/data/ai/micro_ais/mai-defs/healers.lua b/data/ai/micro_ais/mai-defs/healers.lua index 4bd382b405c5..3be8686a9a0f 100644 --- a/data/ai/micro_ais/mai-defs/healers.lua +++ b/data/ai/micro_ais/mai-defs/healers.lua @@ -1,6 +1,6 @@ function wesnoth.micro_ais.healer_support(cfg) - local optional_keys = { "aggression", "injured_units_only", "max_threats", "filter", "filter_second" } + local optional_keys = { "aggression", "injured_units_only", "max_threats", "[filter]", "[filter_second]" } -- Scores for this AI need to be hard-coded, it does not work otherwise local CA_parms = { ai_id = 'mai_healer', diff --git a/data/ai/micro_ais/mai-defs/misc.lua b/data/ai/micro_ais/mai-defs/misc.lua index 2ed6ffd8b934..1331ef2026b3 100644 --- a/data/ai/micro_ais/mai-defs/misc.lua +++ b/data/ai/micro_ais/mai-defs/misc.lua @@ -1,7 +1,7 @@ function wesnoth.micro_ais.lurkers(cfg) - local required_keys = { "filter", "filter_location" } - local optional_keys = { "stationary", "filter_location_wander" } + local required_keys = { "[filter]", "[filter_location]" } + local optional_keys = { "stationary", "[filter_location_wander]" } local CA_parms = { ai_id = 'mai_lurkers', { ca_id = 'move', location = 'ca_lurkers.lua', score = cfg.ca_score or 300000 } @@ -11,9 +11,9 @@ end -- goto is a keyword, so need to use index operator directly wesnoth.micro_ais["goto"] = function(cfg) - local required_keys = { "filter_location" } + local required_keys = { "[filter_location]" } local optional_keys = { - "avoid_enemies", "filter", "ignore_units", "ignore_enemy_at_goal", + "avoid_enemies", "[filter]", "ignore_units", "ignore_enemy_at_goal", "release_all_units_at_goal", "release_unit_at_goal", "unique_goals", "use_straight_line" } local CA_parms = { @@ -24,7 +24,7 @@ wesnoth.micro_ais["goto"] = function(cfg) end function wesnoth.micro_ais.hang_out(cfg) - local optional_keys = { "filter", "filter_location", "avoid", "mobilize_condition", "mobilize_on_gold_less_than" } + local optional_keys = { "[filter]", "[filter_location]", "[avoid]", "[mobilize_condition]", "mobilize_on_gold_less_than" } local CA_parms = { ai_id = 'mai_hang_out', { ca_id = 'move', location = 'ca_hang_out.lua', score = cfg.ca_score or 170000 } diff --git a/data/ai/micro_ais/mai-defs/patrol.lua b/data/ai/micro_ais/mai-defs/patrol.lua index 2c96e407673d..806042c68d56 100644 --- a/data/ai/micro_ais/mai-defs/patrol.lua +++ b/data/ai/micro_ais/mai-defs/patrol.lua @@ -5,7 +5,7 @@ function wesnoth.micro_ais.patrol(cfg) H.wml_error("Patrol [micro_ai] tag requires either id= key or [filter] tag") end local required_keys = { "waypoint_x", "waypoint_y" } - local optional_keys = { "id", "filter", "attack", "one_time_only", "out_and_back" } + local optional_keys = { "id", "[filter]", "attack", "one_time_only", "out_and_back" } local CA_parms = { ai_id = 'mai_patrol', { ca_id = "move", location = 'ca_patrol.lua', score = cfg.ca_score or 300000 } diff --git a/data/ai/micro_ais/mai-defs/protect.lua b/data/ai/micro_ais/mai-defs/protect.lua index f72940f476d2..27bb0f3b79cd 100644 --- a/data/ai/micro_ais/mai-defs/protect.lua +++ b/data/ai/micro_ais/mai-defs/protect.lua @@ -24,9 +24,6 @@ function wesnoth.micro_ais.protect_unit(cfg) end table.insert(unit_ids, u.id) end - if #unit_ids == 0 then - H.wml_error("Protect Unit Micro AI is missing required [unit] tag") - end -- Optional key disable_move_leader_to_keep: needs to be dealt with -- separately as it affects a default CA @@ -74,5 +71,5 @@ function wesnoth.micro_ais.protect_unit(cfg) else MAIH.add_aspects(cfg.side, aspect_parms) end - return {}, {}, CA_parms + return {"[unit]"}, {}, CA_parms end diff --git a/data/ai/micro_ais/mai-defs/recruiting.lua b/data/ai/micro_ais/mai-defs/recruiting.lua index c4a4d64a823b..bf4aca625040 100644 --- a/data/ai/micro_ais/mai-defs/recruiting.lua +++ b/data/ai/micro_ais/mai-defs/recruiting.lua @@ -39,7 +39,7 @@ function wesnoth.micro_ais.recruit_rushers(cfg) end function wesnoth.micro_ais.recruit_random(cfg) - local optional_keys = { "skip_low_gold_recruiting", "type", "probability" } + local optional_keys = { "skip_low_gold_recruiting", "[probability]" } local CA_parms = { ai_id = 'mai_random_recruit', { ca_id = "move", location = 'ca_recruit_random.lua', score = cfg.ca_score or 180000 } diff --git a/data/ai/micro_ais/micro_ai_helper.lua b/data/ai/micro_ais/micro_ai_helper.lua index f7921c4f908f..9391f63a3a47 100644 --- a/data/ai/micro_ais/micro_ai_helper.lua +++ b/data/ai/micro_ais/micro_ai_helper.lua @@ -174,19 +174,32 @@ function micro_ai_helper.micro_ai_setup(cfg, CA_parms, required_keys, optional_k -- Required keys for _,v in pairs(required_keys) do - local child = H.get_child(cfg, v) - if (not cfg[v]) and (not child) then - H.wml_error("[micro_ai] tag (" .. cfg.ai_type .. ") is missing required parameter: " .. v) + if v:match('%[[a-zA-Z0-9_]+%]') then + v = v:sub(2,-2) + if not H.get_child(cfg, v) then + H.wml_error("[micro_ai] tag (" .. cfg.ai_type .. ") is missing required parameter: [" .. v .. "]") + end + for child in H.child_range(cfg, v) do + table.insert(CA_cfg, T[v](child)) + end + else + if not cfg[v] then + H.wml_error("[micro_ai] tag (" .. cfg.ai_type .. ") is missing required parameter: " .. v .."=") + end + CA_cfg[v] = cfg[v] end - CA_cfg[v] = cfg[v] - if child then table.insert(CA_cfg, T[v](child)) end end -- Optional keys for _,v in pairs(optional_keys) do - CA_cfg[v] = cfg[v] - local child = H.get_child(cfg, v) - if child then table.insert(CA_cfg, T[v](child)) end + if v:match('%[[a-zA-Z0-9_]+%]') then + v = v:sub(2,-2) + for child in H.child_range(cfg, v) do + table.insert(CA_cfg, T[v](child)) + end + else + CA_cfg[v] = cfg[v] + end end -- Finally, set up the candidate actions themselves From d4104e01c5f05df98b8ca33b28471ad817ad651d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 28 Mar 2016 14:58:53 -0400 Subject: [PATCH 013/240] Rush Recruit MAI: Pass requested CA score to recruit engine --- data/ai/micro_ais/cas/ca_recruit_rushers.lua | 1 + 1 file changed, 1 insertion(+) diff --git a/data/ai/micro_ais/cas/ca_recruit_rushers.lua b/data/ai/micro_ais/cas/ca_recruit_rushers.lua index ebdea178379e..150dc76ccd88 100644 --- a/data/ai/micro_ais/cas/ca_recruit_rushers.lua +++ b/data/ai/micro_ais/cas/ca_recruit_rushers.lua @@ -10,6 +10,7 @@ local ca_recruit_rushers = {} function ca_recruit_rushers:evaluation(cfg) internal_params.randomness = cfg.randomness + internal_params.score_function = function() return cfg.ca_score end return internal_recruit_cas:recruit_rushers_eval() end From c8b47e48a167c2ffe9839806aa75e32be9c2e92e Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 28 Mar 2016 14:59:38 -0400 Subject: [PATCH 014/240] Simple Attack MAI: Fix filters being ignored --- data/ai/micro_ais/mai-defs/misc.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/ai/micro_ais/mai-defs/misc.lua b/data/ai/micro_ais/mai-defs/misc.lua index 1331ef2026b3..415a273ce2f5 100644 --- a/data/ai/micro_ais/mai-defs/misc.lua +++ b/data/ai/micro_ais/mai-defs/misc.lua @@ -33,7 +33,7 @@ function wesnoth.micro_ais.hang_out(cfg) end function wesnoth.micro_ais.simple_attack(cfg) - local optional_keys = { "filter", "filter_second", "weapon" } + local optional_keys = { "[filter]", "[filter_second]", "weapon" } local CA_parms = { ai_id = 'mai_simple_attack', { ca_id = 'move', location = 'ca_simple_attack.lua', score = cfg.ca_score or 110000 } From ff11fecfe3db7a1e3de9c2685f34f53cc2498e84 Mon Sep 17 00:00:00 2001 From: mattsc Date: Mon, 28 Mar 2016 17:42:50 -0700 Subject: [PATCH 015/240] Guardians MAI test scenario: update portrait paths --- data/ai/micro_ais/scenarios/guardians.cfg | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/data/ai/micro_ais/scenarios/guardians.cfg b/data/ai/micro_ais/scenarios/guardians.cfg index 4acd74537e89..3b22e4e4f2c0 100644 --- a/data/ai/micro_ais/scenarios/guardians.cfg +++ b/data/ai/micro_ais/scenarios/guardians.cfg @@ -425,7 +425,7 @@ separate attack Zone" {VARIABLE_CONDITIONAL scenario_name equals guardians} [/show_if] [command] - {MESSAGE narrator "portraits/dwarves/transparent/guard.png" _"Standard WML Guardian" _"This is the built-in WML guardian coded using 'ai_special=guardian'. These guardians attack if there is an enemy within their movement range, otherwise they do nothing (except maybe retreating to a village for healing)."} + {MESSAGE narrator "portraits/dwarves/guard.png" _"Standard WML Guardian" _"This is the built-in WML guardian coded using 'ai_special=guardian'. These guardians attack if there is an enemy within their movement range, otherwise they do nothing (except maybe retreating to a village for healing)."} [/command] [/set_menu_item] [set_menu_item] @@ -436,7 +436,7 @@ separate attack Zone" {VARIABLE_CONDITIONAL scenario_name equals guardians} [/show_if] [command] - {MESSAGE narrator "portraits/trolls/transparent/troll.png" _"Return Guardian" _"A 'return guardian' is a variation of the standard Wesnoth guardian. It has an assigned guard position (GP) to which it returns after attacks on approaching enemies: + {MESSAGE narrator "portraits/trolls/troll.png" _"Return Guardian" _"A 'return guardian' is a variation of the standard Wesnoth guardian. It has an assigned guard position (GP) to which it returns after attacks on approaching enemies: - If at GP with no enemy in reach, do nothing. - If at GP with enemy in reach, leave attack to default AI (note that this may include not attacking if the enemy is deemed too strong). - If not at GP, return there, no matter whether an enemy is in reach or not. @@ -452,7 +452,7 @@ separate attack Zone" {VARIABLE_CONDITIONAL scenario_name equals guardians} [/show_if] [command] - {MESSAGE narrator "portraits/trolls/transparent/troll.png" _"Home Guard" _"A 'home guard' is a variant on the 'guardian' AI special. With this variant, the unit has an assigned 'home' location, and will return there if not involved in combat and if not going to a village, whether for healing or to capture it this turn. (By contrast, the standard guardian AI will cause the unit to stay where it last attacked.) This differs from 'return guardian' in that a home guard will press the attack, possibly getting drawn quite far from 'home', rather than returning after each attack. (It can also be lured away by a string of closely-placed villages, but that is something a map builder can control.) + {MESSAGE narrator "portraits/trolls/troll.png" _"Home Guard" _"A 'home guard' is a variant on the 'guardian' AI special. With this variant, the unit has an assigned 'home' location, and will return there if not involved in combat and if not going to a village, whether for healing or to capture it this turn. (By contrast, the standard guardian AI will cause the unit to stay where it last attacked.) This differs from 'return guardian' in that a home guard will press the attack, possibly getting drawn quite far from 'home', rather than returning after each attack. (It can also be lured away by a string of closely-placed villages, but that is something a map builder can control.) This also demonstrates how to combine candidate actions from Formula AI and Lua AI in one side. The home guard is written in Formula AI, while the return and stationed guardians and the cowards are written in Lua AI. In addition the non-guardian units of the side follow the default AI behavior."} [/command] [/set_menu_item] @@ -464,7 +464,7 @@ This also demonstrates how to combine candidate actions from Formula AI and Lua {VARIABLE_CONDITIONAL scenario_name equals guardians} [/show_if] [command] - {MESSAGE narrator "portraits/undead/transparent/archer.png" _"Stationed Guardian" _"A 'stationed guardian' is another variation of the standard Wesnoth guardian with a somewhat more complex behavior than that of the 'return guardian'. Two positions are defined for it, a 'station' and a 'guarded location', as well as a 'distance'. The behavior is as follows: + {MESSAGE narrator "portraits/undead/archer.png" _"Stationed Guardian" _"A 'stationed guardian' is another variation of the standard Wesnoth guardian with a somewhat more complex behavior than that of the 'return guardian'. Two positions are defined for it, a 'station' and a 'guarded location', as well as a 'distance'. The behavior is as follows: - If no enemy is within 'distance' of the guard's current position, do nothing. - Otherwise: If an enemy is within 'distance' of the guard, but not also within the same distance of the guarded location and the station (all of this simultaneously), move the guard in the direction of the station. - Otherwise: @@ -496,7 +496,7 @@ This also demonstrates how to combine candidate actions from Formula AI and Lua {VARIABLE_CONDITIONAL scenario_name equals guardians} [/show_if] [command] - {MESSAGE narrator "units/monsters/water-serpent.png" _"Zone Guardian" _"A zone guardian is a unit that, as the name says, guards a zone. It moves randomly inside this zone until an enemy enters it (or a separately defined enemy zone, see below). Applications might be the defense of a castle or a nesting area. The zone macro can be called with an optional enemy zone: + {MESSAGE narrator "portraits/nagas/fighter.png" _"Zone Guardian" _"A zone guardian is a unit that, as the name says, guards a zone. It moves randomly inside this zone until an enemy enters it (or a separately defined enemy zone, see below). Applications might be the defense of a castle or a nesting area. The zone macro can be called with an optional enemy zone: - If not specified, the zone guard attacks any enemy coming inside its guard zone. - Otherwise, it attacks any enemy entering the enemy zone and once there are no more enemies, it goes back to patrol in its basic zone."} [/command] From aed87126eed77e300fc3bc7b3f13632ec3834f66 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 01:43:26 -0400 Subject: [PATCH 016/240] XCode: Remove empty testing group --- projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj | 8 -------- 1 file changed, 8 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 4b3b6b7c0400..0f2251b437a4 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -3524,13 +3524,6 @@ path = formula; sourceTree = ""; }; - B54AC6C00FEA9EB5006F6FBD /* testing */ = { - isa = PBXGroup; - children = ( - ); - path = testing; - sourceTree = ""; - }; B54AC6EA0FEA9F7A006F6FBD /* window_builder */ = { isa = PBXGroup; children = ( @@ -3742,7 +3735,6 @@ B54AC6960FEA9E8F006F6FBD /* registry.hpp */, EC4E3B2119B2D8880049CBD7 /* simulated_actions.cpp */, 91B621B61B76B20700B00E0F /* simulated_actions.hpp */, - B54AC6C00FEA9EB5006F6FBD /* testing */, B597EBE30FC082AB00CE81F5 /* testing.cpp */, B597EBE40FC082AB00CE81F5 /* testing.hpp */, ); From 4336e0fb0340145d452a664a84ac87cb97cab202 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Tue, 29 Mar 2016 11:00:22 +0300 Subject: [PATCH 017/240] Merged slightly modified sand shores into the beach waves animation --- .../terrain/water/waves-concave-A01.png | Bin 8333 -> 37627 bytes .../terrain/water/waves-concave-A02.png | Bin 10123 -> 37610 bytes .../terrain/water/waves-concave-A03.png | Bin 11071 -> 37360 bytes .../terrain/water/waves-concave-A04.png | Bin 11624 -> 37229 bytes .../terrain/water/waves-concave-A05.png | Bin 12086 -> 37386 bytes .../terrain/water/waves-concave-A06.png | Bin 12512 -> 38081 bytes .../terrain/water/waves-concave-A07.png | Bin 12563 -> 38521 bytes .../terrain/water/waves-concave-A08.png | Bin 12587 -> 39020 bytes .../terrain/water/waves-concave-A09.png | Bin 11943 -> 39024 bytes .../terrain/water/waves-concave-A10.png | Bin 11147 -> 38640 bytes .../terrain/water/waves-concave-A11.png | Bin 11080 -> 38401 bytes .../terrain/water/waves-concave-A12.png | Bin 11011 -> 38341 bytes .../terrain/water/waves-concave-A13.png | Bin 7862 -> 37623 bytes .../images/terrain/water/waves-convex-A01.png | Bin 9961 -> 35010 bytes .../images/terrain/water/waves-convex-A02.png | Bin 14479 -> 36312 bytes .../images/terrain/water/waves-convex-A03.png | Bin 15219 -> 36870 bytes .../images/terrain/water/waves-convex-A04.png | Bin 15608 -> 37423 bytes .../images/terrain/water/waves-convex-A05.png | Bin 15534 -> 37616 bytes .../images/terrain/water/waves-convex-A06.png | Bin 15389 -> 37691 bytes .../images/terrain/water/waves-convex-A07.png | Bin 15070 -> 37564 bytes .../images/terrain/water/waves-convex-A08.png | Bin 14500 -> 37449 bytes .../images/terrain/water/waves-convex-A09.png | Bin 13854 -> 37092 bytes .../images/terrain/water/waves-convex-A10.png | Bin 13139 -> 36255 bytes .../images/terrain/water/waves-convex-A11.png | Bin 12839 -> 36041 bytes .../images/terrain/water/waves-convex-A12.png | Bin 12352 -> 35562 bytes .../images/terrain/water/waves-convex-A13.png | Bin 10156 -> 34576 bytes data/core/terrain-graphics.cfg | 3 +-- 27 files changed, 1 insertion(+), 2 deletions(-) diff --git a/data/core/images/terrain/water/waves-concave-A01.png b/data/core/images/terrain/water/waves-concave-A01.png index 648219435e3ce540f4f6c25eecab548654e354ca..31fe334283ec994a61324e54d0dc4274b87d9f57 100644 GIT binary patch literal 37627 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
e=jvlP_2-9pTPhIM%#I;f&F1^n(V|
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
LpRjvkL%j7L8PwiK

literal 8333
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 XDy-)sQl%nF8xS@E&K1kC3qJoJ7<~e& literal 10123 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 diff --git a/data/core/images/terrain/water/waves-concave-A03.png b/data/core/images/terrain/water/waves-concave-A03.png index a00aa197c9a3eb5785c50d94048b18ec37611260..650bf717266e772a29d768b3373afc1ac9f38a52 100644 GIT binary patch literal 37360 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 Xj36_XKN2$q@P;+s!MxVgC;oo`Ct|U; literal 11071 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 diff --git a/data/core/images/terrain/water/waves-concave-A04.png b/data/core/images/terrain/water/waves-concave-A04.png index 7a9661c02baaca3cd842265ba03fdc2da0167265..2eb3a4b91d30595d8e08317200cc0743ce6782c4 100644 GIT binary patch literal 37229 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 AIsgCw diff --git a/data/core/images/terrain/water/waves-concave-A05.png b/data/core/images/terrain/water/waves-concave-A05.png index 1bf3dbec38ecf94760b3037f66ceb5899bdee3d8..98c70c4ab9e70f67c1f33b266e0b7d8c08904f23 100644 GIT binary patch literal 37386 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 literal 12086 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 g6*2#R(Gf@jzXUsO!|7iA!QI{6-JQ$#-?hHG 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 bPxSk!BJRps_Thpqz<4l57Y!@*T_XMuNr+w< literal 12512 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 diff --git a/data/core/images/terrain/water/waves-concave-A07.png b/data/core/images/terrain/water/waves-concave-A07.png index ccd112770352da4ea0ca17bf3df0c6b45a09bbfe..d47907e75ed2092ea59924daccb30c9f6ebe1891 100644 GIT binary patch literal 38521 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 literal 12563 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 diff --git a/data/core/images/terrain/water/waves-concave-A08.png b/data/core/images/terrain/water/waves-concave-A08.png index feb3e43786bc9a5d5c5069b51c392ec6e703280d..0b4a9f255c5af5f260a7c6734a2f621b20af767d 100644 GIT binary patch literal 39020 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

{vCP)y)aFPS?mp@+s?CHG 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

cpX13>MIgb0I`NqE^ayTspgjDa#} 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 literal 11943 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 diff --git a/data/core/images/terrain/water/waves-concave-A10.png b/data/core/images/terrain/water/waves-concave-A10.png index 6a74f139bcadaa230dc0762d705175569a02b690..36d2ca25bb292c44f6c6491a95bd438bacd45210 100644 GIT binary patch literal 38640 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 O4?F8KR*e?eoBsvAr0O{U literal 11147 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 diff --git a/data/core/images/terrain/water/waves-concave-A11.png b/data/core/images/terrain/water/waves-concave-A11.png index 6ac9ce6edaf67c035ce57f75ee39c860c4146750..5b679bd1afa5c9a1cf1f142e68a9af303401c121 100644 GIT binary patch literal 38401 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 literal 11080 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 Qhb%xrR`p|*v`O&)0JM2~tpET3 diff --git a/data/core/images/terrain/water/waves-concave-A12.png b/data/core/images/terrain/water/waves-concave-A12.png index 1fbba1c37ed1b71f0b8314afd47f0e5030fda9a6..c3689ca30354b71dd8efdd1330d95cd4e2417d14 100644 GIT binary patch literal 38341 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 a{rX_Id@hbaUHZ@53Xqmi5U&z73i=;njvIdf diff --git a/data/core/images/terrain/water/waves-concave-A13.png b/data/core/images/terrain/water/waves-concave-A13.png index 051695eb4306a70b82d1159ff8101fd8eece06b5..3a6ea8cb2bf90cba23ad60b07a021d5fdac07729 100644 GIT binary patch literal 37623 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 diff --git a/data/core/images/terrain/water/waves-convex-A03.png b/data/core/images/terrain/water/waves-convex-A03.png index 691419185a26c1f856cec4def7d0f00e31195d84..62db3723692d45c836114f7bfc73e25d756bee2d 100644 GIT binary patch literal 36870 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 literal 15219 zcmb_j^K)iFmwsbAnb=Mywr$(C-q?0Bv8{=1Pi)(^jfu0f-|i3l2W(f}zE9OXUAMaX z^f{-W(;cZOFM$Ay0}B8E5TqnUmH)k){ynSEkpF7o_c1g8fQMU3R7llB|8lDj7{UlI zD8zI5{ms+{L$z*RD@Ipg4ol9h{7;kr)B5(;#;o?lWW-%r1=cV#-iXrOp5NxJjcJP=E&|fp zkgD3wK@I)$XT1@e_9$KF=)&L3kp}tG^BO6=6wjKOjP;=7r}cX}W5~}~Px)iEQ|=+= z=JzLeN4Ryac7p^xn-zS$otSJ)n^`47l%Bt7Tx$*%kEWv!lRrqmrd-eYz3rMb0MF z2ivIZhn|%!f0QPEvp&KPiJIK@PEDk#xtq}mZYoxeSI^$m>E*D4VHZ>GOo}37hxqS@ zXSdT)<LP9}v@TBcT}yklDI{`4%U)HaWP%FYIcj^qBb$;%COZ+5&%@z=S2H4lJxK zf@*9}dD+@G?RK{8Kr>sfU`FAP#K@+L_z2yung28w*e^d4$HreC=2Ba0oX4fMI2(2i z$zW9IFeY6x2I#uTn>PDmSGU2VX>oBxurnRJT;*?X4;mj9B%b>`PbD-C@(TKixp><_ zOxjQmo0*{mW#<#jRSQ_S$pdF!RxN6_>->5mCNjlV$9tsqsVF_ABL(`&Vwl(ii)e za-xKOjD4f$93&WsUeWH;{@^%SK< zbIq2Dd%6;(*y@DeWye=1)!$c;$S)X%%c;+Ev|{Z0G&CW&kALUG*9E@?_BY|~U<9oE zr{r4BLytMip|8O+E|6v5^*%%!^jOjAuM*#J{iLpu=rj2X@Cl;S)>_y<>9(U;`9122 zWLpp|`=2hGkl6nzQ|(rzDWthkHNW83ZQqo%4B(`a53?HC{TP>k~Be4^wufxLtlJ(~%S#b!3l!v(} z{?^@kGm9(<79G5ijdQvWv+`$mPUqizeo*eNIVswO)+(^{&-zA`Nu>vrSySu}3li@s zBk0wVauCy4X%jt=Rf1Wcs>4vld0%uv1$1*rm$|o4Yj8xn*EJR28-F+5xRRUVz~dH` zaDyV^#d#)fEYPHn?DPPS1fL6OE#j1fu!=P-JWULLK7q2-e?NWGw>}BL>Ln(oX3{+Z z!CNE_XUT>+7G}9VL`7@TTS1=0kXZ4&nr!|;8Bb_;25B6}@dEwA)7=Bl$5BS`@!q~< zQEMLSjU|y1dGToL8D#4Z3Fm7v5l%#fkEB$b09gCi_ee9h)1*fbw@2o8EBFe>2IRh_ zHPf8#NfLntIR}tMtY#t6`CA)-wq8IVhZ)v*!kf&3@!p;SP6u-F7Hs+CRqXhWju)rZ z%#xW>PG$gg2rIGRtjCNFu_L4elx1VpNf)!ImqIEh9%SXAiG>clw$Dm^;f_| z&;jz~VlOydpRA(upev|L=mm2eJ&xD86-pn`Qp&kGWd+dU%V+0iux^9f&YQc3GM~V1 ze~Nb-%DMPG*N|}7ftQLPsb*In`WD`n_qx5A36U~-o>+ABU5V391u^3Ji!d1O41%n* zrQSp1s{`0Yny>a~SrpWx>_d{2*znQdO(Z{2&MrM{a5zCQIy;?xQAhE4YoZ_mSHF@( z`gifR0BK7~Eib~&Pn@xH3(>^pk8o9!OG1>!LD|oh#X)cvMtHt_*IPL#I()$?Pw+A* zh=ewdpbgZJBGSbM*&M`iZgIZqzv}m4BF6-GKO0t0VaX!6_*Q?Vo$uiWB{J_-M-wHB z65#|cfX)Y5^of0OEk=Vog0KeqKwowoGX*LzQWD;iO-wTcEvduku{BgEsBPuQY-K|? zn!(qi2A79m*Hwfp^lBADfRstvoUe-mt9jEw%;0u$szyW|Ngx8La+5l9EVRJ6U)l0* zM9!Ju6sa&8-$KZ&t5x-j9%fzf#;u&}_k{4;zkq$BIYFYk6M#VSEC-GMjMVtg4ALTILg> zx%|5lb5Xf4d-0%Z6y#A)Vqa(d2Ot@#zT)VD#|0YKhXKRT05HS-qZd#$@r=i2-xkzZF%K;!OUFqp0FgSS6BsVK*oO+&nEt zB)2hWg>sjINTMd%b#{@rRdX_HXiN(1O;Jatf4j}i?>fYK(3}O}gCkg@$HRlN^#L!K zbJoG9G^{MQvNX0veuJcHSf?5phIA_3vW0hI6F5>ezmC|2Xx)T*+{nJst4m3pNLKc=E-{$AmTIr*7>FpDmAWm@$MqlCz?{RH*-) z&MoV(q75(rNk3f8N4j$OJR1OZZja7Id*MOWLSRzHJswc@EL0v*x_<7(;KckGUUET- zs&7T6)=`5i<>qb>8z^h53EZ($uhhmA@RqWlB3z%-w!bWv?bKx?`ozb=<@Mk$U4kuz zv7H=FApx0|K>UQ8i#`;ggEeO;g0DvwS%lQ39Lumn1&yr$rJN2HoF)xz>(nac3D7#1 z=eiG(o^W%cA<*Mbo7hNUeXg$it*pmGXhaRGH}g1@gsHa0Dr=J1%As+vanqyM^ZC_D z$HvkXG>jEUctua2$JzljZ{?8jb#644mjIyOO8Tfz$@a!4yK+FSM+_@jw}bt0WqTEk zB8n7O8u#kF+8SI*sv)Zz2t?83LiH;k%01^C@{T7rOUeIQ3#OM4gkn^28Yx6Se|8BT zAHu?zzwb=Qj1P@+1gn7^|7EHKWEnHIhDla!?LV26IY?5gyy)%%+0KanOn-G9;r$<~a=|0S0vnxe}RR z1&Kf`V4A+28;@gd-Hojr4!!BSEqfqmhbo0g_>S)(u@LRgLmvkmX5dIYa17rZxKLHpEj$b zyyI0kH#@iEAxefVi@{~b{;qGey`H1y;#fX%ZsDY)5zvvbOip3QA`s%|w86RzyxlC9 znM+rl7c*hX&eyK%7Y8c8?Ro_8WbhG46y936%p55?oqb`yPb&ReZFRDQwtF*4VT}Bs zSj~>ipbM)H4vHdhql~v&F}&WD^7#Mk==pxswYPWc(*iPR zZk}2V{`$Z5d|SL8Ke=CAx$*4Qe|7eJnYn(R9bD)6eJgy`{bfHuG5DD zczVC2R0wNKcBFo)JV-iP_+wFiy^OruOQGPtU$O6`+lT9h%i1Noc{FbPYf)SQaS)MTG$-@?GiubWI$JfPADE0ubj)EfA zslOfV!F@XSo3FjiR!D@mSZ#jwXsVfITdoZJhEF{O><@-`A!!8dBvYTmMOzIGexNOr zs;rPJ^B_tnJPa5ji@ypLmE<}1ERuT>o`8rS3rO}!^tD4guRN5L#JgD4;VN+f)udH` zv8mxg%+#ao>~=ljrKCWEb@FkZ?JBT_pb8@0J&(V8rwXWXe0)4C2xebfTeEy|q-@NH zpt`k>hb*`I-YYS~>7ER34lBsBpGn8r1jv^I3+mFRBWLZ&eHCYyUi`R7{b?4hvc zENBYwx9CTp^$@Ipkg(x>8y8{!72W9yKUk{5K>C7#l8S)b+wTFVx{WCv5+ zvy@CZ5vEPfMzRz+KFH)s;K-4qwRg^-wDO zl;rwlxf+;;_+>+>XCKXe#wP6+v_E+gGHMcIRAETu)oe50g}UhCPSHW3#c5k4b2T3X zo%UvA;uc>R_GN!-QNui_!Vd z0_VZ58v6PujA%%d$M3W1gN4Y9=icwBqlG1J)SPX6vKHE3N&u9y!vf<(hJ0><>uVGg1%IhzT3!ulC zDrgU(j!$c%dgZk<{kF7amMjmf=cXAJj~aItXAC|?yxm@Z zI}5u)`>5LM``ZZo@#fL@|CsgncsEBN1%hcC4(@0|)6+P3s0}N$Va^f^i&ztn6`D&| zqz-}SvP(fXvjxUri0r0720scIezvJ2GHm2fi3|qS! z>>shc6n)y`{NdF6)!y)vqj|6X;H|7cK*v-og>|HgQn#BVD`cqkPR|M}<=2-y0gsK5DgsWDXUR!L^fHtw2&0+BqV3|GxlO7gET551@MpDq-NOeru zd@mM9Q6|BeYhd`TK{HQ&QDa$|$jVd6>i|A3O;8N^F|q!*T~XTuHOX zklvofMk)2en@$&0bSl}kI#60*PG%>K_Ql`$d+`1F-s_}`?x72S->Jp6a^9A>K>}p} zBZ;KNs$BV}*3Q1(pN`FX4DU-$c*L;WP&a}a zfO#}I)j4eb8uOIYCd*o{U4(HUTiX}g$G!%mp}i#)385*V7apPAsBT`fLUD@N2q1y% z42~p$Q(hY83v=P0-KSK?vbDZ=q^HqQk8_(xMV*Gs6FBa$SP`7=9jV9T?G3)2#Xnw_7oOmwT?1O(|Y? z3R;4Mvt;xPYy%!?X!g7i@AT`GnRhd5Nwf$Kr0(uqmkx1k=1RI*F&(nzwQ_j z>@XnbjL@f`my4m|HvE@)2b}MXZ{3vA`{>-JT=4Nw;B=f|to#2+9F=up%a;2XmLPL0x zRdPS=R$~LYNkJx+Du3t!OhEwR%Mll>T-GGZYPy5t^nv(5T=q$Z*m>fNuPpe2ck~^yEH`zV zW>!!0+rf3Ch1mW+5L%m36*G>oH7zc$g))v{>F3ANoy$A*IM{N z*48F+jM3MfvxvREg*pA5Tkov`x7#BvS9tvC4OTh@rfWVf0&4+|z78I~^WrCgm5!H5@K*G`4u@aNAOFmq%b{(#=ly zmfu5~00T;3=j-h?{zM&Ap5`}zjNG!EDsFlPo6!Zh3C%%Ye8wSw>iZQnjR zVY>ADY3Ba6!W77*$K&f;nEW7t*mbg%j<{FA!*}wmm7i_-IQZ=pAL`5-D=Pvc4gzAT zo5fwEAnyEEc_TL#O>uyV+lrVd2CuzE!~D zjFliFhD5nyd(;P?&gT|56HA&8GmP#^qN(SydPE-rUf{oJTINjSt)E6P zo9uvW1=aU688W{)m?AaZCe+7x1VL&y*t}$`*T-@v`2z%|o&Vh}-O<7Fq$sz`qhK$M z9|ZEkXk|gcie_qz9N9$Ody$ktKI>h!k3p^cgWkpDrulgj``_NE5l^(?na+Ykt}cq$ zR*HIzX`!o;QY6_h(7(iXUHiNwLCyQO;^VK9$dyx-zX>S)_yJpJMEfAHmmnp5^WV0~ zh&gj}hI%$!ZPGS#>;)_0>;L9C`$zl$l% zZV`||5TaOZafGwi3Np?P<3U7-ywUG~{koz4d3jKO&+gMKqZ_s7)7lKuDf;o1a) ze6QHXFWxth$YA7fcu2MGx`Kr0fFKRHCL}a9y#u8qBW=`Y7HA|sJdj7nzHsH|8krk4 zc>yZ>UM9k~8V|*tViL65W8XDS%$0dP_XRzJGtOsVrDaV8-`!Y}61;RvC*m)l^+VCtE?Avowy>CpUt{F?*#=P_Znl8?mbuoXE@`Y|zc)GnaB~Cn|^~(=Unw(J;(7w3pKLcG0Q*)r-TK z@nglSdAOe9;Ipk+`zv5)%Wf__#(Pc#PL&WB0caXUisCKbib7sjde6)L(*97Ifm^A? ziP}Pom!lUAp@1(9J%Pda!UEb_OH5sh%Y#DUA<$tPuK$Or3F38!?f9iHkzWW9kIm(* zKJ_Cj8L$LDAM^r#P{wzyz52&oIX9)5ji}u-$0 zk*KtpeQY#122WS&0N2`pACF(}U+?zc{n8j*SyR3_0yS(u z?K)=43uS#FNFcPa%C5Ys>nVT#`Fh;m^zq`jWM4U$-OWn6K^f3JEJG*?T z30se*&wI9+?hHqfu-2t#8yE03V=3Xurw3yqVeNy}O?NRM5S&3O-&$H%Ze(;T33GM{ z4eSbTxGt!MGSK*D#>*{3{9~s0Q$z_b8xgg$mVWZMef?1otB;$WmS9ar$CPH1EX%}Zp;|;jgpC6ol-E8+7SqSf9=m5&&mZ5_+ZhHJV(A@rsRpIbw|k zjf~pVCV0pT&hyi5E+eEX%1xYV7tVgv@%uhPLoORHvrhR|F_2l9=UFQHb>MTLN^L^& zKNsv&i{G13i12T&TYY->4#@|?|AOAUY`pY|7CLRoV=n-dW z@2ShCq;c&?3A5E!?&QOT5}9Fzh117UHIUwt8i^$C7qmrns*xQK0GygDC`hU~mYaE_ z{&kzh?tN}~en*Ykf*ZH(5L4!w@pWbksxf7z3pce0A_@jeNfe#TRlTClkdWajAU=8wOt_6fTDW9F*+ zxzsc=_x|Ya$+M$?*v)75#*#W)NL%3-NVD}O2OqKx|Kl3SG9bl^h>R#WVy$sKa+e3F zm5t;h-NBk-wIdC~C@A7Fgu1pWnAmdnD7aHpKsBQLIw3tUmDOT6Ar$51+np~wCtfDZ zyYSt0t{>N(;7myU*c=73%ZM9Ws*Ru#@#hWL&W0E-ld-)4Yhr1+{q2H1VZ;xoFc7qx z87m4bcl%`fk)X!zr$?MPp#puJhm#P*b~*Cu22x8gTa4|;&A(=Db^oP05PErxpCK^0 zN!ly=C;Ke3fac0z=m)DZOgQ3*j)6cFu4H9(I=5V$s;+fr4X^oEm3hJU4KL0YyFmUG zfMpJoiMO|_8n$AQUn51j6{g2~Kt8RK5GLDGI%!BGx8)}(*PPG*tyVnV(6LLfRlpI; zzsPvCb{Z_pQ2m8O5rkdg;zI_=NMS{gz5t_Z!%_wo@s1KlX^nb3UZy?)D^A>;y=n_} zjLIR$VWCrP-ne$hrK4x19`=ueq*xsQ!<|x5yACsY5fj>KvMVMk(%z(L|L0u{^$HIw z%!y_)x2Y#FYSGtcLV4m;1~{?9z*}Tkt1myPsEw)*0wbz>ZK>P$-IX{c#_!OYT*vT{_QHSc^sy-aMK5^` zhwq+9r#lm@byyNIeFUlnsvUw~AI4-C3O~hnZ}ntexv?gG!_HAL&yq^BwsgMi`*y2T zm1;vVbumFXvtFXp;e5i~k12>d`(^k+uIuG0!maEa9sZ=$FC=<*B`z%$TxS!QW-vEfSIMSzp+ zxe7j7bgwD_<8){!i4vpX?nmP*jDM+E={%cHZ>CiyAm5!bG4D$j+XZLuvV9qYG>sIX zPYhNUd}4+udA0?tKJ5V8rNyf4&#XrJ-PEjnNzt$dF~y7EjA@vp5WW&FoSCR|DNc4V zIuc<;St3oQwtfOE;;--qe^fY_V;0up#?|vs?%3>CgP@d5OopWvmBKA96)6WHlJA^w z@`#VS<)Fo**%P;d7l{kba!si|A9rkAb6WjWx`w08!Y7&-=B)`|IAUGjuQ9Sbq#jn`7YfC-?JJ+O%yl zifjuGd>Lx=u2D2_oGE|{ggc}?N?m<{3x29Owf>xq#0zOvEA}1ztJQ0JsQ4i;xoxk* ziKNUD-f-3XF*-iJ|H`!DSBssFhzKr~e1xmHpQjA*M34wbeSz`nu9?+~Db@dU^p;O8{Q+&?m zr{M7g*2k?CIGB=P37#i6)G*4&Y$S8|9un_o7MV9b$R|ttov=fw?R->>xa{>&Aj%?J zEYl5?O&GDn6eA7Bw#!T{2ryAniOZy|J{}h)NNLyWqzDLDlxN$5(&1pCI&=Ga9Gd8; zI41zGtj1Ww)y0)zm5&9liK1*H%g9YQI{P*cdCD;MrIQ9ABwbr&*B?;#U-i0H($h2G zRI9z;U1eE!YH=xN0+%x`;%pqwe~Hs};aInBmrY&e(_Dd90O8&5v}>2a?7(pP9;eae z^r*srb;)t=XQCnu)@_B<)!&3Yp_{>8=9Txqj}{zAza@Ob(|nQU)a4qaF@H#{$l1t1 zA|U*3vBP4MHFAJp^do z3A#Ri;9c3y;J!`P$K_KXeC}87(8v4i{MMi2XekJK?0 z$r0MN4*r0z*V=-IKNv{bJ2fC^MFccekkC4T339a2NisX}01oZIZ$~}z!^{<7NUhKN zz&q|p^cwAO^^D5#Z^qNCF)Ms4qAMMt6Y45EWs5c7Q+9fl3RKJ}z!y^VJLyATU>YToLmP zVPUBXc>)4LUKXJ?yHZ;9uwem#VKq?OnDtGXlNR_3@8*q}fduiPuq!wwZlw4(Hveok zm$D3P<+zl_!#5d3ymeW^0TyUJ%sv4rA3O5ub|*@7&!U@LsC~8C;`F#DBOIaLQ21{epFs30u0eQ`*O6(8K@f$#>3~lK+uR8&M98G79r$cpjf+qT7Fy=O@Pdk{THea87zHr( zuo=xF4S1g{R$0Rclsd>5TH1IZDWqDF8* zGCaoYkz%>02PktHRW+ralxB$-KWBI(SX)}MSeNfk2OnCRtb3+vZ@fFj09sfD=wFN< zGOHJGSOYKJOKkd0nzgCBwpQn8dCNzPpa7Hj{ik#>0$7p2Mt!&&*Mu5#TTnw_UA3+b zhh6A8wME}%&YD)Sc;H6AnYcsNPz%BaE)R5X<}0&BU2Nb*evU-$zcWIkQB0aRY$dtY zG-2Su<^)X9M-E(Rn_sBnyC}1&7~p2$4U@x>1I#aHRUuTy^~$0huyX)%<$ctEGd9*h zgnaQGmwTC$ZeaTZYAx8U?si71fV^sdr24q@FIa)XoIFs&UcUvdu)e-x7+4%%L_>mF z{y!kU+4m1kmGt<1^}&cP&t!29X`tbS0B^q&rIXAxZP?Wx3#*%4wQmN2fx zP&7f>f~f_s+vRaG8uzlDawiatxH&lTQr`ztk?M_?JD|jCts!93^SWt^xBOS^+@NNmOxNyH$kP0&hSgYvNIVp}O%GbW=gBYN1+ z6eii|+AB`wg;=ZA>gJBzWT|{K8N^L7TJu_qE z5`)N#xLRM%t_s|z!!?<|FL$(oY+l?wXl|QpElNNQuz=W^d=O-}A@Tzfv31+B4730! zB=cxtK3I$C%#6h7z6PH3=hz?GMfyk&QK%^{<%!=%bw1#ad&2@sWp*$dmSk@-nsbS* z`N$*>==@d9lyO`tKa+_N4uo*GbGGshv!PG4tG5pD?NgLp^t^k zep{P)IIwPcihoPWgEu;p1bPY-*?qfpACu<8m8HP;N^Tv< zkYmdu%a50%Tg{2KD5y8E7o})x;mn0-g0dNwBbJ&U&w?i%bKhI>R8v4r<3-tGi&Lsv zn-#R@R3!hB2tsnM-1<>%1&o?z$JN@$7f)D@fGW0pT|lLFUIEl0WkI$Be&h%dQZYB7GIrlW2RM zX!^}_a(ods7Def2$uKLryx5?r3Q3Y%S@fI~igUHuy6BD!xCSrcR76qT*K{@Zo!nO^ z3)R!Fz62C!2L{MYCY<||!7Q}AW0OB=Fadwjp1AhAPlSRC)L$t0!-!+L~tE@@YTWzBR6jqJZHQb((IiCAF;~Ih@Q`7XgE0nrHq7}aUQS6`XRi4t zt3LlD6&FXM69Dx8$hRF_5hc+y-BF4MDsm4R<-}j@3A%?dS2EqK7KC<>h7n3b@V1Z| z(A$C{u<=}!{;u~J3V&%8LLtNZA{Y7d0W_9xjJTMncW`wuyMqM_+&KQA%mrBCTm`=s zk;zG&8cA}+K^^bA9ZpE|OXXU9yM^bX*#Rl)`D`f0#>#Z^Q$W2ck!T|56GXRk5<@;% z*e9yqnv0^Gk*Wgcfm={R4p*)p%L%=BWgg7ZU}Yi*yGBP+ZG?1D=!~>I$gf2LKgzSm z@jFgRNdCJgERhiT?Sm2dyNOg7YNwYND40ADM>R57B$if^ut^FpUdzivxbtL!-b6da zc*@C%#a%hl<9L|lY!5Z5^7^q3^qUKT-Wh_^I9y6GE^?0&>+ue%(c1&sQ>6Jf)h&qm z6pFmQ`C;s-w=FmUjY@%Dtl-^r!eXs4p1!3r^Y=|bId<;l@-wPOS&+q zU>FlBO8ocRe;1&&K_8YgWs>@nGmzr=hU$wdQTK3x;Uwa^pyxSjtH6BtKTnH^CE|wt zZr~y8e!bpmNVLHxYYr3?Hax?Qf)wZ|$qWr{qa9lgdj3NjBd|(F(A|n2Y!Q@CRp@U1Tr1!JTOce|Ptl zf3i(y*duN!v9U|OUt7I)K1K5Z(y(2Wa2kp;?;kJtKYNv~gr2ef9XExXrRW9WbU>6q zm}L2pN!hlm!>SX`og|ET8W;L+44U1IL(*hb zIoywVV+xYV8(=ignt` zam>ytTU{%X!foZUtuUV%k%@O4fSt}gmtt28SOv=CJBOtw;0_xtSB;f9&E~Gx7}E~W z&l(K=o(dHbZLbv z`Sf+%9BLS@8O#n*`<Nb7`)RsrPB#;&C6=~uk$`*VUq#lw4pPCj_`)49K1amF3d2c_%nm4dhVB%4Tc!QX!n|xF= z+wChXRjaj-BIwR{D<&MKpdeDqf(qm|e--b>;O2%wKhVJ@3$kf@Il%k;0PY^5S4`8k-7f|891E7peAS-FaaE;I79%TO`?>amG<054FiprduuTEeF;#E4MLfy|jE&@g=eVgfi86fmWie2j*QwuI8vb3u>H_Yu875wE?V#^6M=(#T z2eIiW+sBjP3u-mx^EgDYGEyZuN8JKT-bnqI^$nst z0ANG}4f%efHruUjtok$bS3?FnHC@=CNEkeY#8)k1NB$2 diff --git a/data/core/images/terrain/water/waves-convex-A04.png b/data/core/images/terrain/water/waves-convex-A04.png index 22102289e8e16fa5170255dd69425ea73824d1e6..80210e5e39054ff4e346bda1251287474b8b878c 100644 GIT binary patch literal 37423 zcmY(qWl&sA)Ga)NX3z(Bw*)7+lMn&~hu}6i1b2rC8r%Xwf(LhZcOPVMm%-ira^L#C zTlM}pXIKB&yU*!by?brxFl9w)Of*t7004j~EAvJ5P1e3W^Y2jJ-k%?b@Bo0g8`&?P zzIzxPw;{VM?>3!yv!S!fnJ>h%=0c6l&66i1Q9g~5V&;B**Do+Sipei4sX*F~Le|fS z$vZe&nfCa&eYBe4e6#4D8D({Os&h*E`)_o{EBC}>>)Ero_{-gvxV#KaFcQSyU4{mz zgZ6=5Lhfy7`Tyj}Q19|0h*tAW5ImKv32HQTqSo|5kc4^1qe;N9oPT z|5pAVrT=f{sz!gy6r_6pcM@_{mG)Ko&BBK?MW(-$5^pg(^ekc`&Zw-G#P0$;j#_V=)SP6XAd>})IQ&FWKWzrfcQyn z0>{}KB>)b#+S~H(OAX zAmS}|uRqf=U&SF}Tuax6sD5v%NJ)SvJeek?chs*6SKHrz3C_#xS0SCF zU7Mb@E@wOq)98p@5F%>quEoGl317hN;+Dqc9G1rQ!h_<|1U#SQ$6YznQjupuT?8Qj>!9HA7Tg=GBmrrs9c%j=g~VF06$HqXy37m zMWuhfu*U@x*aQdRA*pp5 z%j)BxN5TbHuArSOPV-EO7T03nfg#gkuQj4P6~H zKtTZy&)8pgL1SGc+UMCY*Cv+Vsm1T~EuNXx3@=lEPTpXer!fxOsN2^zxu~2-?4m&0 zD7CATv;r;KQoq^@}2ws&4Xru&HVTA!B z@HhpJ&?~()6>|H6u~0|jdgE{4ZnFNUGOR{VP}z+P)*Bj8lz^(sB#t90EFBR}(%v$p zy$(#!=2wV&WT(7bP4MQ%W`MxhP!X7z{bkF8jG$CI#eOYDsdPTPx# zt1laFUpxz%`S0>ukRmEll25cToht}O*(BI&`ES<0orJ1EL8wp&+1wX=hxhZNr&I>* z4&X0Q6c{=JYsZ2$v}TDw!xsB zb?qPjY@h2j-{}$A4~3uE(*VbQsFwG`uRJrV{1yDDz=o5Gwk5=9hrC zd?ord1fix8u)Hu{VID4x2ET-{+@-zrBORsE>t}kUv$8q)(VMb>KDwtG(V$AyI9iWY z1Za)7(Vj2om0zdNI?)7F^|z)Oij_j0(MPj|@c!BEvy0);v#0Lgzc%A%)CE0dOD@n7 z<_PigN_XxtqsEZawuh^=+KT*8!HNeb_6o;TNoE+)b-RdrxBy*&kLBBb(v-K((q$Cd z06~hVbUuNp3?YHV_J~^s;Ki5D4C;W}qiu`&7#(%TWjnql7?)cE&Emgs+u?Dr@g0%zS>hokZrD^U--Q)Q?~-nn7rc5IG!rQmn#V(o0MnJ1qO}Q28>b zv!MsBJ8*oURijUU7-5e)4k~TyLT@xWQ3nV)h2;TxC|x+^DR@{UFy&r9zp)AXW@qhN zu-agyRD1W#Tw`@f$A_Gf3P;QavgU`hTvvV9DrS9!zpDCm3actrxeD6txp{3o?NTa9 zgU_bH%^wxYD#oC$u-!B6U{T5H;Vv#uM1U=6&3iKwzB~ktBs_&4LNmG}U3xBqA6d+H$P zaw;RIH=%6(x2VBN*TUbqI=jU2&#YGFY<7jhAynO>@QSwyBBE(qIyUXbhfmy`_D$ZG zEpa8V`svZSDJ9jFFbOAZc#Kh|7>Tr|O|Fh|AMp9x-hnNf)-fjS8*JjAz9v)kEM} z@d2cMWgH593B~%?<3!9uPA%<*U0Y5?oM?MQW*2or@?&*be6bl5d`eE9zM(9| zHEbH3e!$vUq52AXP3qTUW<)P7^ekSJBrLXxqFCHxh<3j(NvADJqr%<+3P2w*iv@i6 zF(-D;DVCbvPxVlkahM0RnFA<9zK?oegov*`y zB%S+^G&kk6bmWcCtSy@!*jh>24SJ)bEWpMh>vBQ3<*50`JklN&X%X30H!n)rdrBgQ#7e!&< zUYQ7=ux|+0ZqVe>6=}bX-Se-$B9ee2)V+p5Q!eqB|g>R6TP|&|G$=NmR)g=v9h-Q29FB`M;HkCGA!?}d< zY$XWP4J;u8ORjq=h&o!*xP^xl_!3DeUZ^|yK<5^adpD<@rt8x30Xt;rIOF4$r-hKz z)kA@hH^;FdON4td~ zxZZk|A0~+XYZq{h0m-^bcGR3=&j)JK`0z#xhCsd*ZM;POM(&FMYvp z-TdaamaOa@vj;cUwvdGr%)N9OG}Lw1DTh-m)+_n9pm~(bu8zuqiYWO+WJP?%bG+AO z*YoGXxHE$DN&&(_F8BcPN{|ELW(DBMuj3B%tX^jT&mjL?V_ zWX(F^yht)Ui1U7Gfp9EwtY3+sl#|tLKB-f%H6}*7bVh6`@2s8bVac3T6z|5v_``o7 zsQ&5+?knknimmF#7N|Y zg$fmIAQ{e^?nYeyrlM?k5H|p@-9bh ztSolqy*fY(GDR8hQsOgb1*YHzmoN+{Asnb^KwiUA(0@dswuP0qcA$K}=YgJOVF8$l zv>0w&;$Lba(paTP<~;@udOvaJ2UZ^AWLQmeah`*IHkH>fT6nRi{5@{|;gtXQjptH* z@8}RZ-(l`^;Irw{pRahX` zrA%eyei%dHUKm4BQxZ*2v&?OC3@J*)+Lktam1#jqD$o6HC~+@}sL8ZC5BqQA`C6|x zjy}`qOYGZk2RbMb2Y}^)@I=c^7-COZ8W?Vyv&e5_HPO}fo`iGc;5;S`)yU#VXsc0; z*XH`ivRjN>_daY)sBKZy?T;5n(xMSx0~~O(WbntZ0Ton9hPnx;mZ0~PRv34u!aj@6 z1hk5XEeP8R!NhGve2o`f_#`_1b1)3BYoFzxc4aB`#!I~;l<+09dD3<7bRbx7MN-b( zl?uWI46NT$S42Z6O3x=N^q1>G)?asddf&hr+nUTq$+ScPw#Bq zRDpPL7~K7frF_o47;lfOzd6Z<|M(|O)2Y}axhA_|$*m5J%5~cz4K-|tf34`kig9Z~ z+RL;8G@4~VxO&CSbbhASlQ#Vqj6w)j{8>~3-Z75v66#zQvb590)+Ok7M5A&$`nVgk zdYS>{@InX?ZI|uAS(SYbI{~c}l|x?WPlGm)CVp=SSV;JjS7dIdbER))@}vVRC*bFT z>>V$fkZ0NkC4Z3YrrFbIqMp{=`LaSZs7L=wQ$(iw)|>K`QhEy*v*tk7eD`(L8Pgh6 zE}{B_lJ&Akw%6P}X3~1VvaF`xfil{W?|p)6(DA!5`87Ji;WIltr+IW^+HeTjJ!7m) zH2uqUvQf!}%)hB8>M6uslizw>kQnyU?C=F%>f~m@T=zl-lA^l6FCKVA=U%32|0wEF z=4t-x`UrxG*PO`{2Lh!VS8@$_PrloA8b<`?;h{?F)}Tt8=KXH4#!|oCCdC!SJ6g6r zFLY$Na_b}k3z=d^dLfPX$R^aJ7buOnWe5vew082_HUi+HYk1I1)OYMx^2F@)B(3-p zcl?#Nup7_{FW}1SkES=GygxT}3v7RO71XjOZM1{aqI8Sjmo#vmM%7c~feR2FeLQtT zw0TLhH}@PJt9(%?mz^F{%sl^!+mUvbZFDt$D4LKy=S-t#ak=Mz2%p`U)sN9@9NM3J zi8lW?BCE_%D*&^g7LP8-X|$NhznV_{kNb1xu__m*vZ=ED0?zm7ayTt@(50Q&03^EY76I z=u+s{9V<>%8ep=n?t9mg^Q5SGCtpdzK2Ebku76>eRvYKYk(Ybgaii(NT-MDzoNKN- zN1t!6oxQzJlh^niZkJcvmk=X-8y=aW8t4d4+!TpVoFD3L5x1qmJJJLCsRL}3$7-Ax z(||+mP&pRJ6PhSVh1#MY8MI9i^u!Ce%kL@kBuIau4NlpOWl^G|%lLvPjy#xI>shBX zf2VKxC=Kn4QBiyi)aUf-JVRxUh!J3njJdqSDG7}j$ZbJ3d}vUtcyVgbbmxoT6$q8C zL4{xECfE*QJHHkh*ZSAC;q{+Tr#?t8F`v()KYlqKZWJ*ZEm}3dJm9Mew!$p`M!zWj zH-i6ngoj|g@tZq+g?H{^eq{^-_P?{Kbpro-tqZM3WMIb!L ziL`WdWG8s59!q#UnCd3&(^qop1tDazlc}Qn^0jeRmoGjyzLG^uYcspyMl_kF3wn$h&R=YM*=#*>4>VzXl9?Ebvvu zT;=z~X@{OWkGb2FXzzboPn}UpCGy|h6M?S_WK5}Ca{6r9UFwwFaXJoNcx&*s;~S3h2>bdMeQIV7S&xJHqG0+0*BpF{1MB zM_iVhoVLg=Q!t{8@DT@yZ8;w&$4F{&58uD+_dDJ$uU%zOHt*l7H3t`4YLV0r3=FZrJ&-= zv;V@r$iyNqIyP2WlNzo)*XgjdKA5~LWT)n_r@V!eRvo_s9#Um^!16-cWNSg$Uo+&G5p_EH&+1)x{~)%vZOcC1XX1m zea==vqeq(z6{DFDE5zMnCVvk&|ARTNHl6uL*yrI#5|gcC(34*kDm`h8FQVJ#50P6L z_8SLW_*-c6+BCcD#F|fVGBhp&XJIbnEssd%Wa$%hjstJwut|V=L4`7 zbpHwWJyl?ep1I}#e&-UV2}Rho8?Jw)v#8j!S>-mbA_wd4^h)4wkD%_sOme(@?7^oF z1P?=}b05>oLvg7LpCROPHugSE_71q(zu{2!%$pTQ??)Coy0I8+48CP?ff*0+hFdHQ zzExp?`77wU!zCUae0Fz~urFe3Hkv;y2Cyd0xy#gupP3UT?%wQb7(43Qclr`-pL%L_ z^$JWmBf5Hyxf>UcZmAR3u}M9J9%i0D6i5=@&(&7@NmE@}03LWZXw{)k0{ z{Ye0BpF>_`B-*iO4Jw;qYJ+H~vRR3$9cCE$j6Y8bYVC<@SQY^;bqliw0(L6q-J7z6 z4PIoF?ii5O!M@gzYCj~;UbKJGm2c-BxwRchzj$gBOSkZJRNoAR*)54lRlS?B90T|7 z)IPAa5r2)Je9E8@s?POFU|E~#b#9Nzv0L>sptOc8^G>G4(EFpp{cfy-{Exa zkil%MTV)-enUb8sg`S-4a6l=Suc5aZoa+KUTJ!xPAmY0CVnjHqPSY**$LZclxqod( z$9+n+(L#-n^OK{C{7rYE_6_a%L2}+R8~Q6{=?kn;?z*k7`~~>m%dfu=Q=7BC!~S!- zfLrenThH<>vV5&oGuA^A$~C*XlJaVSI-)JVzh;*QN?lC?(T|}fBqyKZ$If5gJWe03 zORTh3lRaTpNY!;C_XU@=H(MY&L!~?4tKY|J8&pMwQX*ODsWu_bwI-(@?YdfCuPUN! zK+=MrCZrDB<}I3dDuYo1C7M)9HyMk9SDxlxvftN;&0!>+IFk9R(o|GA)~J>ofmX~yPpvoCN;T| zcSHW&Sl+Y7nj#`1vtDV6>Mmc^)Tew*q;fjiT|x_*9nu0T=kVST zWv<#8H%U1w$76k{x<8y_tjdRks_VquGh6cXE(SO z5-=!Qf7I7^aBL$>AoWsYQYVPjJYpK6uP9{0rA4++8?!n9r4?!V#p24)`}DDbHr)CS zq!O8j1a74AWrY;Xj`BO3HBY8JJtl?jnp)WSt$IAvDSqlGJT{Y zEg+^Hb~5#q3c+=kS&wS=-i_lA;F*f`FI0|PQMDS4Lu;>D%ceNJQiB=uM9`P+m_bX$ zb>*#|B2juuVs&^(rjJl#HdFdvBu@|Zfe~TzbieJv^j)q&P||Z$#KlL|ElP=}*uGpZ ztn_;etvgZTGxV--c{~4@&_~#>TuH#8;QZy!jSaZ4{KG{Afx?3H;K4^iQWjOlA9A>V zVN$|niO5URB@vs#hu`p|4~Es`qty4C;SW!4>GgGHEwp&kR>Q~?7`QgKy7Qt^J|P32lss=ecq4hzeFJ4&3lBamxM`e9VXm=iMk zUc;l$Ap(Fpg=@B>r;S3%>%R+m?Sbf*q_y||JnUk@ zcfMC@Aem$ROc~(1%UhB~QUhr7`F8ewZ~pm{u%=$>b4F3I*gKJ%lR6hi z=j*sLD|UKbap-kTtbO70=a-$Mvaw@!5gW@iI=!u$6AL|V2hIo(9#q_$_?y;$Fd!wh zYPZko*yxY0UrqpA7!AXpe5)Uh`a&*dh8Cyj-EGaxU2PRUxk);!8$0X!sX4pm=jQQw zf1Xw5%(f{>Re_P@!&T1w;DIUqFC9oMdIzM@+?_=q)3 z=6q9P#_+fub?;4DQd3&TD^;g}$-t}N8XU!TeV;n};1khWG>EL_t$tAqIyo(3k;9z% z{qN3NPA#24YUm{YpcIl*H$!J%qN4G~Vu&Ro9)loQwu~V7yf}5!!&gBzpt@aTXkIyE z+pb7U0Xs%}`xLSL6gvNk#MwdNN*z&3Q32=;-Ct=()Mx`r zOI@YwVHHjkoH;R4-h7}>Wr}w}bI1%L6kpif6Np=lF#(+Uk^lZ6VG}siVkMh+-lUGB zy>~;eC5FP{NHOG${3?V@v~Ke^IO4-MJ*nk@gmVDEKcM%}^J*te z9^w;8c9uvWfp~FhH23w4sn^a9OvM>LpZ&{)sF3&I` ztXRM-IG4rJLQe6DLj5v+K<`*r)NWqZjk=A`0T_M+oKRSvkS(kAml#ctI690E6o^sf zi~dRJb^ZX*hnPMRun>=bHU5hb8$)Y9PZz(7!^4}s!Cfk4NHis#F-ku{Xb|)HKxzt$ zEJP2z-&KbZ_^?JSS5V+|fOnj*kpY@!#%;PDed$YO8}{h@8%>}I;GU!9-wsHZMGAck zU0jBw4Po|CYQbgNqm?9uGnC>sXkYd;!43LyRh#BM2BhA#G2J2)-QWECyC0wd4EGiX<>r;gXk(ncj+j~Tu3m!^)>1L^O@7Xi& zAXifPF4?!P8s1({AInb82V7cN@NAb@8j9f5Pd=H4w55;WjnB;bu0ipX!5Mxv-2wc< zT&8N{J^iRb*yv>GlC-X%DDk;$7JK;1aplc(PDIr9UXe=61A*y?@LsP{XxY4J=yv~{ z4`#sXSHn!)X!1NyJ#S-^FFn zBFo{_@AdG%^DFAUEQu4?4t(vk=a_+r7a+mz5x}icYU&BoNlv#Xw~bd#W1jFCV|$ce zL~Ao{lhX$bUz+wSPslxM{5syg>avo-=2i{9+9?_wf24@n98-76omwSFDh()Mu%B{* z#_+;cEs4O>mq4A&fW(Jc(A$Dm)i5nOrSx<<25CgOg~MUM!8DuYXc&CJ_4|(9CXp`|v(k{Zo(g+*%?Gd!d2X^SYZ;~g#B+mWQum4UgBSG?^I%fGcA8XH>`&#M{ca--Dm@PD8>! z5SHDB+pxu~mpKC7MQOy1j&v^MzuXnnngkEAl7dUmv(n`sI8_NjRT|jwai?X?ytZ5&eGMJjq*Hr2cAm zS-;$T7RyzEXD;X^)++0^_GqZpQsgUC=9q{AZ2Ajroe)H5FkK+pn(=jJwX7`tAZ1h* z=PjN-ZO5^}h}7=dy`Y?{y~x&?%k3&sVa(R>Ito|HwtTBBNdrDsdv<8u z?9oNt>_1l0S_YzMVSEg1z>f|<-H9_hyuk+R8l66LVzWlP=d6p4{h{%VAH?bM)0Fw4 zOByPqyr8KV;ZI>CiCO(xMoi)Qv^Dk4pgna$_h^DeBC~*6rGDz9xhr_-6J7#wt$uW3 zqx{=SW5La2g23@HoMN@VvL|m`Ih}b{oR%y(zhymho6NIv;OFUR)!QCHg%(vN=OR&C z$b5asgM*##7v%PZS_m2MDFTZcxKn(wkCS31*Ds~%N6GY%sHTu!N%&^x@TuChf2_Ea ztnKlsXRK*797^beg5v|qG|(8fc>6%JA;T_2PIOuE>Z72_MDqbx0t>q&B8%SoM2mr$ z8TdewI=q)2u--fRPr;FaB+ZSmK&ouyTeyx|B3@e?yEtDHBL`m-yT7x6??zHkbASM) z{rHGd%#!MFoSLYJoWKZ4jii<_y?BB-wTv2d6}86cFq;&s^6?D2G7g6iIwP&jW-D2( zW#5)`G7GGVza86`DfW}fFY!YSUxl?Ed>b^M8QRDUshh;=7u4-lU;J9R%O(;}i{2NTyeXZZ_(Kp8H?XxG z0@NCCh4%EQ>?i$}EcRyr82u-w5la?AV7a1x#a3FtB_0yCb6olL#p4Bv*eOe_>n@#wB2gdFEX`5gkaemNfGqI8mC`TPsH2HK{o4P13UK~R zBzZYY`XYt{5ehQEf6Mgf2yh)uw$jjZZB#O)T`lneHnrgEZq&j8^3oZoStHsA)AI1K z9DbD*RiQ7Jn3$5@3+6851l5;kmHymZCas=M<(CG8ogzmmGvc4D;nRD=MBoZd&(|f+ z@lZPYAQP9$uuWO<;Dn@ue|-lz$CMD8BDQG$xj%VYsn*rU6xG9yX5N9-?af(b^cK?2 zRvPklzFlzm@R36CMQIcR*EtIUxH&5r$kX3SdKkWsnLA(AgJdp!ug%NP zeqSEF%N<9}0O|O7>|}Ib-2BvdRlJ-WA3vHrHTC!Se#cWd_3&G~m(C$NrjTt~ zaUJ^vqO)-0d?^94?r~k;64T;=8a5e;tta&0z=L8JZeqIlNbh5>>f?z6x`|9XXLtHF zu%GOWM0SO(x99$Vs6YBOT-IqTg~yO0)KoY;bET*KKs$L+Dtan(Zslj4cEnuzKybX} z?K=uvod{>#E@T`uAlq)h-5=9XBug*ur1LIz>D`b{$_>+XK(i~NDCv;{3N-g4p;yCh zO-5E~uQE!O!tdIF-T>nGHslZuY^HNzP?-;~EK?Jiu-Psn^{_d{2*PA}>yyzJ&LKdY zLi^JzJ*BqY4%UCs<FQ8O4KKc64CkZPxJQV$x;?3LN7ZwJ!}m%8QDdNL&2l9&wI@bcHAO>aEfrk zKN-X^d3PC_k?~-?lve$g;!#{#(n}Yc{+>u!$f0yyKeOEobT(A8HBj?r&)y={3p2A=xCO`nx3GeQeh4_+@dI@K( z3~iZ8uoCNNWHeP(&|2r>Nc=%`P_zk)1Nza(=6vJkvt=7yPSQ}zfGHcQ6@FlmA>kNO zfc}QtP?WIG!xy zO%QeoC#J;y+maIdI$;SHkF&4OjivO4uA%=I97DWi%)h8dF~%2KP3&N?{@2E}nO6ni zMbKf548dZYeEMVd259~NWc4}4n6W~Qb~-C<6g2I(`cGcq0)%;-I}sFrbC}%oaz71V9ArW|e3P+~otgp^PqhteG1ubw6M8HdR@B zvW4B+?A)tEd@#X;fQj`c+D<(w4E5bF?q}`BJon{Kk;k%$3?$dQiO34PI}2|ieNo78 zw}-cS7nYp5V{26-iBa<=40|e zMF;lnE+6rO4j2B>E_Wc3B5--&;{K??1BPyS3L4(nGQl!qTGX?1b^Gp+CbeOXYFZhG zcEZfs>Tu=q4p-?d2SPb-Hv-<<2?DqfhshwRck*I1+nFMt5UMGu(RLDg$BdjyFG1Z= zsx%Sdj)*^!h!3K#6!#_o^F)BXw_S^Qb+Q`0-MB`?DT)$n=+-$b6QxA)9d?9KF~#{h zzSsEFep22%vY6(CjYe&fa$Lf!xDZ-9AIR3Atew19&Md2``NwSdTTMgZW<#lNuoRI> zVvUu$`c3{DH^Pk611dX{M$|I`7g-@BpID_;-(|hl(PZ4RqE;I1!5PLt^K+Lk3IKNo zj1FY*X+X9+5Y96%8vI`B&z$;B|LmU~8>=GbRfZDQZ~LWe69*MEjcfYqjnf9&|E;}I z6cfTU$M!1b{dK6r<*6+eY{ci%=NHP$-@Cz4o@UtWdFe`-*WV(C5bJAqul)H{9<%27 zg)Vd}HUWx!G2oEff7$r zk-T*n7x1&y04+&_KO<#Xm1={~E6j|&@xZIbM|LvCKiw&NDy~EthWg4uK9<~4xKzz{ z;$Tq&m!!#D#}7TFno4Xp%U@1U(%VVsM)ah@1{qnqmQz^ghr;)M*Zeyva_=fo6C2t0at7b$VFuQh@*vz%gN~g z4xrmAwN^trwVS>#O%ge)US@|UMMc;y9^j0x)`b?JR5}#(Vlf-N;ad`BR(H=8*Gh<9 zsd=^-o)m9O2K2yS?LZlzk6%jPNtx7^Nk7^wW$QC*I#=M$D>63*irOQNZfW_h7U!gM zx`;f8`(YFG)_e#PA9EQM<~(N7IFglkW+dp^1)ng*;>WB@tqoZCa7)%}dJ|*i1CQkY zEre~8Npl`Hh8AzJI`xR19PRbt96(a6!$jiu>7P!t;GA>7gLi)Hk%?v_z`Fl?sY7g? z+D9RdD|Fqdv=c9C-6o;#p*+Mgs>-fp_WPgiNvnJEkfHK=4dldbJ5sAspH6O!aLRtF z_3r?0nv1RQA;D>T3%A=9p&Fi1 zaqVZ-cWy~5cD{lA&Z8(CRMKJ{j!YX?h_d?3v0E@;uO(O198J&GK<_(^W!kM_(+CR) zMg{`52_Ox>{=*t*?$2qI$yn+i>8)*daF32 zfIfJ!{-r|VP>XcGDfZHGv3O6R{L*`IX)hl@mf)A3sm-x8Tc#%ilXtbz1YL0$&=4RTye;>Cd)h#e zuhh7oa4{qclga)`vg5iL4CHiKMitqW3@f+DSrl_@3)Be>R~7r!v=W85K|eIeB>C|K z2RMV*@`l%YYhU{J?=zOncfC(c7`nF9rqelM?^;KUFD4dfA9&A^or9IG+~z3PbTW6c znR?cg6Z_^|XEP4se+N%3Q>=DJvgOzI?)|+ADokE%9s5AAkahw1`#!$cp(W#B4VTVQ zJaU&0*oh&*g4{Dx24`{FDTzm zsEkfT9~6`@Fp2X8zbc!Rj=5PtR4AL?!du@~-ALQjRaV=|sJOh9`h&7=9BfW2ojZhI zbWJr~Od;YhQc>FhcilHK;z<%!_%jrm34k_$wbA4bm}1?qTZrvCvl~+=FH7Rci4dVR zGR45!eQNbt!75a;?*G{1vE1y<0a?j1X2oV?W4dHo;Uuy_8`jgFOuz?!P^Wy8F4YkV z)PR^Y=Iu_V3}#iSw{RSaE)j6=D}88E9+xCJ-UcBaF{_?Ph7s)Y!=u4Q`qc9*e_2OZ z_P9563R@xWziP{K0)L6u$==!x7WzSc8=~i5ptD1(KBUq8EuQ(7)E^h*yk`6CI>PCF z3rm=QX0w6%WJ_k>?yCQG4h1BbwA`i46tDOsh>@s!02ewuE=ch-q;3XsLDY2JMtUw+ zQ-?UM_6lYiwcvH9&ZSOk6@;f95;EjFNuWPH!~jUff!Lb8jK&y49RTorM>Ne>99`n1 zmcvhEYB$0>9#+9Rro_%Msx-3UXYVR|;9_l}T~J!&QCUVa!B{ep8Vj?KcTZvFU@-Jp z`pUw3E~vU8s-;aIn&WgQka-(;_tHQoSf0DT=Y-YX0U`XU#+cs{uF}@7wlHZA$*z#it@v8+ugjwpwiae*Erl>pK}m9S4>ms7LCjc?lX$8{!2%DFQS4 zmrEgEci+fyt&YIlh-pFbmfy~jIsz%fP|+#A(M7FjQ)O~u$M;GU&b5Z7t|jGep1l0s zo$epwe8pK%C<6sE&_|P3^L6f!<*#^m)+z?4UgyP?{b{2vbFX)Xa_h`mO0U(mx9(cn z7?3~kx^$7?HAqXF(c8@{r&d)}@^CYwIs}s&Z!=T~e%sUUng=)>XHVVWX3@oA({`cX zgN`;@r7ca)pS~JnPDEtl5oUsK2=ew-Hq25~x|U;tt~De4Q8C$w_3@4QE?&TXr%q^W zOU?l1bwW-aDqP1A$3^ZzUY{%6kT;bZcS;C!@n~2r4JPo7=wq?L`L7M zOiuAOoi9RS(ml@Hit_*uMR~rS3H>eSdD`DiT6N~r0hca{I0DhTH-gAn`a)#3b-q`Q zwTMUGd>%_xgif{8ST&?ecbXDyG|)hmP55tR)`x;bgAu6F2-l-z<8V*mMX+uxd3u|| zVU%bT*Ixqy?5vvF^lO5L@_Y?kNxHTP^5411`2Yucol{n=-H&OSt`v3yWAgROJ6M)f z#w4Q&mfe~|>*Am3y2sPk6f1#4`xz7WT4~*VC`>GiT9m)8BHI)e1G(4)sX?w;sCzlEP=LVM$sT_$$WbB(XH%yv05kg zsL3VJQGl?yAQ9;3&Fr9{~B z(uPcCyPj}<2A?S74)44*8CwR3{`f>*TSGn}fFz0{nbvK!Y6ugCw*CyXGd9{onipJx zu4qZ+yzgl~>;;k(?1G~!I&+8mCvt~fkn+ZaaFb*oJ(n+4iS@@aG9#LS~w%QO^ge5F4rep5Ut-y2np=e)X1^*0C1 z3lKu{H^eKx?0%i2m>TgI;hGdN2;~XeKK}-3EF}au`4dTu(yInzv+-2R;CtGeO2PX% zi3RmqsUWYgMZED)=)Oot`j1WASfDHZs~yj+3DQ>2@`lUBF#!4@STIZw17z7Z|3?GH zS**q%=~kPVW`^0+p0pS_lwbUt#AtzrNbD1K&(tEeExxu)XQoLLCNdMAnZtBCXPsqL zTl~kn3h-fq(P`ifXiFrx97HIYI))WhDLXk?jIf9lUpQ-bLiQuOOp{W!n}m>>%XI7~ zk|oY`gzqQvO1kp1|2X(!EkID)5`jLe!15Y)!asB>wxtuWWKsdc7H!48N^9tpT^=dl zgysf_RZTDxC$~iA{{W^yS-*hz>cn52)Ia2!GCbj)V0))m^AXwp*GQ4?VefAM`*S11 zO&2s)CR*@qM{3J=HPlsPs1@>>HkG2jPpy_U)l}wH73J(K%-yvqsVFTHiY6X!TI=`mOu{jB|rHquYo!}k^m^h8ug5vqdEIw@_FFn(@#b$o{{_$}5Q8$nf%cF1ye*O$fHXhIsTDow6# zs>xO}E~S&VRI(Dix~;k*udpCvTS4Bg=%l1=Ymfsmp+f&+x9x&KR{|)(pwUEPL*eE% z0Cyd)!OUBDEp`*{SpmBS^L!MINGt!D0C?`N4e`Py5mA*LvmC&N;yDYKW0|Nt@_Yoq z7IH*@e+>-1nph>0OYyqU>H+|;_C^|*b`)f8O|31@Y@rix*raRn!qPo$^||)u>NIy# zW#SaEK&RX*dA~}tn@J35IiQ8NeH#s98@u`%*YpiEhjThW2zDtur8}2NfL`bh5-X;N z5E6_qKKzwfb8AQdqqL^lEox&;iq=%0uj_26;~;qzJ-Yo!4JX#qUYg8L1;7_l&c2!g z$}NESUS!8(F!77rr{hfd73}mq3E~f~3GK&boBSbld)^VSvx8}r!J4v^rpD@QIUe*- zOG8OdQ$uA*VfN0_yj`2J3wK2c*|Aa-IAG#fz$7Hb4wy4ueEkEgH3Hy(FNWvBVc*qt zB!2?nFmfcXFO|gsyI@xV@K8c9Z?MqPFzs^WOHf(H#ueO#*TB|1FSIf;Bsv7P4+rdF zJdPy7`MG5<|4Qz!0?gsX=^IyMByQZ4m$5CUt~$R)-cr#cV+N4|k*lF1#nw=sJl0U2 zFws<*Fi*wr8K+0{iH%-q)}MWhUVh6rYkZMD@h8!~50TW}L9QX@53hh6&P8XRNFsSS z5+gvPlbw#lUYeF@B~_M_w`2`5Jw&ffG;O_WIhZM&ific9T&DzRw(u-tg>BH(VplLL zrb0Q8as_4WNc`uu977h}+1s#{^Yu~;-3^6k=mrL2HJl+bfFAS!+d0kpHGB;Ht4nyjd=NH^A3 zX7{(r8Y`QdYsw0;c9!HMZ%Qdj+mI%hQRr8|wiB?et)RdG(1c^L5pV_3Xtchua0~ht zaKp&FCyJtqkP<9p0HjGx$WxP&o7Hs@4E@=^LT!VEd-UqNlh1?JqkZ5)y85MS5 z6wgJW+rz~BOVXnvb5o+?5|a|6%1g3yTU)A|6tY@lLsh1gE7Lqce3s!FGmF4w?- zYgbE4bz4hYQ%O;2aeQvt*3`1hm~>=;a5~l^CsOFm*aE251Lj!3yAtpP!LpG=7>`%* z`UYf07(R4JbIJA)I_iRWZW(}HE|NVS!>~*DgGn&|4<>`v!+8z6Z%I~!2z~ui;U@g2 z$HEd^CoY)yzQ72ehqzdsxHww2Fu7pqxuM~f zdyo-tk}QA0#s3xSf{-(`u@Nnp||^I(9tw30qWCv|Iy?q^UNE1 zVdi0gtYzM?0m+vSGbaJ$I73(622*e2>h6K271NLs@yiA@#~&O5^kOf7?hAuqBiLEI zhCb+xFu>;Cp{Dqr!KEX~D(JRrr+u^=z&l~xIk#9;K4rL=xRy-)7P5A{XFaD)>0cJd zL7=g}hRMID{QINWqR%R?=b68|n6Kb{Xy~chvgD!W+MFSIOL?!Nt#YWouC%G5G`BP> zHzzJPZA(&a@`hbB?`HuZs&`9Wa|r-9K>%0C2LV2A*8q0Wh!i0bNA3r4`+tCy=a>Dh zlOf~-APuVfDFAU0>?=SUNkkBM(@XlA3geP*y%H8*BlNZ?#$YLK%}?2ol(2KlrsDiv zCCyEh4LVJWR@PY5UtgJ_VYi;Iwk$yjpsh^cEVehLpForTiy|@PbNhN?-t^_n-o6hP z_w~K8`@qnj=Jqau`d&^g5M6lJFqv{5%PPe(n!}hioTjtU#uST*Y5P_HU5vw#O5@m8 zViQecwD~rNk6PuS5YzJ6J-y3*!3^E?&w%E`=v_g-z$!ZJ*0HJ}8Zd7e7~yQa(bgQ! z>8=6HD!k_r8viH6ftVCX&O~xtNm=_QiYIsDVL$Ae)IW#Y@dl0t?V*fUIXZsiYm+Ua zto5?WpVz4hFJZyr(G6uudnl?bv^5rvhnGH8MhW?Z7WRLv2g=m=Nn+rbo6f# z44ejVQvt0=_~N*Qu{Q@1!2mUs5WtS$`Tx+WSwOr@09$n53Dy_Si7I5pl4s4g0h*fk zVC5~9#=~=y*Tp2q$3~YHq!hO{S2k!gZ8C+dvV)y^y;X%f+yGjG%x{1hU2e{SF4>x+8^o}b&(`xt<}i)8T@hAe)K!*LcHl#UU{#i64; z_|5}-Ln;`ys6cXLz{=YJbaW3rHvl|*ao`&`9euT15d2opf|#Me<&zs`n~dihUYYv!y{GSC^z@yO!%ei7 zUV)B2n}W)*B!l~h%u0VB$+%c;&ix9FT42H&Ki47I(49GXp^%t6*ym3Qn($<)wyp)`##)=xfUeT`C%iH9w z&>YC!60}Yi)oekyjw8bVIJ!)>dpNsuP&!qNkF8ueAYHy;MUzyp{`@;PG z!6#<-3_Qr`S9fqY((mYhxtwpib1h!Y2@uFWwo&<6I@1r3l@zurIT;}ncHSW>xm|rt z>-ZZ*OfU3=PA_ze#PF93XbyT@PJ?+!0RI^!m>+Uj!ltJrB0;2$bxm5rrVRy| zJJRZ^^2@XuS)0MwA#ZIeYp*Fu9BSIRRhgyrd z1<-N>OaY)frkO-OoTTM+Hq~DOps%Hm`VOX59u#K?a#+txjPAe9o{f*u&!1Bo|4b~E zVOsoIgQoNfHV!d6n7*Igar4635MJb5f$C zO0u?<`ic|{%-mC7wsRjNT6;P2P8<~a8j1IZI2j+afaiVx zLid}~^L?+7oIgvo_7SSKcZ=Z&nENWuk~yEnj>nS_?h)(3a5)CaW0dIUa>ynF?Yzy@ z)3B)rFB;o!C0=$Y5lk;mkdH-EF-|m=$J@{hj24KAh6*88#NmIQ*QmJ!!m)QLBg1)X!qwv8F)vAwXs&uIfh$ zFn_UfE($H9FProgSJ1R`49z?H*`&X>rM}3{8eBDU!%E92xQIy=;DjkfnK|v}oD>$P zt>2iIuyIXs*47LX+S0n}f~Jg1@RHNnc-<;DDX?68ovZidAUu&~)@2 zelxu-#xIzJ|A4gyZ+aObrjhGO4(7klJ8QfR7Qcpp*$a>x$KyKf9~^IYQ||6%Etq_O zxlR~5y&FJtWZp)m@mKS+D@3!uSWeHyB0493nSl083P5*;AR|^V;T?fBCkA7qOfYm0 z8V$xy1Ly^OXf*)3V}POx`|CUadM|~QivGI?XxKK8@S$y-Y;vgT4Nt(SexH96f(gA~zooDvtkCLCKV zmVS$!uwmxU(YE6@jvndwq@A&A^D?&P6y+wB*Hz|r&;mPBU7p!lU7R>oU7D=Mi?(3h zvB@-rRk_NC_)I>)x%e6f<7+X&Lmu)DbA>N^Cp(|P`S=6V;CG;}ucy!B5^THESbTZp zphYj@${`x@4C^*3(dHWrrN(L30@t9Ph5SLikXt>CM#d&I7GFoQUQ)Hn#3InKEA zVk%!(Q#!wm+Xq--@Dz;ms)w&uGWBm@XRJHenqwVCM%wOFw&v}ZH{^(gG3-@$B=X-RA$Gd{#*+yfIOHM(p9V-+nk-cRdn4|u)KGy2`vFnEV$I#CsvWi~ea16D^lN?6#+8P|Bl@Q4xK*P>Rm1XpS zEc@l!b~GkU<3ppNSE9{U0pbm!tlHDxh|AHutADg57u{A#!YHTc(n()|nGZVvyX>cr z_XNOu{`5@Ol~lfN#LK>GW})Y?z)bg_V2gL@9Qy*z_&xGOob3AE*tqOoWn1pShKgiw zYh6w+XPxLMtn}+N&7%gBwxYZ=w=gF)t~fhs7NmYb;^j+-Vs?^XMfA~9tN1%2FoE% zrf_ngP(Uq4v6gcXQxM7eFBH)9aS*`(JCt(vN*s;V6jY)psKoXUHE$mrZAl#*X~`Kf zw^b2x`fpA26^xI2Q~{>L_qYQB(8luu*i3;r)9 z|2a1&i2_h=YHVtGVM-}yxENIOO0Pyyz&q^@+5tS;&yf;e zFk1By@s@SM@G_%TPqWhNLBMziC_6x{9g^2*=N@h z-8a~@V{oi>*U(sN&d7LM)rdtd=XhfiS`da-`{}3?+men0%;!(eny#R8?0SxWyK8dB z^are?XR!lc_e~f-qH6fHZvs#UI6TwU@l0!7>I_MeudbAYsXDVB>7nm7VdHAshFY7- z+bAW|;~$fso3b%!$L2LF`DzdQIkk^gFby8LYIP_;-ddEkJ+-WGR}O2!WbCaTHfS2W zMnhY_y1l~H(N^SR6lkpn#-r%w_W|!$4!`jWw!G4)WO&0#zQKyz$2lAP0WW}N z^y)ei?2CBqGz-Nm3M#V$VsWFn-2|AMXizG|=}2a#a|`lg{fN0e63bL`)>c z=3Rx~xdB@!MgV$Xv^9mu<-@Cj8IT<9T`=?*NuCFbZjpU;N5jNt1m=5wP5Jz~*~OmQ zXLk2LNR!NyY)*PPFx&Gs3uivXR{CawAz6wA@7rCpo)b+MAr3i`>vZ3#cE)@wmsv zfHD0ZzcE`?7r^Kz!o~;D&QqNCIKt=N0Yg^<>>Qqpr>`Rh=ZGz&hLt4dE07(b?xkZy zOv|}l0<`Cs252(kWyEqffEGs_pohb;@gjz4P9mbornmFemO?U^gFRFUpk+8ACYqN< zm_Bwo7!d;0N8n|jj>B=`YSo@k#VVdus}}Su2Znc5qM+-PWb09rEfPjat@NU0=T~FEw@-30dmTWk|LpedD@} zgbnK$KG-Q{9t(34@@uQ|+Gy+_X=x~?^i-my9o9*1FwU|WFNYmX%IZ_+_^jSAyEPwk z`~+t(sy|~sP^>d}-7#T!5gkMt|;)I6~f{0kQ5F;G75mq z-$0&;ea9x)_Dvk)v4+odr5FF1NpW%JO0ajb3qW@U!T7&C$sw*{^qN?o8|*}bk>rI_ zx{hSg`C1xcHt|7jMZYCcAKvTz7GNDujmJU+ia2D-dLV6Rb41n(r&k~RD6I#F^#GY zHr7^U59Z}($7LkNY+_Mj!Ovlh0fGLBTAQD-HNG@Isi>?dt-PVOsJX4Rwz;*Tc!2Gw zeVj5d*if;npXMtYM^yycYLn+^>AV+v?j5G$MI!jcxQk?vv&?aRUPUWEPcruy>%Z<3 z!^LzbUPtleQWC&(0Q50**zM*-EaxCrDU95LmM-C#iu68+h7JE4`Ms;X0Gg^|m~XZ_ zlq0KyeXKL^ObS5%0xN|gad1p5t(l{Evif^ zgrx&!W%H1w!@$O*VM^O}n)j#3s1JkPPl9EB1>0Xmwtb^-zVj|7Fdk*8%(K`@0?_XS zrVXC}?R06RK6CaNfFYkF;YPMxB?q0!K3C~s{nrC%d!lFd)*`ij)f`m)4P&WG`H zRK=9CHR~{kPeaS7{uA^q`GfH@KI3=oF4)Z z8G!l-z&s17SYTrVc3mUPT-Z0*N?o9J8#Zbbd-GON=?#aN!YIy!c*IIDPR4?tv(2bui73t-=ft$DT0sX3qh8z&E0lm|KHZ4#L=(l^wm#iFaB z%$-M{%NF$X1`^FxLMB2?p{_$!!eC?vNq%<_Z2ijvG!rGP(A8kVYl8WJLjm>* zm^#u4pj{KD4OXu)Zp5LBAF!&^2F$7=ETl%dzEr~&RX@cQE1s$k*|8g$ax|Is8I)}= z5r<5Am|j5}-s>WJhxuP%w(!qRzvf+sSf%Sxi`{nLx;WE&+#-Kj-jHz$fZkVKlDM1W zi}&Do>}#mZ*j<*lbE+U?OLIY5Y(Z|y2H|Q{0=RVSwJrbM%Nlup6JSqedM2|VbyGrq zR$@{^RjvV6=J<@HKt=uzYi0h{X}0;#)^mZ1cG2O{)`#die415YpK}3!i3{;5vf>>8 z{Ti;s%Wl8%IrQ%nR95d3hbqCe*OMGx0ZE)kb?^iv#$Kd_hic#uJt6O` zJJHVmsjjD(7JAsva4fmT?Kn->aHPkjoSJnO+WBY_@cFL3W{0V-sfX1Ot@J#XG258| zsF_k}j)u9{iv5GI{|YY&JrM%S!_Hj*x@#F-cfZU^Aq*M>%L*MW_Cl|~_>Z8`XbI3r zj~LeKZl`55nS>;djsBG)F$CNuH1#O@&V_|1*1qlstjD3N&w_<7p(o)Qw$$H>#JCT3 zdV&h%3s_9AvFrGK08OP#^Bo}nj-UICPCibJt+_+im`w*>&c62MB3eqz_XF(38X9~m z^R|uABi+c^gVm*(vGU{{QKAC4^1pN8Iq#`v$$B;a9rfk;@vJRN?`&%<>D8*6206#j zO){viE!r^$nD?+i=h(ra<_Dad^d*LbVd*c~2mL7$<2_jV&#>r=o~f=sPR(^cMa$?P z0&~3-qB=RA!f+K9-bEbZe>yXS2N`vnG7Yp?^*xOyn)sUlbP=oBb{V_s0d&(Q0KW!_ zv63zRE08RqB!(ekog247#IlKBDxk#)N-!yaHiQ7;Fji4Tki4u$8?Oi8G5j&M4V#t8 z!=s8UETi(ivG%6k5xEZ6V~`07J1Y$)%=8;D)qMnAb*BQ<3t;Rk(c#x4L+%9N4vt zo~pvc;nKYLW|lb0X{@g+*tKDOdi?rG_I7OguRM|h`Jn>*CCHs5rc^fPr^b|E)m3mD zg}$-25KtHS_-}MK)nuuv3%4(l;2szlXu8YpR6WiG{w6NO#{l~4aaQR<9B*RNy#@eZ z0&Gt&xj>8E58&SeXz~u$fT6Q5pzv}Mo03FBzprOlHewoR)tLI5YGCTT&c4PZQ+LA_ zn0h14N^4+e0Bu?UkVA1wuQK*5eH_Fu8qj||+nWe>2l!z4kVr085$o`$H`0o@ znU=={K477v3;RbDbpxXc1&=$$39_uFax%R#Db|AVM?3~Cekw(S^Iaa@RaC!jM$SA) zx%(-k$BQnv_EjXuE0oS(x7gHgn_+CTld!8^9~o_X%&4opfX4sbt##QmoYX3;Fh8L2 zRum+8*>z`PZ?ukc12t$^XLZ3&CxA0y;pP5k9qR_O7gXhLZW0H0qM3J)0A?1Z$2JnR z#hF_w^V1>u%xxNWL-*8_rcKn8?V7-DoTMT+$07TNaYp$)Hb=*w>@M}2Hjy(pRDz{n zLyEmj(d1QR#cO!+FTujkB0nDEbGa8=^LF&^HM9y`GBIsB8$ch89Ghi3l9eJ#ch7LE z3|FI!{^v|iPl$(|ne~*d7rO^Ne+4uSM?kQ%A;<$kNr0xR1T!xefaX@%K#|CWwMdXC zn07PAlkI?scTqjeC;P4(z~skP(gW%tjyQIVJ2U|fpcji94~iaMKz*LW2cUi0Til%Z z#QjHvmPWojgXDOD9c`~TTxyXd(s8E#jQz(SBS&5y9BR2$){wEgxh5mPDgY11y1B5# z+~oy{o{GX0Ye~Vb_Tv0h8G^QhLxgHL+qp$n38x8OKiQm@1B4 zt|-XdUP1|8!I>`uWqAp@@}gaGtUA2%Oh0anr@ms>1c08EH)b3=W^R3i!$&_L3H-$F zQhi9gEzV%%|KkfJz|Z6E{1FfS1xLW}EPFQ|=RBGRa3^kMz~U;BxeM{_PeXPbP6cq1 zYN46piGgPRdX_R4^bR!bVuENp1I*FPcCOOx@{Q!$$%LhEi2(zw|bI9HPOuk_&D=|K8h{#Ok*6z z*X#-GWjmjh23N39<#&wi-wqSqgH?4umeeB_Kn>{Gdxwq3@ovJxvwAtA!mW9CWUTE0 zIe>1dPWAIO?q(H$lf=+bRg~!D91~|nVWO|Hc$b~iWHmMAIo0A2pQ7|lS?s@SrqL)< zFe|{UhMf!k_Gn~4Tl6m-jSQgExlIs51H@X`xvn5Rt{!=Y|E{&R zER}DIbTcx;$}w}I=XtcDI@8X1ivFgmT{C)h@p(39#|y3r4zOo+FfPtlVwD3Y%f3t^ z44^enLlTc;&ppOxEzT-@jHaaf(bcyh%dV#Iav@&*NqlyDSo`3m32AVEhJGgRt63|N zO)GB_gBDxFf<{^r)p0 z^?1}9Vbv}4Kqn53wWrZ2Q-Cv3L)EIie^_q9^%$dH*Mr7h;A`>-t3!RV6NYAk|79#a zCv(@`2n*eUM*O{x^S<2_6P%u<6S3aM=KF%e%eN$;U!$`>u~-!^v^S*hX{tz^WDTvS zws@zbrf8>)qtmSAdE4#P#YrBDFH>#xdAl1bvqsAEcPcrLTh6)MjWBejkP@{pGwd3L z&9?&`yrwX9)2fn;m_+16>i>RtJ(454k`1D~e=Ai$d3knhJ)W|e>np;&j>Zvg|k?03HI+GCb>Y zjxsJS&WMQztjUGxF{w z+T2NbW8oewxjpSIWe)naXOu0)(^!g*mWG19w#NJsrL4@<(UKofG-b~k)WxTnt+L0l zDnDVV`!^0&eNjC5#5bvb*FSA|YihRh6$T!jp~d#GiRrEfY1H~XL& z+z=X)I>dzcJXR>lw!+9#^M+xIyqHNMu@8Fth_yY2$LlH9MAA1CF5C^DD0$;<0O}w> zEgebmw?Wk^h-Q~yn$A}M$_Ns=)x-uiBgF#h9b*<{3Wus^B0oxCj|RZ3rW#HTVJ}vTUEGqw5E86rKV_yv%VyOBrIjFy}8t;Q#bXpQ@X3J zJZ)SQV2U%MdpIDow<2eAPetyQ{;Iq!8Z>rmN%pq3ih=}vW$qROyFPjVKIeqT+G_IR z)aY%Tj96V&-nN07!ky!_CCPnl4f)=VwzA#rO~qbWV}78uHhWQ4pDSXjgF|$gh4i*J z=6V&)xqb>l)AIU^#V%9TH5?W3HZtQ&k6-(xmq7+`CZij6o|rPc%vR9nX{~*B3aie? zMNOZ@-GJ~m2;_Hs*4M()m(jR%76Y+j=zs;c6&y5h{Z`ts~J zT}f8#KuKn_raU`F#@d8#-rG}Mva5@A3d#;y)rg|C%u-*LGKYSjZ755|!APBJsY;#V z9P)syKGWacm~G`ipvkt{)LBJy=CMN~&5vP4e#%lxp_{*O`?ViBC$w)u1}`JAo||F^ zH2VV|1$d9(8X>z3ck`Ltj12oN(&N|c*glV>`eeEs50HyYBHc#me^w*$sz%K6EE@ZF z5}Pd!<$7|BRoHyttPl&ETIdNTmeY406p#+y{Fg&)-4Tn=ncT*(?}`N6YhlzV02jv= zq(n4c8pV(TKn;7ecOW-kIXD{^p(ih4?(j0$`sxY( zh+p#YZFRdA=#Q9cDBU>)uxIN^ z5*8XNQaPkEYahV#Ydh*j+ZqabkqV=nhuJ2RH54^B)s)oYgf!LW>pGN;9X-9qdZoO! zo#WSF;!oiH~?x#@1El6o~3=f!+ZXL0=TF`NlLkAC(5=>8G2q8&!AfIzaCN8CAv z+`tZ8gJg?<9Kx~rLLs2wNdV2Q_?t<9{+9w-urxGFgwX;jK0MCCGp;AWi6wK72drsq z04f}{DXNAo*mq+xJ&iIW$PYIyjdP3#9Yp^fjjePtOnnmIJOh1vHWt;nOvGHk1#>xi z`Z_-c=WH9tj_a!`&FEm?*ce5e0J_{?Te@qwB7gf3#~sVrVclF;vSYZh zEPlSZB4M!=ecwXJ>eCKtItnlBA8LAPTug8~Sr_c;_+reW`hd^q4M6%QE>z)cJVX!p zJ+z9_3ZT7({NzS1@M~f4Yk2(%iYVvv^QR&u4o5prv2fAKtqBmf;&znc8l~fs?4YS@ zBT4jX7(D_q5GR!d!|==bEdNz7OMvDObgus8L!t(he3+vG zrfy=qNHu6~>mv&vr+PIBp!cAq568wk5;i}Y%HXlEI|p+bPDY=fh2MG+p#BXlj$+*v z&Ibdc9H7J3_4|PT3xF)n0sp}v7~83OhmO2QP5ROc<&9}aH&rC;Az9pm1G1ZG>OCzr zS$pKo#SXo(qseGex6q@kY-=j*;zTWHePx!nu_nI{w#Cm*TWoJBol&<}&vH1Xua4>? zEvmGvrZ{RVb6V?bi#r;4FXikG)_949*9Wh$*zR*kXz9V=H`51apGx*lf9pa_x3L)LqOI=D@Ujs3Kj=BB+=6c0yAoPhs&DlL=eA!RO^nD4%Ba(B<|;(QS* zTu-9WU+4GIou>Jk``>Zc{r7H-CJGf0krO4Zz^P_>pewl-!~m1W8~gWFSGlrVt~_HqvQL`z-nq>w1QcY$uc*`}J@ z$-1fnZ9`4oU`s>MIA@L9X);1?BztO05*#d8^plh>z|6b3koFM=+iFveRkh_@Xwa2j z*Wcgp08IL4K=&0}qQtk#XB3#;rMUD8fPI!ttWV<-Jp|bAp%Qu%71e72?iJ|l3%P$T zfIWksM>i{v9<$=#JJd4(*k<#pySbHd>Om#DOtQErk^t^z@hypbS%t;90&N}w2`sHE z@J>pA{x`+k-u~rtdwWCKDjzYoyMN8>?!Jx82yVvfOhW5sa4f}7EZyET$P#WC+Jv1q zg!~X0x{tB@2^!RAsW9$kvC82jJx4hL`jgPkXW)MP$~)6}1+K~sf%)FMC+4~zCF_5l zBEwsF(w|~weM`pv7bMDeI0j-;{9O;_Vt{@B$Vl_;F!n{V`t&2(>N0n?HRMnx&-Kx% z=cT37!CB$`G~16?6vTH|6~*f+ixOL_N>eM_TFOh+n&t{+dwm^EMT3lac^j&8yseEz zeq~FkkCV8>G0jevusa*d68r#q3hQuhOJ%}Aq{b17maMZ)hVpBB`)ckV9&LLbN$@U1 z3g57W^;?P@UjWDt0JJD`|H+QjaQaDly@q?~1;2wWtT*5tUrGLPA^P|nKA+QYg-(DF z#NLg)Sanmh0oY;hesT&8Ag;$HDnxIm;ec%Cf{!NFAvq%5I8XpQ7+^2;ZT#CYAOU*W z+}^(6*~PvU47^6NX?`7mj%AO>4$f6c;g6ZcuDU`JnCc-w4MWRWB&Z`B@8vO|R=63# zpTt+4U zu*_i{9*{StpWfeBcgx^V)_6S^cB!C-;rE)AKCf&xIct8CTj#1_zNGIy80* z7jOlj%_WlASr>_ zv5b2s;7kQvS?IkYl9&pBUC+Wt8BC-b=8r>IaY4KzBs%EmSv2EbO1nq!M?Q{n_~}?z z7g46Y5}@87iVVn+2eApCq{{ZPH^5NsY}Z$S{6_%&9l-wppuagW)%g}@hQH0f|2Es0 zUbER14|f?V&rr+q56BxbXIrXL0_bZWNt_Fd&x0#6QCqxyhQ~8>!%efTX&T33ib2)@ z=W%;gZ6z+Xyv(g=DR6N?c-V^SX{bn?kk_Zpt7JLH4-PckJ~rO^2xn_QMG2cEPxG36 zLi;{?_8VNBzc_qIqk!QvrcmBN2E0Vez%$sCkGuVx1U6~7lZxR@E{Z0w?4`(u3&-gf z=UeM!S_Y0|@c3{}Ls)A_%A7|f9VV8KH>Ilms|6~m__zrUvKTzUB-$FI`w7e z7_}v*88s!R={3b?(qnP9QCE5na^W0iaFaT>M=jg$v zlaokS@mUrC-gN(5cRWW`Zzkt}osDbVu(Q~XBmj;4paAyo@|`6>V+#q_BbW#$gsHzC zOD`JlGY)2jsr9?idKp-5MI=3y*iTJ_nuM^6#LaQ*TipWP`b_H*55~h^#qS!bfKG_lLFNGk4S#r6`+EdzJL+`2@UxJ+WI?uTuRKE zrIT45F4YoaTP(6aSZwkKx&Hu#h=o<-}Wm znVo)5V{tx$<$13tX~U`%kUFpC;=7c%h)%e3Xhb>{sd6008z0BF)&YtpGsq7Yj?fT5 z*5Dj9(l=egMx_k;GZFyu7QX=VlxZy>j)XkIVESMu+W9}wuOR{YCvSSW@TGA-A^`Gg zO0Mg0DK@f-cQXZ(cslFS0CYB9Yzc`^4ZdnCqxf3bsBh4!uuv-Z!qn5)d5eI2|57qE z&eyJ4eg?}_E*^DsTxGUvt{-=5Z>J;gAxhxS(ntKd1Ap2<#SJ!pm-`=a`yHVEk^bKw zna=o&2XF)YA7ISyNL0TjLHmrK6;8(0kiQoe&_X+x3A{E?=rEK75Q)$7Tzf&kH;dtj^Xn;h=f@fwzhi!^QhUX zG%%alM%llTgfbr%PG(8WHrjYe1dZ#E7m)xOXM+(ruYS4Br~Qvg4GGX9IP+tp6fd%Ezw*x(~?yzs5HF z#u?CkORJ<{&F=x<_b#taELH!`V%K~N1AfcJ@C`i`gzg(y^&3F_35A_^=qP*_pnVGa z{Q&EK2MdeYMiJlJJgV;;ScNWrAFRx+{yXFYp15FVY&kClAGhWse&-uB>A%ccvlqB9 z{zQT3sfiim{oZNAZ2<5(lEL4gt1qU+eI6IvnG}jnW&q+uGhl{=4=~ue0H^~No6<@# zr5h_xX|=2Cs4f;W;gg1My&dpwhKbixj9SG-6V8Pg!klI>3FChjm?c1qJ!yxkQ=MVN zN|KT_u+j!xix?_a+W=i6$zD2^l_&<3!$^(%@f0M7V(ZTs;ReuC4BXDqa=M4jnTIpV zbzI+=;uLzS&*im?ktx^U(cX?6c>tDum_dO@nZor#V;q@hR*^WX7X7KX*;c z8n5?Hk>vXImtrygiiG(L3MZ#fFgZ?C0nJvxOwTwMs*k=88y8V8p(P1yh78L1_p;H> z3CM{pfI5l`Vhw;^3B!l-TrkZ2pSdDe0<;Lx&4q3ZCc=pbm~Sn5F^Y&Kw!h9Bq|lFc$CaDd72!wDfhP9@_%53pYbaBf7t+{w0~ zyI`r`11#JR_P=>`FT&QZ0Du=o@xsh#6HNRDw{LO6);q|Vcg^F9_gNkA0RJv>Y2)IrqNgQ?pG|@^wtA2n;&XKi-F&F)F$7QgzhXVE z1ZWY$|3uq`lI)1B@e#1|I*KBjc#e$RwA~A+VYWP+dUOq0`T8YL zPj_w>-YL@=DfqtGNf)!=gp{LmY{a|L~|&^#u2yrYiXy zVE!Za;R}HGB@5sl7tGAOA{zEjTx2gI1^&zi{dephrm~qt=jUG<=lvvP&jOrh#Ywmn zM{rs+k5azI3DG^kdw-9X=NrR#C(g*d$e=s17jNcgZa^|zCsugTV09U?;auK-DotF+ z0oWq|?|vaOa4~%36jr88`UxFvxN`jaI*L<;==O9hz8#Q3ELP|S^!XaGBA4GKw!!{) zI2sb5VGuDLA*RH`hzNYvHDu-+ScMQxK_t#U*R_*`DV3~07jRc#ku_o0b)Y4ChOCN_ z{xP{7sp02Dt!Ws020!*lY^)PVBF`l;yZ|sk$Cc z_1Jv30H{0B+rOu*elMqTJv8c2Jxuxe5g74tfczxC<2e#Jb}*~|2xC5jw0M@}>Loz? zI(qzN;(7Ewj*8|9!1V{D!b9ll2RUuvKJMSi(5hI`MI*lc1_1V3F9i|z#^-JiCO@v8b7)R8*g+FrXB>;0DFFDOnDf|zR^Jsc z_a!82G~?^9FuSzZ(r|SJ>m4pdPW+0p_OJMMxByvoI@0G@(QQa4;v&aLPvYn}=s+Ce zf;Hmg$noQA%`R05?4AKTC-CoWMl)}MiN)fW2#QBbr&)Rbdn{hAd4BD)XPr4`WMDCInxw9?gprplZ4d z=ZO9t{HX9XDU$oe3NoJ&*xl+J&c3${Gk*}$rk_4}bL<^hzu?mnz0c*KcNQrhqLv`1 z-x5)3W`qwM7@Yd!8Kz)Ca?c-JJS0(Wq{FO{P`I=fRSUX z7V)&5lvYGdi-bxTKvx!cwikFJ#Q3{DP`a^T62>IzH5#pBK%!72xaF(HEIrQU-@z79@P1>RPbg824Tv+$W zW7N0A76xLZHe!b#<(zok1|U0Y1mwC{i?ryPZwrem{fX7geW!ulPi5`mmvM+7faF_sPyH@)Y{ZUTEgPr z_%t~$S_sSN8MToPGF11$p(kpiW7TKt6ls|Pg>#w{k3^uaPc841*#eyu-nF@AhqaQ9 zv!iAVtuw7dL8s%_Hb4~@rDnw_We!HtR!xbfXbKQ5R|};vB$F%O<@r~fwb`hC4y(Dv zy4eO1F^;e3j8A{hugU^T88c&)EID2ct}hr~Irk&nrj!t>@ukWvs$wS@wEBB}qqAC0 z2Rsyr5dA~oZ}%MEGGmYCmRZCN-AV%Iq<^S3;x{D&>h_P3Ji7Nw&TyPxO|^F$gEY|C^sma?;{28<{3C2cWff>b7r&=XpGUr;zncHuczKBCC3xd8 zY<wY)qf`>&7zP%PUXje@p7dUOq2USXWkCfo*kP@1`nNiregy$L%w5;mTb_i|pA<0>6 z40r(Z;DO~p-ilefF9%-l@-(N-Og+&ZNN@=VGt(xB z5XZC*6{%$zxd1w>irnni3IauN$x5bLH`VV7V8xW5qku)DG}T}3jD?xVb~)Fv?M=+q z0Ww36HKoFLs|d2wh_2F`wgfpD2KQLhy2%`5tH^hJX2D*DMptwnSa<{%!u3DZx$S*4 z{)qe87SCJB zl?_azm7m}rCp}$sq}CP7KIWP>8N@C$HH$c7Z4!@!bY(8@i)Y3#XSi4$@;>V>vR}hz@z^>5?rc36Xd7oFJfmcq7QeIeSa-r z*G4t6r&d7n6%Bqd<7eYlZ)SozUSoLM>5$Ip@#@g8VZS-_vuVA)kGjE4y#{oFVHh9h z1uOPe_L{dwPv!w(pv521KW$#Z;7Q2pPSV0|f@qT~D$H~1zMp5zdTwHyJbMaRNhU-^ zdgB96V5Xj%AhcD;Ua2gl)b;G>7||fB@17||3g}=&ATweCZ~ZP(eah7A>yNJ6K&1E7 z(?Su``RxF!M_*!r`DDhI(olbCcT|OAn6NF+q?I<{DPj`n@2n=*LCEFP<^^#Q0*d)e!4km$% z#E4+1M96y`w&7{{Z<|>XB$jNG&Q?jhu#@R~vvkKNUJZECt+$z-jEwu2tnMDjoNf$K z=5M8XoCSPiI zc1*lp37u)aTapi)g}eE)b~*KnMInWr;AxKfafO zOq=!dNItlWmP8+Ts-S1(j{AxLpiJI-YO0jxJ3Kkr3nht(XX$gI*zWh--d4*zrk#y9 zJE%%Q6B8}#Y4Cm z!F#?dX_r_>N<14{E<)?DEXg9MoUrdw^K%V0i=pkHIpK}+SHCs?9f^F6}N5`o8jnG342 zHyy*D#w@TD!;r0{g+`yTTjV+VpuNEy0tirX!vmpCp{%BzuO`SIfNBmExvKqZC3tD z;*1n};JZCIPTz8#jQMD~&CRz$WF)a-dT`rWLPVR4;)EPbG-$^t3ddc6+mw)YNhX7W zFJ(abIE%yTU3*y?v+n#LZ$%_>RdpW5@Vpp+s$XL}CMoOm<2RWWt^Ze>pwQ!tpGv0eMN%SV)lOg8)8o5He$wOQKO5%bIc6WCS$R9GcR0yns0 zg%H&3rwh^bgm5LTurB`-Vaw3cuIYd>@KfSHT-%4=HwCdghyqToy##tiSNOu1eb}V%#+m#N%u;`P*Atp=$cw)*<0;+) ze8e%ECakA@v{CLHovimw(oO6@E-*)&$boajiq&8mOR0_G1LtbNld^V-t3d|ePYSV0 z=f`b2>;W>?qYsv4ubzHpIq|ILD@AdT{MzRu*G8}4gHsL<+Z6!`(18#ypqavk4_5KJ z!j{}jDr@GTsWrP}Jfe`ieQ(+yA)5fgcdbHBmxYl9uu3$kG2v z)P>t#_4roi*aR|1q#!gYvGQxHT>$J z1^%RkeFCnOA+%l_d88q!n(<>GD&5&Ujr&xc=AE54-xoy*o%{=zGRl=qlqbUE_ierr+IEzTSM(zE*pWZW4P)WjnJStlpXJYv>1QlOo{$^0FiOL^g{Q(U%n7|M2% zB4xsv0(Pi}M>dNq4j;Aea&lfb%J*N{MG*}|+A-vTi^P-3eC07j7vtOI4|(@oxxSh! zY|I%+Rg|lgEE8>E#s0~u&Ox}R!i$RTW-L`B2-3{0Sz6R|t5x1;iUWsb0r<1*IZ(#F zP1sjzad+C~XlDZSMd~kFkgU7YYw$i>(+&q#>42IbbF_c?HGgp#ufAl{RV7DJ_jiF< z6sTBQZm|0OAm@(n{=|p!y#B%)n0pyTP8$}9$Ikio*x)j+^lU^zKO?5VZ#4&#bSWKC z9e?Xm2AlwLsqHb(H)|On52~Igf_FPc%^sb@9}X7kJ7(8wOPiDIw7+V+lH*fyk7Tp+b$HeH~|fuB_4&}qw9N2#6-!(!z!~ynY9Um z@fgpgh4x&>7sr7ayh}RlFrUtFcK;aBB31_es-Y2n@TgXMO(`@?%IQ?x3}(rrMNTUu z&H{tFNpF=o9;DV6+{dM|EgIVBgLXP$T6L5kdgaM^R!*V8iwUhE0kydZ?l6?S%Y0UTfNA z?s43$v^CK3__e;J0tHEs6NelcdsdPJ^^q&h1{D7%BAEQy#>{T~SF|@L<{ERbkK3F7 zH|SsSKY;%MF>msJ!T*5%AM-y<%oh9`#{bRy54isi{6W=3|BIO1V1Rj9m|C0E8oR~+ E7k?eLF#rGn literal 15608 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 UxgHMxC7J=!;tFE5B1R$q2ebor>;M1& diff --git a/data/core/images/terrain/water/waves-convex-A05.png b/data/core/images/terrain/water/waves-convex-A05.png index 66930992611f67e9fda4b77ca7bc90a27d5026a7..9571fbafdbc1f4fde0286a3061eab086f1da0a14 100644 GIT binary patch literal 37616 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 literal 15534 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 S;Ggdcpe+CPb*-#f$o~Ot08PsP diff --git a/data/core/images/terrain/water/waves-convex-A10.png b/data/core/images/terrain/water/waves-convex-A10.png index a113b4dca864a4063d1ea290fea788bcab140be8..b0850347509180d300434afaca53cd2bfd698ea4 100644 GIT binary patch literal 36255 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 SFXL1IcC#|GCEPM4pZ^aQQ(jE~ literal 13139 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 aO7Bx6ItM)L?+>vIK<1l*M3tCf;C}(jdZ+II diff --git a/data/core/images/terrain/water/waves-convex-A11.png b/data/core/images/terrain/water/waves-convex-A11.png index 9bce02335ffd7cc9c98b4f1324b0146fb22d3d88..a36e86400c1c4da32c507e6af362d6099e09802a 100644 GIT binary patch literal 36041 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 Q1Hf3u`ex(`l1ud80hv5hYXATM literal 12839 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

P$OS|F^ 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 diff --git a/data/core/images/terrain/water/waves-convex-A12.png b/data/core/images/terrain/water/waves-convex-A12.png index 543d2646001b5f3d619f520455677f89656d3419..6b71244dd25d01b37e0a4b29adbc032ee942300a 100644 GIT binary patch literal 35562 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

sr_~|VMmm#*#P+T5z=Q!yE`jSS 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∓|7+9c^;23UyH*YFD~?Y{r=K;z~uMqOv=`c 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


cMI>u8(q5b7=!U@r$6 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

~i^J4mP< zBzouR3~~JHT%CiwJ{S&xL*cq$pnlpw{j`DlX#@4s2I{8`)K42IyXewS8>pW)P(N*; ze%e6&w1N6*1NF@Y>YEMJH`__ytXki!THmZ%->h2StXki!THmZ%->h2StXki!THmZ% z->h2StXc)}G<~ybeY0wPvub^_YJIcn(pO+AOoQq07kCwBz|3IB($~zneBJ9=@CLl; zd8KbTz71wA>z!5WoyGLdVtQvWy|b9!SxoONrgs+8J1f^aE7v7T{)&tm##G5xcc{#i`_ET(@J(?5&ppT+dgVk)6K>z~E+&tm## zG5xcc{#i`_ET(@J(?5&ppT+dgV)|z>{j*B7jXJfBI<<{DwT(KpjXJfBI<<{DwT(Kp zjXJfBI<<{DwT(KpjXJfBI<<{DwT(KpjXJfBx-x46%h;o`QeczHqIx}auWVb`4!!`} z!@%GRp4qyGp4lm?wmXPDV7;?%>YW{|cebnESz*@SMS5q4m+@CByPuQ|2@dky z)?HM14=Ov-d&heA`iYJw!7vyOC&Q^=4`DsEZauYbJ+*E8r)`)nfW;F@3d|zFJIQEvBy)(^re>tHt!y zV)|+^eYKdrTDQJhx4v4pzFN1wTDQJhx4v4pzFN1wTDQJhx4v4pzFN1w+Noup*`lvj zqpwz@uU4b4R-><0qpwz@uU4b4R-><0Q}!qDoCCF}gj!TWEh?cFl~9XHs6}0)7L`zo zN~lF8)S?nV{aMJ3dt z5^7NiwWx$zR6;E(p%#@;i%O_PCDfu4YEcQbsDxTnLM-nCx6YrT5cdiAdL>Rs#AyVk3Btyk|_ zuimv@y=%RC*LwA?_3B;g)w|Z~&kfa2o3EcXUq5ZWe%gHfwE6mJ^Yzo_>!;1vPn)lw zHeWw&zJA(#{j~Y|Y4i2d=If`;*H4?TpEh4VZN7fmeEqcf`f2m^)8^}^&DT$xub(zw zKW&+Q+A{sLW%_B$^wXB9>ThxNx48OST>UMs{uWn%i>trI)!*XkZ*ldvxcXaMKdnkX z?WCwxe9>QcCW%#ip6^lRX){&&YE}AbRr+dGo;FjZuU6%0GgY28Q{|}&Rr+dG`f64B zYE_;#Q{`zhRr+ah{j|7#T3kOZuAdgyPmAlP#r4zT`e||fw77m+Tt6+YpBC3oi|ePw z_0!_|X>t9uxPDqZ`ls+?J+(!8YK!#L7U`)i(oZIPbZB0aT5dTNXG)E4Qf zEz(n4q^Gt>Pi>K&+9Ex*MS5zB^wbvVsV&k|TcoG9NKb8%p4uYy$Aq5R&U$J)>#6Om zr?zwSV?DAtFi(AP0hD{a5Ej8=SOQC787zlS!X^4^-TG@a(L}JFx@AJ$GNEpnP`6B| zTPF0^V)|<_{k53>T1`I1Ii6hllUWEZ>(|zAv+!7kt-yM}s}^ zWR?{&%L&;Z%Pg-CuC&M7Rl#>< zm*16LE|Fa>kzFp4T`rMb&X!%ymR-)4T`rMbzAw96BD;*qE@QIGnCvnpyR491E|y&` zmR&BET`rbgE|y&`mR&BET`rbgE|y&`mR*+1F3V+?^JSOIgNI~*56c=KQDZJV=c?Q| zFC>qp{%yIxKMCKHaW0i{&X;j6lW~3&RH;iRjAhbFCeeVbbD^wrnXGexy*Ud{i7q^K zVTtT>w(PU8x@o@bvt0H$TlV?3>@z0&{K%e88)cx&WT3msKo=MB;}y{7em=Lq*F((gyg?29Mt}cWP5mY{^_#8FzeQGRjC(tdxAm^7>iU1U zyZ87=>-zrtlZACROS@GIRj7i;y~TRKiXtH3k%MQ7sAxeEs9I4uSP!UJTMr289m`Lx zwBljKLtF81|4@NhB+PC$$z-@DlMJ)OtjlgT!(21h%r#t@&1CCL=6+5#=+ z@B9AaO_C*ZNHW*;dVgNmcdpB%I>jyS9B>WOfon~!*ZJBtOjnOY2Bz1v>2++tdns2} zir(YM-HZa-pMX75{wt>kuaI|v2>Gnv|ZLsDdQ`>pMe6QdmeBuKWI; z3G(|U+8^}NCf_?uz8RD6R+DeWFp-ztV#OLLs%Kp^q6US>X4)5829}c|KBue zvJMV;yxTp&$0z!@$-g->gb91tgng$8`wkQK9VYC+gnhROJ8i<=X2MRJu+t{&ve&St*#>{r*kc)28id({|3ZoilCcOxw9b4y+!|nYeQ%?%W|Y&pGn3E)9v@ zr?U*1xW`T0<5myvFm;cbx<^diBc|@0srwF7_Z_D0oYlhllDVooqyZl{3eI_w=X;}@C6k2Q@KOydR9c)>JYFpU>X z0$IF7)}Etu($!E_S}S zxAy|ZAz&N=#vx!F0>&X=90JB6U>pL*Az&N=#vx!F0>&X=9Ip3Xua~h7FI|^SJ#F2D z_m|~U-&!~6^C{VpI+=-h?7A7Bx2@m#eOE`;F&K$}kq8)xfRP9oiGYy^7>R(9cnu>F zFcJYH5ik+~BM~qX0V5GG5&4+-i^mT>&wJ@!*vl~(IR+!gVB{E#9D|W#Fmen=j={(=7&!(b$6(|b zj2wfJV=!_IMvlQqGZ<+GBh6r>8H_Z8k!CQ`3`Uy4NHZ8|1|!X2q#2AfgOO%1&Sfyt z3`Uy4NHZ8|1|!X2q#2AfgOO%1(hNqL!ALV0X$B+BV5Aw0G=q_5FwzW0n!!jj7-pc)kz+7^#$e8tjKvsZF~(SoF&1Nt#Ta8T z##oH0!R z7-cc?EJmKi$g>!E79-DMw0*^^=RWQ08#VNXWblM(i0ggqHy zPe$025%y$+JsDw7M%a@P_GE-T8DURG*pm_VWQ08#VNXWblM(i0ggqHyPe$025%y$+ zJsD?Dp2wbyvnRvs$vAs5&Yq03C*$nNID0bAo{Y06ed*T`=a+Q2QJ}4iOtL1O3 ze)?PasC-P!o9xLLdosqJjIk$U?8z8=GRB^au_t5f$ryVw#-5C^Cu8i%7<)3tp4`fw z46`T0?8z{DGR&R~vnRvs$uN5|%$^LhC&TQ?Fnco0o(!`m!|cg0dos+P46`T0?8z{D zGR&R~vnRvs$uN5|yy5?Hb)#FEs@qaWGbl$hC`U6WM{l^34bgj9l-!1`OwKkLVZBCW z%)gCGRwg7TcT3>=^D^o8TJW{)hE4fBHYH$F0yZUJQvx<6U{lg;N}5ecvngpdCC#Rc zu_tdy9Q60=fbR!YoDiCHNzDR;9?Q6j_xFtCC?=GOS9GRoTX>6j_yV zR%M)38D~|-S(Os2GR3M)u_{xn$`q?I#i~rPDpRSym5<8DxR;9qI^pE2gSd}qWWsz0Mu`2hh9?K6{l_INhH>%nPOEktV)Je30RdptCC?=?qF3WSe4OLt5RfDj$%~`t5&7RsuWn28CIppsuWq3 zBC9gv_Rwc)(Rf?=ikyYs*=P$ABvNZ4kCgp=H%O^Y+L}pZ$ z7?pchj7r&kRNPnS{+s^&0dZ!kRhv>=wJA$%N}EmjIGa*jT_^BSHl@g>Os(3K!`T$) zvsrm>ZiY$O#-!|LQi@EN$Ia4 zxSL5CWl}Os$~GotJCicOq)ad=V@%53Ov+uWCS`ba4Z#$X5-=%COv)0I(qBsuFe!I4 zDN{_!Uoa_COiGbS$*jrBg!{0kVp67=lpK?CH%V_P6Xwz@99v ztYfe?h&>r&PcrPuU27lT8)Z*Q>`7^LEyEMolM;JUVoyr!Nr^ovu_s0LQ|xq&%BRc?FYl*s4i+{OTHzqgGAI>zI`1SOZdIQVLAU2~5i4 zn3NNklp>RIB9n47lk#FFrO2cdnUo@vQe;x5n3N)uQe;w!OiGbSDKaTVCZ))v6q%GF zlQPAm6q%F^lagUlGE7Q_Ny#uN873veq-2Q%uSflQPAmOfe}_Ov)6KGR34!F)33_ z$`q3_#iUFzDN{_!6q7Q=q)ag>Q%uSflM*l~0h1CiDFKrbFew3(5-=$NlTu<*0wyJ3 zQUWF=U{V4mC16qlCM94}0wyJ3QUWF=U{da8QUWIBUM3~Sq~w^CfJxcGr0if)b}%VB zn3Nq%$_^%F2a~eMq%1Nii%iNQlQPSs%rYsnOv)^iGRvgQGAXl6$}E#I%cRUQDYHz< zER!DPv5^7?U!_q>M2sV@%2zlQPDnj4>%=OiGSP$uTK8CMCzDSIn3RA?37C|CNeP&gfJq6Mlz>SIn3RA?37C|CNeP&gfJw$|#dE z%A|}kDWgovD3dbEq>M5tqfE*ulQPPrj4~;sOv)&eGRmZkGAW}>$|#dE%A|}kDWgov zD3da}YEp_!%27Q-WKxPuN|8w^ zGATtSrMS8-rO2e*&7=%6Da8#niKH$KF-tHh873veq-2j& zf7Sf68h=)c&uZ~QTKtd}KcvMEY4Jl^{E!wuq{R#WAuYb*7-+>Y&>=1U z`gL!T3w{3P-fOh@*J$zQt#j5Mjr>Lp{72gMRoeDd+V)ji^ar)kCpl&}t7*<^nzNeb ztfo1uY0hezvzq3tra7x=&T5*on&zygIlKNQ`G$N`z9rw5f0BQef06IV&GKFOo_t?^ zApcWtksr#B(A0YMI%8*D`bd?LfoKYM5CKGpk`{ zHO#Drnbk0}8fI3*%xaif4Ku4@W;M*LhM8UeGub8giPwjQnbk0}8fI3*%xaif4Ku4@ zW;M*LhM8U8L)nxJ$Qn6B4wbd?5XUIi$$A--4ZWtkJb=huNfYt$z?UUtR|P$9-tI1_G zxvVCa)#S38Tvn6I4!&6~l8faM`3rfAyj9*Ne<^R5OXVH%PO9- ztI1_GxvVCa)#S38Tvn6IYGgY#vYi^)PK|7*Mz&KU+o_T5)W~*fWIHvoof^RTs6CF_ zJ&xMrs6CF_J&xMrs6CF_ zJ&xMrs6CF_c6WY^+_B7Yp(_Cv$ z6WY^+_B7YptGs&UJsJ7b=j=`1Yftj}mAUpND*#-d&X%=g9y-pe{WP!kCwR3#VfCC+ zkML@Ls8{9hjdZBk0zc95nb*6Vl{;~7H+~6JmH#-l^w^GNthVYY9Cpu^Rr@Z6vk&Y#_Q`fq> z=XIR;DXv?0nw-yrU%;CZAe!sn0*2I(5w_ zdi(h5{uuzauGPDp0bt*{KS{lC-BaYL@-%t694F6^Kb2?73Gy5{QBIPR<+*Z-oGPcu z^W^#R0`Z3DbuW?^%jt54oGBN|o4KWnq?-EUb&+c)yvo%#&X!lpYvi@^Iyp}+>wRne z<#I*u&h=NyyXCLsJz_QH`m0hWuK$31u=lC;ACjx(!}7QCQTdpBTs|S6O+9k`-^umz zIr+SNA@xYJ<&(``ZL?Q93aeSIhgW&G~EH z>MwAs-})x?l#{I1J=woK zSKcL;$>s8H`=d&)rrFgryImUHE^Tg?eb2F)R!!5|rCrsutIgWgX6DJ<8r5cvYO_YQS)v@;f^DZst0~*c;w27KFQPU=B+C)u@sA&?Me4mHi8ra9E?-)fpeO>?Me4mHi8ra9C!hnnV4 z(;RA=LrrU_X$>{|!r!wme4>5fpnc(>ec$8l`yOk*ca8ntQ;@!f^fjcfA$<+$Ye-*1 z`Wn*L(7lH4HFU4pN7m52hVC_Vuc3Pl-D~JxL-!iG*U-I&?lp9;p?eLvYsg(g?wbAU zA0bi=k!pxkL!=ra)sSdcYAv!XAK{mbIYS9kcTe_gtLD_>=Nwa-^p$NA204_I|JV8z+MEB)))KAz*cSgz(~|5LL6 zDGmHZFL6w7-^%Lf16Pw;+OX5D4|VH3zPs(amwd-!>LLE6fBTgyD7$^z?b~kOUb!Ce z4+c(hJ*t!CbXOWY8z~PwkN#1@JN#Vxy(6C|b8kCWzQ6AKAMpJT`2HR4dCYD4*Fzui z9TRTT_I~{nJg<{H#>sNJXLI2B7gnDCr`_X#-&K3%epjAT>M-~7;7{5Am;IjQKF@NW zXSr{{Uf4SCrGZcT{4*=JzQ%tyc$6zW%DX+vyFJQPeq*D4W21g!+ui^7{Vjg%H!`~N zd_M0xzu-H+;5)zJ+0J^D{;Ki*dq4N59+Fz)F`ebkwV8JhoG7O|+m*A>AjBHiwtlwj zyq(}m+t1M_PIMKO(|eb=a`REH-26yaZa&(Tn~!qNg5PtC9}ZmT9L5*P#i?hzV)Gv! zdcAzk`Q?6QIvjLwBdJfj*Uvb6!3pL*>rp(LmEXeJ<5R!4_F1XlOKtF7TYc9feAh9) zYpd_N#djU}i@qjxnD2a;?|j(6&+VlWd#S`8s%4+JWS_WXpIAe(dg{r&s(oYLyj(Xg z*UiiI)N#G0Jz3qJtZq+Mwh@%Hd$PJcS>0Z&ZZB51lAviNLDNctrj-QE z)br&9;@ZDf5;UzOXr@k=GvrJ;OI{)`71u7dlAviNLDNctrj-OuD+!ub5;UzOXj)0o zw347{B|$UwT6vwEC$E<`$e+vk&X|3H=kZ3Lzez5XH@l+UMRKwHg}g=H>fhhy<6rvt zcDdB&?~r%OyWIXVxm>RB^_BkryM6vwK7Wtq_+ELRykD;J|6I%1s)L2phvaJcu>7@r zME*wpRz4~plaKq}PslZ{-FU6v`*l8k$`vP1@OnM)DqFJWuRD6)T=RNIZ{I4H`TTOZ zvR6lgx+CE68drsN1Uz;Ge8Ca$1xLUmv;RC&)Yn|=^Pygd7Q0VYp)6v1Eql3-0 znO^M3VAGMo=Gs8=GAX-zb(E?*8rXDXFMh}qeB9JqK&?7zC8(94R)SgyY9*+ZpjLuf z32G&%m7rFFS_x_;sFk2rf?5e`C8(94R)SgyY9*+ZpjLuf32G&%m7rFFS_xXU(5i*? zOIW{z^-Ea4g!M~Uzl8NmSYN~Xnif;nV(MB*oEsdB1MnubcJjX8pQZzi!sAoAv8v z{kmDdZq~1x_3P{ZS^h=7BR9);<$Lmd`GNdUek4DZTje%MyKblJm9M`;?)3Gr+$9;= zE~7Fgy8>V9WiP;V$^iRsOgAN(-EVlBSuX}jGB%ZH61Z(I%3px#Hi_rQPUBlrXxm8M~s?| z7&RR+YH|bf+`v3HFwYIla|83-z&tlF&kfYMfjT!(=LYJ$K%Ez;^8)q3hq{9D!^E}a z2VGl!(Cc^b2zf*=9&|O^!K36+@@P3)j*-X6W94!3MA;-ylBdX1<>~Sad8Ye0UY;e- zmJ{S8Ia!`7_J@P^hlBQq&RNuS&Z4Gs7BwA#iXDN99f67+eTp4@iXDB59es)&eTp4@ ziXDB52VW&;%Q^CDKg+rD8hNd}PR^6p%Nyj4@+P@Z`jg&8ad5Vyy2ziQd@C&Z_{`aEqIBK-usL_I>Mhk;qk{jjA@)h~2d`&jX*X1VphI~`L zCEphNCP$4H95q^S)M&v`qXkEe792HNaMWnQQKJP%jTRg=T5!~8!BL|HM~xO7HCk}g zXu(mV1xJk*95q@PbZz)S+lr$`%|ZLK!C|>eTw{K4tGH_T;C2}m*O?!5o%zA6xYoQQ zM$JL{Jx7e1ju1a{Y#L_jfbO$xqK@HZ#(sdN5>nKon@P4UEO(LmF zLtCrnXrhxCh}E5q=Tj zD+pgf_fd3jqI(nFo9Ny__YmDfbPv%zME4NgLv*jAdllWQ=pLebi0&b}hv*)ndx-8K zx`*fg-6M35&^4x)DuJwfyk(L+QJ5j{lo5YaTSqG%IEn<&~u(I$#EQM8GoO%!dSXcI-7DB48PCWo+@h@v5ihA0}MXo#XAiiRi}qG*VsA&Q158lq^3q9KZg zC>o+@h@v5ihA0}MXo#XAiiRi}qG*VsA&Q15T1L?_ik4BdjG|=}Eu&}|MMD$~Q8Yx+ z5Jf{24N){i(GH4sP_%=h9Te@LXa_|*DB3~M4vKbAw1c7@6z!mB2Sqz5+Ck9{igr-6 zgQ6W2?VxA}MLQ_kLD3G1c2Kl~q8$|NplAn0J1E*g(GH4sP_%=h9Te@LXa_|*DB3~M z4vKbAw1c7@6z!mB2Sqz5+Ck9{igr*mM9~mMLlg~BG(^!5MMD$~Q8Yx+5Jf{24N){i z(GW#L6b(@{M9~mMLlg~BG(^!5MMD$~Q8Yx+5Jf{2?VxA}MLQ_kLD3G1c2Kl~q8$|N zplAn0J182XXpEvUipD4!qiBqxF^a}08lz~0q7jNlC>o(?grX6OMkpGgXoR8>ibg0J zp=gAn5sF4A8lh-}q7jNlC>o(?grX6OMkpGgXoR8>ibg0Jp=gAn5sF4A8lh-}q7jNl zC>o(?grX6OMktz~Xo8{%iY6$UplE`k35q5tnxJTcq6vy7D4L*Xf}#nECMcSqXo8{% ziY6$UplE`k51{A+)?0L~x9D1L(Y4;9YrREx@Mp41_M+{)l;wV@N=-CRWNjjA6Iq+c znjmX}tO>Fv$eJK)f~*~64UsiO)(}}kWDSuuLDmFW6J$-0H9^+unhoaY-R9`s=IC80 zyB}ruqwGA&Hq6m`kv5ll3IaUUjQ2Eox*UfFIwRV~Xd9z#jJ7e_#%LR(ZH%@t+Qw)b zqiuq=3EC!To1kriwh7uMXq%vIg0>0TCTN?WZGyH5+9qh5plyP-3EC!To1kriwh7uM zXq%vIg0>0TCTN?WZGyH5+9qh5tj^NS|Kuzkqiu|~@jli?%V^#%Q~|I!iC3ZQU&0Vs8%Eq~|$~{(L#$sdlnB{rNgZ;~0%| zYu;c!zF4dZS#zn6m!a$Ba;5+OZuz&fb{Cnu$Xs8YwPR$iug=;rGA|!AYuAxELFNRR z6J$=1IYH(GnGa4wF*4|;(URs^C6O>L?XYB-~6O>L+Izj0K zrDK$iQ93?o*6yNoY}Vdw*4}N_-fh<2ZPwmx*4}N_-fh<2ZPwmx*4}N_-fh<2ZPwmx z*4}N_-fh<2ZPwmx*4}N_-fh<2ZPwmx*4}N_-fh<2ZPwmx*4}N_-fh<2ZPwmp*50KZ z?AH$VYX|$agZNp6%c%U9%U zvRS?^H_12ToANFBw)~U)v;2#EM{bty%J<~^@&oyy{78N*x5{mj)*!Zsxk7u0wTD=H zh_#1Udx*7%SbK=Ihgf@vwTD=Hh_#1Udx*7%SbK=Ihgf@vwTD=Hh_#1Udx*7%SbK=I zhgf@vwTD=Hh_#1Udx*7%SbK=Ihgf@vwTD=HNVJDUdq}j0M0-fIheUfww1-4{NVJDU zdq}j0M0-fIheUfww1-4{NVJFKx6I&8?V+hXG_{AO_R!QGn%YD2|3@=;tUbiqL##c- z+C!{8#M(owJ;d5WtUbiqL##c-+C!{8#M(owJ;d5WtUbiqL##c-+C!{8#M(owJ;d5W ztUbiqL;PPbgLk!uuJ+K?9=h5?S9|Dc4_)n{t37nJhpzU})gHRqLsxs~Y7brQp{qS~ zwTG_u(A6Hg+Cx`+=xPsL?V+nZbhU@B_R!THy4pimd+2HpUG1T(J#@8)uJ+K?9=h5? zS9|Dc4_)mc)*fQ*A=VyZ?IG44V(lT;9%Ahw)*fQ*A=VyZ?IG44V(lT;9%Ahw)*fQ* zA=VyZ?IG44V(npBdsseb24B_`mNkWCO<`G6Sk@GlHHBqOVOdjH))baCg}SCt*A(iS zLS0j+YYKHup+AGinnJ88#F|2^Da4vWtSQ8rLaZsonnJ88!~X#7e8XlMWp4It0}0u3P000Ipl&;SArAkY8;4It0}0u3P000Ipl z&;SArAkY8;4It0}0u3P000Ipl&;SArAkY8;4It0}0u3P000Ipl&;SArAkY8;4PdW% zJJtXq^LAw3j?CLN^LEX=T{Caj%-c2dc4Xd;%-fN9J2G!a=IzM59htWq8i2Ez$`!u8 zQjk>xh|Jqn^LEv|T{Ul4&D)WAJJ0}r*Yoa18bG80^xwm`Qwtb1bB|~NI|rWS7}T>J znK{e#BhPjm>>TfLb3U_y*JuOIn6Cviw15clBgBsozp+aE$SfY2#Ur!$f%DOR#A>>a zTU~dJMsTgqhjc)l9PvjGKQfC)X7QbfA0U2!_yOVvh#w$+fcOF82Z$daet`HZ=cPsb z81W;Nj~ws6$MODq%;W*u2WVe2lLu%YpnZV$0on&>-&m!6g!Yk{JTjB-K>G&jHBhgC zdJWWTpk4#@8mQMmy$0$vP_Kb{4b*F(UIXNQZWfqD(pYoJ~O^%|(xK)nd{BGijeuYr0E)N7z#1N9oefqD(pYoJ~O^%|(xK)nX) zHBhgCdJWWTpk4#@`s-dAsMkQf2I@6XuYr0E)N7z#1N9oH*Fe1n>NQX=K)nF<0@Mpo zFF?Hj^#arjP%l8e0QCaY3s5gWy#VzB)C*8AK)nF<_L`aZnwj^SnfIER_nMjanwj^S znPb$8Q7=Zl81-V*i%~B|y~xZQnVBOqb7W?Y%*>IQxn^drnVB8CmPgCca*RAi9xIQN zC(0&qgwD)dGc(uB%r!G}&CDE`nIkiEWM+=c%#oQnGBZbJ=E%$(nVBOqb7W?Y%*>IQ zIWjXxX6DGu9GRITGjn8Sj?B!FnK?2uM`q^8%p94SBQtYkW^SNf1N9oH*Fe1n>NQZW zfqD(pYoJ~O^%|(xK)nX)HBhgCdJWWTpk4#@8mQMmy$0$vP_Kb{4b*F(UIX6T$jls>nIkiEG5@y$JOp)QeCrLcIv}BGijeFG9Tt^&-@ZP%lEg z2=yY=i%>5@y#w!4aBgKY^G-AKPBZgPGxJU}^G-AKPDC7KrAN)qBZxSHh$DzNf`}uC zID&{Hh&Y0XBZxSHh&vH+CnD}d#GQz^6A^bJVuXkdL~I~p0}&gD*g(Vx5hFy55HUi; zXoZN|5HUi;2oWPhY#?F<5i5vTLBt9oRuHj*h@qJ{G!utr;tC>G5HXL4c|^=3VjdCm zh?qyjJR;^1F^`COM9d>%9uf11m`B7sBIXe>kBE6h%p+nR5%Y+cN5niL<`FTEh&dmK1b&T`JXJ`K+|Gds?UiZiHKLB$#>Hc+vFiWO80 zSLfgcD)x^#7tFy0bMXDER18t^epIZZVu*@qRBWJP0~PN_#XKtJQ8AB-c~s1!VjdOq zsF+8^JSyfrYo#Re)iP_coE4ODEPVgnT$sMtWo#{a|Pu@zLTpkf6T zE2vmO#R@7`P_crF6;!OCVg(f|s8~V83My7mv4V;fRIH$41r;l(SV6@KDppXjf{GPX zte|4$e{mM9qhcKu>!?^q#X2h1QL&DSbyTdQVqx&_#hL5}Z;*eGf0QrDjq+u2zDcuS z!7NxX3l_|R1+!qmELboL7R-VLvtYq2STG9~%z_28V8JX{FbfvUf(5f+!7NxX3l_|R z1+!qmELboL76yMTx5{mDyQF1{+@an4MDCPfxl6QRRIH(54HavsSVP4cD%Mc3hKe;* ztf68J6>F$iL&X{@)=;sAiZxUmHVY0j$wgEwqGAyhi>O#c#Ud&eQL%!G6;w>4Vj30G zsF+5@G%BW1F^!68R7|5{8WrzH#rsk5epI|474JvI`%$q!Cst6gf{GPXte|2A6>F$i zL&X{@)=;s(GB8}36AxZ>)t?i8lPPYZViOgc2btpk-ZSGKm=pV^_~1D)Ld6IbBUFq~ zG5RfY;=!i)!8x(HIw$_>s;mB-*gu2r3@Xl`;tVRzpyCWF&Y@ZUesE5_7ZLA8#MQG~njL@LnJrmCL~J7B!E@pa zBF2dL-?>8R;5qTv+0iBte&&LQF)B90(p|C*jTM9d*#4iR&Rm_x)IBIXb=hln{u%pu|oBF-S<3?j}T z;tV3rAYy+`{B`E^*UgE|)E_wOS=VvZmUl@!;GFBRJ@d+X_cfO|I}r=uEKH-$wiG*7 zHnVc9tUom$?TQ=Ea5l6jJLCKj&Wm=0Ti3mN_c1us9q@jbfm2c!4|qS!z-d07k$SH+ z*?(hA_P90K+pNhRunv2zGkG83yi-Sbl)WA$u`c^Z)@2v0%MPri{*blQA6mQB5vt3a zCG~RopnOQKmJiF{%17m6@^Se@>Il#581GLw-un|y^Ka`W zc$1Uvn!vjz@FpkSF(*)i$fp>L{{(0qo zx9e>Gastol8u#iM+jR)nA6%KLyQb={sk*E~^w)hg*Sz1?AN27T*R@_*#a-1Mnyc%* zw(AaE({xvF_+8IiwsM_oy`ju6cTLh=ePQ){PCoy2=W^QJE9(pWwO;)Ry2&edP0-W& zLRnu}HbF0&pqEY1%O>b$6ZEnPdf5cMY=T}kK`)!2mrc;iCg^1o^s)(h*#y08f?hU3 zFPos3P0-6G=w%c1vI%J`8TY^Dx09oCg`#Wx@>|jo1n`k=&}jAY=SPEpvxxcvI)9uf-ak&%O>cu z3A${8E}NjsCg`#Wx@>|jo1n`k=&}jAY=SQ73;*eJ;OGng(Te6WuUzJp%e-=#S1$9) zWnQ_=D|b!MT@!TI1l=`3cTLb;6LeQ!=;{kyeW9x_boGUVuD;OK7rOdFS6}Fwpt~mMt_iwpg6^82yC&$a3A$^7?wX*xCg`pSx@&^&nxMNT z=q9h+J*#uoSL6=R?WfOGS1YI^kmrc-R6Li@GT{c0NP0(c%blC)5HbIw7&}9>J z*#uoSK{t8jCa>J&m7BbBlUHu?%1vIm$tyQ`(fwaHL1*=atiEuszHqO;aId~_ufA}vzHqO;aIc=QT~FAqCv4Xf zw(AMo^@Qzu!gf7jyPmLJPjHr1E0tTlvI)6tLN1$-%O>RVZksF9Hjx!BRV!SoR=8Bx ze^~xjJ}MuRkIN?y%6sV^u&(LAd+E+jJ=r53=Mn$Jy&vV?AK~7Q^d7J^ zz3+Oiw|lPpFz%j#3!RtqBDvVLH_y~(F2R)p?=${_=Qitkod#s21 zO+3_Z;xxaBOPsgrA-11;Hv9|&*SqJR^}Cp#uBn4G+{3(kXxhtI$?5vM{WgXfug6lV~%EHj`*Gi8hmH zGl@1+)@I7y8@I+$-+os-$xnWvcf(z5azCN>5|7q@=ibu58=YCz8ZEEN&%4!yUX|bVs=V2=xY&FD2E0br`-}aazu0=u=${7O z)VtB&=1zZ`JN<2r@yh+USMJBWazEwow8L-s|MZMc_l%$GQTO+s@u6REZbmC2*zfDv z@9S~-8a#d`9$$jTFU8|4F!*Wyo~L2%S26dinEO@C{VL{Ofw^DA&MVE+Z@|S%aq&5r zc)Gv+A27PtJI47A$2PCWn-}BFrCty3u$6pg<+t>h)HA&e`fp3a>Ggj*ek+mo($fZd z>_Lw`=&=Vq_MqnoZ4XI%NZRw0_55T#B<&$-@4>B$gX;}^+N#bQt?Iln^@qKyonLv` zm8+Jm?(Asg9jiNcTiw~Rx-(dLm*i8Nx#y{_rt~yJTGV5!dTdpXt?IF%9vgZsg(+)|_1I94t?IFJURzZ?wyMX@>9KQq z?3^B3u#Fe=*n%EAm%7sbf49f@E1$o|%GCGD`{e!N9c(;U)zP6U|JC8X8eXTL@an$K ztNXfv=k-22@O(MF_Z{14|J{i9*hXh{*Mja^UDJOz;v4K$IWb#P-fGD`juKV%*{VKU z@E4lYXXo_Usy;i%g*CXa(wb}h`?WqFT6quqq%K?4Wvh-1HT?C8`f1e^v*@oFc#ZGS zRjZEj^xu0>@E4ubN2~hioIYCBMGICm-e^VRjaD??Xhq|VRy5wY?l^gd{HZ)sPLSuw ziE@&hEYFowh-7VqG!mNa+bVQUM4S> zSI8^HI&-TYJ61h*ta|KN_1IbeIyp}+>+QDcako{EEvp_|Rz0@XJHPV!_sDz2`NY;+ z`|>-z!|=1cJyt#LvFdS;RgZhDdfa2x;~x8iNj-g1PoK13n6zJ*v|pICUzpU>C-wA6 zJ$=$XVp30^)YB*R^hrH^Qcs_>&zQ8&n6%HBw9lBd&zQ8&nAFoJ_4G+SeNs=K)YB*R z^hrH^Qcs`M(hf}UQmWlq{MCvBONw#-Re=A`{lK~FE} z=>_|vg8flJPcPUf74-Cio?g(?3wnA%PcI;MK~FE}=>ep5Mx~gAS_3NsB9qQMiejV!9p?zbBe4&0F>er!u9qQMiejV!9p?)3e*P(tL>er!u z9qQLr{kp1OSM}?veqGhCtNL|Szpm=nRsFiEUsv_(s(xM7udDj?oPIs0U(e~+bN0P+ z`t_WCJ*QvK>DP1m^_+e^r(e(M*K_vG1^v39Ul;W2g8g(szb@EU7xe3beqGS73;K0I z+bQVR1^v39Ul;7h3;K0Izb@$41^v39Ul;W2f_`1luM7HhLBB5O2L=6lPQRYhujlOl z=k)72{d!Knp3|@A@L*2Ap3|@A^y^*NunQY@>DRmT>s|WwF8z9!e!WY--h~;}!Jo*T zGAwsVMz+c}*)HCPgDX`>fvS!IRUHMYIto-B^nM&ifvS!IRUHMYIto;E6sYPbP?gW> z@L3(6s)0uho~pr9HF&B9Pu0*%=k(G7MiunZf?itCOAC5w)sdU3BR5q?ZmN#lR8eEn z`4dj?e*BZ{F;8}O04y39#gTCw8FwE4R%*R$lt0ub{s>S0*yoRuN6Ta6aq@UMmH~P) z^Yawl>8Tpc)8y%L97>+#Jo2abf2Yc6@;rIIyg*(kFOnC_>2ijgDQC$`TSTltwDH-mNa{Z|Oa z&GRwwTB}{LZccmI$I0}2U98u|RyD+Htz=!hv)97E68=r&-#j1F!M}0*8^^zK{2Rx= zar_&{zj6E<$G>s>8^^zK{2Rx=ar_&{zj6E<$G>s>8^^zK{2Rx=ar_&{zj6E<$G>s> z8^^zK{2O2QcJH3QRNf))6#QEEb-78tA>Wj5$+zX7q}sa+FYj9a`i~A z)dW`)Tph*LQCuCx)lpm>#nn+<9mUmATph*LQCuCx)lpmxadi||M{#u&S4VMm6jw)a zbre@eadi||M{#u&S4VMm6jw)abre@eadi||M{#u?SLbnco_C6Qr`XDk*vgIA%8l5{ zjo8YK*vgIA%8l5{jo8YK*vgIA%8l5{jo8YK*vgIA%8gjh@2^Xo$G3TWo5#0#e4EF& zd3>A0w>f;9!?!tnyU&!g4&UbRZ4Te&@NEv?=Jfxy_%?@cbNDugZ*wN8-^aIke4EF& zd3>A4w|RV<$G3TWo5#0#e4EF&d3>A4w|RV<$G2&Go5r_ke4EC%X?&Z;w`qKv#vEHPL%u2Bl5dOc+VP!^<2xP4cRG&mbR6I5IKIYE=?%`b zv7si;wy~iu4RQW&+$`Z{2{%i)SsM77+3(Vo>G`R>^N{X5q&v^_w8`|e$@H|z^t8$J zw8`|e$@Fxh>FGq%(}^q7_R0S3xpIp0shldO$@Ap-@&b9GyhvUwr^^{~rko`&k(bKL zuDnKGE3cFOl>d4k-ynZ3=l9Mv!JUMHuSC6@SEm0Kd-&lbp=8 za$V~8(J+gKzs@`iFb@OF!@xo2;cn*PZsy?-6W%7Iyyf2+h%0-WOm!!skP8U8fRGCaxqy%h2)Tfe3kbP@ zkP8pK_w5&^!|$_C$Y0owpY#?`aseUx=b2eR$QAQ}kP8U8U`pI%N<0xIZ$ZhM5wicj zw@vog*Vtp9XODf}zcVCX_HSR2uSwsQeBH;sG5Lm%-;{63Z?Y%f_5Z#n-ee4+B?zobE4_zMAOfSrk@j6EKJ`2o0JD_%(Tz@M&=$LXXK|c zD?6ocX?FQ|pZK{=KbuTHn@m5OOh21UKbuTHn@m5OOh22@VgW4{&|(2C7SLh=Ef&yX z0WB8LVgW4{&|(2C7SLh=Ef&yX0WB8LVxez^Oi|~qn4tk5*GS(G9qQv+c}VXhQ`AYO zsFQwSjW+uH59GJmqZjpVw#UEO9{*;0{F_&7(o21OnY>(HA+MBI$=Py_^lj6*y-g;X zO(vR6E9U7uAN%&{4L-h6-Xs@F-$q^J;e0;0CP5x5eE|(278C`Bhmz&Y$W_0-qy4;K|H=AfKFwq>aU7zu}?ZHHIfr;h<6U_xC znhOx<|IP2edJ6*Gf!EeLcA0^PD=@y313%7o== zP!@r1-q5#;t=^`-VKlvM+R&CI+26Ybg>FHiTTtj06uQOqc4F#bD>GStzIt$$F`L+n z{?rWdvz7k;V0S-Y8Ta+O-7k7kzXRz!y!!@cS$U}Z(aITDcH-1+CZieq|A5V{G2Io% z?H8H%XS&yW?C&BI!F??EqJ7&vYj^qRssZbK57WKKbT6*k=S&)|X5$godOZd!ZvXGy z^RILJ1OI8af8^?K;$9B@_x(2R_xzXp)^OlL@1?$oJ9k9EbI*J3%bt7adH0VT9LLJ+ zx2-?RZ{-1P@!_26qa8)~6Snx_Z1H0>#WVa2k7O7csq<3Dr9R?ksHWcNhghSrP9u`mvKDiOOD5Ec0A@w zj>l|vJmw0%Jd4@dG{TwgPl4r{aa#HH*!IR~= za*CWPr^)l=`SOC))rY;P_e1ALw7>V$EjXHB!b~0G@ASu>!5@3HBRyLGjKJ4=l*c(+ z@JUM+2@#RWuMfb;FTzTN>B5Dh%5w{76r&Ml4vN2hLV^m z6EkIErcBI~iJ3AnQzjZpqM;-jN}{188cL#}BpOPhp(L6?OEYL`1})8?r5Us|gO+B{ z(hORfK}$1eX$CFLprskKG=r9A(9#TAnn6o5Xqhh}^F?I7XqzwE=8LxZqHVrtn=jht z3+L-~U6wuayU!QD_Uu>Ab9s_;hMwi9#5oL4|7@Jr(tDjRdz~-auRg^-spd?(-8~*y+-QOL)%jz#He_eNV;1X-D zn(q4nvHjTRb?x)&{;EImSN)0oUU$Pey@tnluOrd@qgW@|($3`<|^h+mkxpBg~{mOjy5Z zP5C|();<%~zJu13w{7EX+j!eH-nNamZR2g*c-uDKwvD%K<89k`+cw^|jkj&%ZQFR; zHr}?4w{7EX+j!eH-nNamZR2g*c-uDKwvD%K<89k`+cw^|jkj&%ZQFR;Hr_T_B_^m} zt_gSUTHAfwcHgqyFWcr9{3Xi+FYwoTk(_1weefK(7q1+*iXE5guhrh?7}P$~N&mds z3%235ZMbb4Zrg_2w&AvIxNRG5+lJe=;kIqK?buXe`)%8P+qU1f?YC|FZQFj^w%@kN zqrbj-pJ^l3_32aSFdAk+pgQT>$dH>ZM$yUuG_Zjw(YuY zyKdXA+qUbr?YeEdZriTgw(GX-x^25|+pgPMeWKMTT79C`CytFIj*TQ*eWHQ??_1-0 zk9|x@?)6HZk)O(}?3AC$F4^l0e)Ce6`=u&1G5zos3%tbwZ?Uk!K1nnDck55Jzi=d$iZPr#bi3vgNki zQ`0@T2C;4Z2HSdoW*K2IA)!06-I~}V#y;*m9god_J zL))mKZPd^rtKGw;?%`zz-NQfosg8FqgYM;6E0L_G z{*`<9JNK}`Jv_%foZ}wOb`L`b-NQru%qRGnAK@M@SoxVx`#1M+bn5+X{aUv^$*ucW zYI*Rt{9&)U3vD$A{e3;wSA6#;eD^zj_Z1%N^n-5k4Uh3C&+<*FDYtybzq#e3JhP)+ z3*(s7XWaS&Zv8g5KI@=cf7{Rc4EOLvYkv-Y%*Uh#9{jGA?X15(BIos4T={CuS3mL9 zwqJZT?5pjmuWHH_6s@3W1w|_;T0zkYidImxf}#}^t)OTHMJp&;LD33|R#3Epq7@Xa zplAg}D=1n)(F%%IP_%-g6%?(YXaz+pC|W_$3W`=xw1SuwUa{^dTisE%x}$7$N7?F* zveg}Bt2@e8ca*K}C|ey_cds5@>o@BDm9QK37u)=7Tl_Q`{;$5q?N?TI^jCEBuc~Yn z2clLGwSuS>M6Dod1yL)AT0ztbqE-;K!u8c14XdMS1yw7kT0zwcs#Z|7vex@u`Mdu4 zf-5LiL9q&oRZy&gVigptpjZXPDkxS#u?mV+P^^Mt6%?zWSOvu@C|2QH>WqJV@QZST zI2SYHUuXR5jDMZ+uQUF2#=p+^*BSph<6md|>x_S$@vk%fb;iHW_}3Z#I^$nw{OgQ= zo$;?T{&mK`&iL0E|2pGeXZ-7of1UBK5B^wgmD}WYNy`?whjA~-e{AL-Y|j7o>Vd!M zs)4`Zi1x~Bvfm*`{S||iueSOs?W?;|M`*_PqeSr+&G;;X`@4ZWOxw^jAUm@1i*ZSuti5S|5p^X^Yh@p)b+F$p+v&j0Ch@p)b+Q|Bp$oiCs zp^X^Yh@p)b+K8cz7}|&li5S|5p^X^Yh@p)b+K8cz7}|)TjTqX9p^X^Yh*@1?R+p?# zSz=a~nAN4hLuIY}M`yHtwVCT&d5yeQUMJ_t>*WpNeV8n0#DYewOT>akENH}nMl5K= zf<`Q8#DYdFXvBg>ENH}nMl5K=f<`Q8#5(oQC2^pG?bZF}r7ZVLRchkQVtQ7hXC-=8 zqGLtuTg1La>|4aX_0RjzTzO6OkJL|kO-%aB^{4LsD=f3}ik$S-UA`Lcf0epaGrCkW zddn|fy9X>pza@;hk5TtA>OT5=;RCj!|9?jPpE3WZe}##DQ(Ac+=gK|wzpww*?2FFdf_^sjNzzdpr| zU;O)RzPjrdkJe|y)XJmXH^J+~y9qxnuP<{d=2U zx$m9sp}!s9y)xZy^O@BqzN`Q9_WwP<^3{VaFu&4lFY$AH*w1l;pW}1=|DUohHuZI1 zeR<`(r+#tU{$p?R*jqjJR`>eLXVrg1ha{%>hz zqF#B9{VSS`tbEr03*=Wm>rcQ3eh2;4wO{mTUv#^^ZCbf1$jY;RwdeUx&-0_6=Z9Aw zvHvsnA2GXPtUl|OpLNU6`q%zzpuO^w{heF9)h*t(a*I*_ug~SJE7SEAzWWOIdW7$J zr0+R=<(c2>e(v>u?)41%KU2S7|8g(c-)r5aU!LtMPyN4n|NrJz9_c3cve~_S=@-wf z|GPQx`rYjRef8h`zXPw|{%^7Wx9R_s2mXR9E?{Na*uU~qpX`y&b?dkP-|XE9bev_~ zH~u>t$xIQd)Uq#yfORW-c+gl8fk)6HC`G`sF9JenLA1yYf>04^ML@J*sZdH43$h5b z1_}+(k^-4d(uI~bp-HBh=_HvnleC$c_j6AJ^7{C^|M$P1^FPPa^X)w|nYowi`u_H7 z@#~9xvh9iAP!kLHUfAa2hraQ)cG}MQ!d`jV`Q9*!vdQ=AeQ&WR`-g5^<}cyM<=6cs z?5&eY+O~|>%l`7JzdY|R3yW8aInxTCWPLJFe6nS}yUm*k?>>~IFap|KJWtqT#c0EM z;(pcOSIdg$S>-$7n9ly+N#FTU^20uV%dZ!G^u$YjYpHK7^{r5@xApY4b}7yu{HXuKG5Fj1Exezw zk3;r`_tWezi=DA30Yz;Yw(ip6{e<6HQoNsgUFkQj^c%kpHC{M#F?`N<{rU~R4#&)G z&d_i4+u~JyE0l{@eCzd(eqYqP!@oCQ zla>ivF6_r`90@htT4&pq8$MZkZtJ^OoZ$#M;2*l+!@txQ?_h<$tZ)Y_oGt9{P`@p5 zoltsSbe(O#U+!DWeQUXIg})DVPtm>we1z{j~VoHgD{h;ElrMU`gTfU|FF) zc*lNnO-2aB3U>!8!S*Vg5ww`&u+j*DRfVqw?-_Hxw($L6o!KwzRj)P_P6#^l9|VcQ zgkWP~yeGKAyn}GRp{pwoD_m}W!prTzcX{PE3mfcDxWWE}m)oE4a{Ci*us`7j`x9Pn zf5OY{Pk4FdDKHUEh3~;>{(d@~;q~`nlGo;5R-RS3yy^?a_#OzxyhnGlPw^hGr`LPI z-ms7NV;uK|{h-?W{ow%k42<>JXTgp`(a(GDe9CZ)cg;Dm z4vtnyX^|%T>Tb{~ajnu5*fmV6+!|O1CwSi|_jN`VuJ?H>9p2{k2hi?!9gdw=2;3;6 z*d_mQguQk@)Bwj7p0h`8xIgaOW%J-qUOx#>%jc}M3SYLcPHWE9nsc@0T&>xyHM_Ou zT&+1*Yj$hRZml_2YtGf0bG7DNtvOd~&efW8wPv^0?ADrdwdP!{*{wCZwdUNa@5l^J zE!0=tRCulGX6xhL;%LXJs=L7MS5a{kAvg277~Uh+<)c1h+m`P*Qoe4Dt?XL4nK!G;7+hMbMzNrEu5&eaH7`2 ziQWU&!--lCCu%*MsP%B7*29V3Z_Snm;J5G~Shp(rdzc9i!Nc$em<5l(Z1^KQ3Xj1Y zcpT=!6EF|{1b>DnMOgL0n|vR;>04 zd9wZzMmJ-03Zq*vdIm<%Aop{ydOlXq!0J25e+si7!tB}Pe~Uc$GbP_DJX2=1EzF*Q z*)5peg4r`Ldj@9DD8IGvxANNxf5Y(CFnmUZRh}xRsOWwgMuVNe$a$t}oa2Fx2f@K! z9|AW8qpNO#yWt*aD9pgh6<9d~D`#Nk46K}il{2t%23F3%${AQW11o1>&cw=@SUD3bXJX|{telCJGqG|eR?fuAnOHd! zD`#TmOst%Vl?$*r(re5{|3^|P^lHrCI^`q@}N8|!Cd{cNnCjrFs!em2(6#`@VcE? zLd(CBt?V~G;9c4~#zS0g+;`lFfo88;Xzf*E$oJKLtZqOKHj#r(_`eDNyYN1P=bP|* z6Mk>P?@c(p2`@L{%mQWuvHJfTk>I5^dWJIlz5w%7}^wq-p=xeYT-YBe$ zzUjCG-hxJ02JaSP(I&@OVbzEijbvEJHyKk>Q8*u~`bu^v+=^Lwz5kG&?$Xmwlknwg zh;OPPJ~6DX!!a0H+2LtruNCeuTVa-aN#T91y{X)+q;fm*XxWWgHEhvUS}=_B24#yc zRad;A@&YR--=lilfa|-e%HHR=ws5cfRHkqVo-c4G&$yF>JGmamXXAJcj@RILP06VI z6F6Rrj2s zeS*E>zg4)QY-QohvQ^MlsKNCbTt5-lYjC|5*K2US2G?tF{RmvI!SxzkuPICC`*8iF zvYx_eWxbH`x(_xNj>GxmaJ~lTYs$9fXW@Je&e!1laX4R79u%Tl{*dz0d>`J|;C&6= zpQI;FDzEfeG(QXPYxK&u@V%ydLjE#*uhBDK!uJ}z^QZFf_}+Knl)|p%6CH0Y{G4xi zTlwvUUzguu#C58$YsIE~pI#elKl(GPPOuistb75_zmMk=t6uW@wR~SyBecNE!bNz# zdnB6gvmgEb_M<-x*J~nYdH<8bIk;Yf>ot*k@~bi6hq!(cuAheMlX3k_T)zU>Ps57C z@wo<{Yw@`jpC7{KAK>$m_ydd+>aH$@a3ppMV{W0vw6!R#U;Q9CqcfDvwn;tjb|i4x4h=l%p~8*p$Pj*)(Pz zn{wEc!=_Gb%3)Iuo91Fu4x4hcWge5PIz?-n^?vDPSW~tX-toGP2K@l+9f(aiOv+(W4wG`2G#it0n3Th$9Icthq}iCX z0FxGA(QGX0#G+0t%9YvGsB93ncs&HH3MO@8QVx^ynAAdp<}oRUNjaJ`k3Bie$ze?n zV{)`(o_5UBjCst+(}?-1?-tfoO)tDj+vRDyJZ+c9f;<-FBT>*+7?7jw@)(fEfE)(o z^!|{Ze_qc&ujilF^Uv$~=V`W0G}|VcZ4=G5iDv7;gd7IsF(8KlISj~QKn??P7|@9U zIlaC`ujlo8J~%AMSRKMF%V4v5@PMlDAQa4RA7S;39qrRRQYLg%@QIR7%khl10>G~J z(%ucm$_tLONAp32hs&O4&t44nDO>2cIM}zWG1#N5#c>6!@wy|3lx2dQ%eDqPYQ3MA zS6GQ-JBWIJO5yKXs8Hehl{LY*%Cq5|U|iKTMqXB{DBojjN<-n*$U2qr`wD-FJ{9Z} zeH#91|L51#+ZV$dg#u2$=gFGoi5rY93xc(!_m!PgaYDrjBSw#0RB`Wi7gau9bz<~q zBSw!H{pr7tn7sW7{!QKC)KC9?8^+AoVZoRgBNu)0;+@ux`q`)d{^^0y<3^9${e;mM z?{UiL=XS2$`J$cg-DUJHqj$e-*O9x_?$WU9$X$=yb@Hx@cE8NO6Lt%ByTQLV!q?ld z|G3?s-hbR4r}#H*kH77Cbog)IUG|*3=Y9Uo_ixeO?~IwT?=JfuQvHqU?^OTHzZumJ zR6kPPxBs~PZ`!~AfN!05&;dXGO!*;e54-H}Ej5RQsM&PH1xNmL{Aov@aP%LJUUc+Z z$DVNPX~$mrt@pmwKcQ;EZWF#R;gAXcF=70KV@6MH8l;{MZ$B6PNq9 z>C}NUK6TD%=hmEe(0S*b_oMUr&%gNmW#=!O^4n_-I!O&&-%fE2>4VV9| z?vT2vbu;STx}t9KDU;8eJbCi8$-kfc+~oHrw@>byQaYu2%6U`fPgyeMy(@qJ&;PF4 z>#Du3JmjB0{a5e9Z~piHtdg>C*-K@sf}m_o*;>qME3XXpEsvIu2>!GDsPc)y@#SZg zpB0>4{v)GS&MBW-J~cSE{KoPdgY(L7Ex$E5zx=lHJA(_#?X7Mdk0f0##HPVTwQTM#eu=pio=X&zNO;t6)y)r zt9Z3yaq#ns#)@}?X%%ZK)(7`gSOF}!w<1xoDY&m`f)vsu-57SIE{#vNfMJhq^XEx4I2n8y~hu?1~x z!F6mw8(YxkDSyEhw6O(kJc}fIFpoWG<3YU2dw7-C(8OzK;w>*OGee!1yqE`(;z6Y7 z{5Cqjjm~eQ^V{hBHafqJ&TpghZ>ICx==?T1zm3kHN9W&6=l_Dv{{@|YGo61Ooqrvj z-$vKB(e-U~eH&eW9bMl>*S|u~&!gwt=y?qEdW7SD%I|*zP5>(l(D`k2ejA-XkItV* z=g;FEyv;j!n|JVB`5lGlXt-`RU>>h{F;93gPk1p;crj0SBM)IC4`Cxucq7{|k8PO8 zHq2ui=CKX)*oJv*!$4%5xdUG}gY+!#e*)KfeG@d8L(*B8#y(7AAEvPn)7Xb;Y(X2% z*v%HSu?1~xK^t4p#ul`(1=q0!ZM=abPoPOpzdPauW8_{eEM^;CVH@TJpTgOZMUMW1 zpV1;OKjb8RU*sH~{WGVEeEN_>hw&|*=U2SNueg|BF^OL>370}Y;Z}Uu=&UpN&;9)8 zIA7obzQEOdfeZKoSM#SIcQxlk)z*Kq+ z?B0ZxDXdIkWlF0|!Nde6CNMF9i3vNtlZq>$-c>3pCW!5!AqaOLw|<0JGAnG!il`^n~L7|HqZM4cYnCM zA4`U|(0VoQ{&O_nexBfmSb7v0nd1&GBn!W$^jS-yVrzMWk0@rAPr?tR*S*WQhXjA1Cu9bzl zmbUzbcMYZP3vgWI@+|3Cat4M>uAzCyqkz`H{jb1G-n;nStrjhn)a-tJ?n7q z2HLX@|4zrfiL_@O?OBI|6U(E8(KKisE-t{u1-Q6?2Cbt(>uAtAyqt)a6Y+8)4f;3@ z`WOxRSh-yc%kOZ!({Xs_E8b4T+XZqAcgQi^QF#tr;eD4iyLK)tz~cq9>jc_$0_{41 zcAbFJ6LESXPEW*&-(bZ=oSsN`eU4_W!|jRKF_C7iqgm@PVWsJS;lMNhzK`7w$2qP+XT`)`IV`b(_&9<2Eutoa_S`N*Pes19};w&sh5z2qHO z@*VIw>+Z5Fk%&dgsu3=eR-nZw91PRn7)fV;laUEfKQog?Nt+g*n`{uSEl724_*+UgbB z>J{4RIoj$u+Uhyl>N(n~Q_qGm(o4qRW~^mcp;i=Te6~fwDe}FAJf_@rR(2;`&1S&a zhs?&ax4c%~Ks$8%cBu8!G(!i?&_OeF$i^i2N-5f*gLdek6*_2z4qBmuR!Gtc9op&+O0qjhb_dDsAlXThog~>wzEFzvCP{BM ziR~t>-K4dfv}Q?bmb7L`YnHSoNo$g{CP{0Ov?fVw65l&WYX@mflGY???I5ikdZA60 zB&DD4)6e(m=lk^Yefs%6Qrsa!l8_-u(Dx}4-9e%|NOT8@?jX?}`h6jZ?qCN(8~+B0 z?k3S`5}hpi>i_rTrzR*NwI!ssBg5k7FJ_g;~7>K82n~3ZD}Al)$IIurvvLO5oEH zeA_7Ka4dmin{jL&jy;8A^KdMMV<{X<@K}0yEIqiEU`1ZVw*)*t= z%{Z69xdhHVg>z5g+-4T#RlG~!S_0P+xR$`R&A7H1*EZwY8@RTam1tun+E|IUs%zw2 zX4!-G8F&_60;>z*+GbqajBA^5Z8NTI#8bSKZ~PI~X-+2|XJcl$}%=TE^- zFe<+iZ;!&;z45jdZ);_vSI9=Mz}s59t;O3~+2}2JTZ^~fm5tttx3zd%i?_$)Z7tr` zYJqR#Z7tr`;_aTY(OdAgR;%Pc)+*=mmhRUo5Ac@G<1L-XTe_IHbn$R@`ikM~^c7ld zDo^Pqp3;pxqdR#+cj9<0j@RONEsodX_)$1si{rI8UW?=3#qnAkuf_3N+377f{#_jZ z4vv2p$B)PH<8izew`*mkSKxLnZr9@W@wi=E?5WcH7QC*->sq}24qkspMtX~k^a{ML z9nMJC4riomhcnW(!x`xA~JB%|HOt_g%M<7I7{vIYxym*)LUe!w~&QPiVTV7w|vBsuUkjrEbl|MTv+%`_kF_(%Jj+v_|t2cNIZ=rtveh^KG7> zgspFL_a%7vBK^7)_g=)i7xC^HynDtImEhSkIQAR5b17Z9)KitP&u#2;8~YsQE0)re zOY!F=x^gN0^x#i7{&e6@2fewJjc#M3+t}zfHoA?TTuM(ar6-r-#!}o^N>48RsAbOb z`X{h0YrE)Q`dnca_uaxX#nxIQKe5)j!Y>xu=)R@;YDXSaSg##b^msyR)S)FhJxN!w z4jI-U!}_DTqpK9_fcl_KhPpz8G}daZ{2~748o7kG`Ikl&s+&(#g*~-!C2wtQ#bJdr zDh@B4;kw^_@nE+?0WNE&u$sT@y6k}#@Ai*Vt2lZ zTyJ*wedM>#-G?(m&T$XtRI2c5*YzrkJ37-o?sWg+bBBBLwmRcV9`gnsa|e%k1CKeJ zAN{zquHq?wz*GJJ1K!j7@9~CL@rGAn!FyQHfdw6`YcuQGj0qj?Vxz0Bb=9?crGU5o3h@I0)NufpwjaQhvz+=AKve_r;5AE>i=?|`}$U| zUbt2-G!*;yaD7-K-&w2f`<23ldf|M%aG`s?%sp>$&s+4yIeO!Ky>Y(YxK?jms~4`- z3k`aqK`$)O3k&o@gI-vy7bfY2NqXT|df``k;a7U$S9;-BdZEF6ZwWr-F6Ow49(VC4 zXPx7$bDVXKv-UV^kF)kWYrnJhIO|epd&b$Gakgii?HOl##@Twv#Yhp~C^@uo+W!db zIZo_#JpXdrnBU?UTim=`Yozq?#*pEd5VByD_;4If9>L>0PVV7&Y&cnDvu&jMJ7v9U zN2C6?zS$G(6n+~!wwIyao|fI7_S`S1A{WnSfP14fWYw7Dr)1OGwpS1Y(TD)D0w`=KkeHZ2pPtn@5wDv5mJxgoP z(%Q4McDsHXC1xCp6$h!B9*)^HJnL;E0zMpJ9cqOpeKtfZ%Q{tEAPJYbbK#4=_Mz<8Fv2@-+Y~11U_1nfk{Kiwh?J2jGPbl_M_=HP6;Zna|>(|ed(HvdU z9*iCC?>?N5F49kRWzZ{DX?nXdx*QZW1jdMGHy1PKy?jMF}r+EQbo?w6=p#;-hrQ2%mimPK1-- z<60oa=FylmTl3nYPg-MD4Hi!T=h%MKO0FokrqzE7>0!WGg zlH@KeB2J0`-Y;sQ$w9XYOAlDb0Wul66P$InX_DG z&N5cqUuMp7nK{ccrzs3Mv#j3nWq1V^(a*2?Y;oZcj5)LHO`p95VFrGgO&>npCyk34nFF&D| zpQya3Sk=i_-tK6;f2H}`mF8quHbD$Jpc8V%%1@q7&R5lVZM-LjoQWZi&|_WE`EnFb z74Fxg_ecLKXZnoy=5I%}MO0fvwS}IZqo?QS={b6OPE;F2UoNcR*XQjGlVJxdcp)QL ziyg_Zo!qqYY;yI!R{k%0o@n7-t=TL4yP(XzR9d4A-@{RJvGQa1ZO74W6AH7~%@xD3 zfc;~9KD;lA==O!mE@MXSQ88_x%kK+kPq~Y=?qZ|6NVg?q0^A7HkQ# zyDbTn=o@z*tilpHXbBy( zgbrFl2hC!uXR+0@*y>qq^(?k}mh3|l9n?ez&0@1>$viaCK}~c}jt)4}^xal{wN+n*+4!y6zL;J2jA2&0(=&E@#!k=J=@~mc zSD)unXZk)Om9~xR7$Db!2Z1 z*=zI6#TCDtHH>64c6_oEgr^HfSND*JB#8*EZpu~C*xl<&n>}qfnmOfZQ=T@AT2q)9 zTDCA&UWI94ouJ2)ukz&UJ^6Z1zTT6s_v9ZRz1ySLL=CRGm8^A=u}<>S=_+~L@5JR! z-0j58PTcIo%}%`R#IsI3>%_B8JnO`>PCVcUOI{#F1QYhKc4&D!{U;o;H~f+I>#3Jxzl!|RI+k5`?fGJP_f0;j_F z;50ZL%zLRa@1^R>!s@E4;74#Z{1|=$*A*VFx*l$T8{t;?8Qcc9!_Ny3TiI<-ck@VT ze^5q?l|uzDO70=3H1D)3oO|kZ)cuZd+#WswJNR6z5sdWtCmlZpJgZ=o9=-Fe{d>%4^D&A;SBgbOoFrB z^Eq%XoCoK_1#qD@yNKocfsvILdw&UB3O|I);Bu&gD?Gzwm;zUNZ`T{EcPtLBcKoq< zoj-x8a1H#_XVyHmR?X_*dbj~@gqz@IxCL&7pTTW#yL+$}X>f^qbzB zjf2_WEj2T|)T$I1eo5)Jog7_pZAzW76RidwS ziq%oB@>|baI@RlI;5zVJrJlqs7ilsSGGHRXPWoZ3$ar3t4r^-0^M(Y_dzi8 zr}Pi*brw7Vv*C~MC_Dyp;BlA>PdM*9cvfusBdbh~g1uC^>#Z&OGQ1j$sdz2erDAb$ zw~2mh@AO-Hr{CH;{T1)Rn!*z6(8ep)!FoH5wfkO&oKBZxvhdD!YHi!uiDA2HIH0h4 zyFoiWd|sXN3-Cpdo2)z#4uXT>5K#N9w6crcD7q`{SYK&3xXLd>Eqn#W!&l)b_!=Ay zUkAHM+Kr;S(r%KK>aLaQu9fG4HDoK#2W?+@vD()qpzSMvXs3$H;Bu&gE8!}iTm7%{ zYWOjzaaB%*pZe{!aGlrJ!wqmF+ypnnEpRK`33yfc3%Cn@33tOiFdcpcGr;VSN^2Ta z-Us)?1Mpjz4S#eWkHTXx2OfvH@C3~B_rJh=cnY3|zrySA2D}MNU@5!>YIv2)U^&FW z%(%)HSOMyKm8&2DqOwX6StZ_ArlA{fzOolG&1lghMuk35k|r%;Zv{^jDlTYSJ(~cRy%zxvD3#AJAEv%)5nr3 zy46k}OYHQqq-sB?hW+6H_zaAN&%)>6FgU_B{{xOJ#H+sII3B(VN5R+NX!trD1INPu z&dwkw6(+G>lUT1wtk)#gYZB`#7tVw8!752r7s5sG z1GpIIhN?^9hj1BO4s~z^Og4sN3S3!uh*f-uReXq5e27(ih*f;3>Zfwj*TQw`RM*1| za3kCbKZD!gcKA8`_dAy?x615ttIRI9%ItEh%r38*33e#8%Ixy0Kfog}8~zB7!ecN8 z9*4Q`1k8g!!Jpwt_zTR3r{L+J+$yuntunjZDznS2GP~R=v&*X%SS5BL{2gAlBg`wX z2wsKP;SFO%--IQw6wHpUdfVskz`M`{F<1_9Xogj=8s397uom8jbwFoTwZaFm0otJh z*nuj$(o}Up(wf?vAPsCmRS&QQ))woxwphQl#rmx+)^BaGert>MTU)HZY71}A zn%we&c2McFgGyh-jy85s>9d1MpB+^CBD=zF!7g@C>5JIWCbAdo4f}u{Z6bV#h%8{_ z02m8jfG@&*@DdPromsMiV&+PKNKoDTPH5D_KNNh3~;>a5|g; z--ol|95@%wgY)46xDYOaAHc*>d=ryq;l3-_B5_W=AB9)#b)?_s9(8Xt0e z82$jW;1QS&e}qTjF_;67!(3oHt?#xv@+bH+JPCh+`S27x4S$7a;8}PMo`=7|3-BVm z1Pfpx{N0ScdUzRLfkp5tm<~rf0PWBL8=(u5kOC{kTCpn|u^&Xleh}8v&qVA8 z5wRac#C{M~b9>L4`hC%jg(cB0NJ0uWLAZl&HyEcDHBK#>fxg0`=w|4LEDV5E1)^JE zD-1!d@D4Bj#u2|X9^`KLTVeAEHqHuRi>&~^zuCz4as>T(CU(1&~ zE?3f1Y45yBd*@Z20N)IDuKZT8f2Em*R^r%L`EBn{3J$aq$3`o0Y_t-`#>!J*BAg1} zgVTKHbiX;n>+i!P@6Ys`v%I$EcjbfLn|WLL`;zj?nO;BS^}{96%4fWO*6Zhd{(Nv= z<=?!2!TT5e?IrIQ20K;O`|M?(z2ZBIeDo0iy zMW2rgcGe4PMm!me7%{)(j1flC{v8<~q}i65|@3?J=3iLH*fDy5giOPP*ci-z*GR=VpL( z#YtD(IyVEACxJDgNLQS6#YtD3bj3+moOH!2PxJTF;S8_850kvMiX-WYyW95@7 zUDzDn>EZ6Q%bj+))2=FU4^}Rx8wTly!C+5$hjs3Lo#^^KQFTnjwo0_NN>sK=R2D0} z(5}uG7h-Y`>v(VLcyH@?Z|it(>v(VLcyH@?S?}?(-s45Zcu_H4RE!rD<3+`IQ88Xr zj29K-Ma5iwK*rRrpz;ZExr4a;z@U6UTs|N!9}t%Zh+D}e9xQ{cP>}hxd#IQ*E|!d! z9$y#~M@|w)#!J5y>>`dlQ5+dB{f<39&Mw5ujF%`Ym6a^h-sMmM5s1owjxa`Wd#^uf zRKust2i?hMqrBhQm;o8svOUcIuxEMMzCNpl{R?lDo$fcYop%u|k!f2B%e`J%7%=*M zKsGZjn;9?HpA|B-V!XJFW!!2n@$JeBtHn)maZ_B}6c;zeWiR8EQ{YPYBRmR^!5nxT z=E4*3=irXYH-p;BCBfG#mj>09Zv~&g#D^;1^*RPCf`cnp1=V7MxY!^rHi(N2;$nli z*dQ)8h>H#4R-1`q?lCf^adARioDdf$#Kj45aY9_25Em!J#R+k7LR_2>7bnEU3Gu3G z*dGpn&%jvtEPM`Rnyp^5+3GcMtJiF{dd+65*Tk(}6PL-0izDLrw>7$3aG+I6;?cJY zgX~w5va(KDS*LysX~Ym?*KxB4vSSWsQ8l824R&$mMdHhs-nrpL%m9P9WE znE^W>VA$0d)`(%FOTXUBay}#J|OC0llU%+g>ifP zY+rxd4|A&>X`HeH98WL2gq@Ap*+|P|G4wqQeb0QKkfn`S8pF~UmNsH(BbGK|X#G#Y9ppLV(Pmx4Oy9ntV}~zrXefSkdyWKH2JCAf>yVXo$jUloX~HZ`n57A` zG+~w|%+iEenlMWfW@*AKO_-$#vov9rCd|@=S(-3Q6J}|`EKQiD39~d|mL|-q6=c;4 zvN9T38I67!jegp(pENd-#zxZENE#bSV#d{9(AC@LQml@E%_2Sw$BqVhpe`JkwLP*grBDjyV;4~ohM zMdgE{@7F6lZGd(gpxv^xTa0##(QYx?t)F&_(QYx?Ek?V= zKGJSuX{^sf=v%z$^CgbUCVP)2n?jStXtJGY zu}f*O7%dhnYB4=bgT-jDPYdNpm&QT=g{9 zTQt{Fn(Hl^>s^{_CC$}DbGq8%IfaV(bm=8BVa}Cg312oqF%{4%C4bWTz zAM@b`Xs&^e`EUa?*8t5mKywYyTv?hcOLJvut{BY~qq$-x-2u&GcRs98Gh@ zXs#H|6{ERgG*^t~iqTv#nkzxE^kR8{sCnIq0Qf25Fc<8fK7&8KhwbX_!G8=HqKZ4$?4#G|V6k^F>-=fL4eN zYk`%tK#UfM(E>4AAVv$sNc>6?KS1JRMk4Yc`PQKXui-1KAz^Fy(S!WxL4NcgKYEZK zJ;;w9 z1RaqE-LD&MuAIX8{lY<@^5+hx4isYKJpis4^P3<@K<;So`vV&dH5T=0LJ3TzvboM^73!?y)ts5 z6*6Z3^ucE6hb#=}!*EsL_w`0NUU8N6h(BC!dK){lCGW9usiGld%`~OS);JN zi0|XzKsd-q&x4IPI0O!b!{BhJ0jsL2=ys{-c42!9wzpt=3%0jldkeO=V0#O;w_tk< zwzpt=3%0jldkeO=V0#O;w_tkA1;6kjRn2P@dt3Rzg+^C!VlpxxE$)>3g@tTYhd-( z;7aeWf~(=DaII@xXROina0A>3H^I$t3)~7ngWKSCYX|-u?tnXuN0_E^{tM$v?lL#P z9s?!TbyU4=`0OMh!qvXH$jWG@TZ%R=_Dc)cuMFN@d9;`Oq4y)0fY zi`UEI^|ErktXwZE*UQTFvU0twTrVrv%gXh#a=olvFDuu}%Js5xy{ud>E7!})^|Erk ztXwZE*UO6asz#+$qf)9-Db=WyYE()!DpmCW9sgT+5Pk>0hnesYJPdz;M_@Mm5gvud zU=BPEbKwb?2Y-S;!;|nAm=90E)9@TT4}XIf;6+$q-1tKHJG?AY^a?D3SK)Pd8{UC; zp$THJ9OBRnt6(*}2Wwz0ybspcQ#I;RHR@6|>QXi8QZ?#QHR@6|>QXi8QZ?$LFh`07g%#D7C97wW}z#t0=Wca7{(2T}7!wMX4jQ8<T}7!~MX6mysa-{>T}7!~MX6mysa-{>T}7!&MX5_gsY^wvOGT+m zMX5_gsY^wvD{?lR1Lwkda6ViB7s5sG1GpG2flI-v(JD$^DoR}{N?j^ST`EdlDoR}{ zO6@92?J7#`DoX7tO6@92?J7#`DoX7tO6@92?U8A4zczaSehUx6@8I_^6CQ$x;SVqi z9)a2LM|cz-gE{ax%mw;^wHjirhFGg1)@q2g8e*-6SgRq{YKXNOVy%W)t0C5Eh_xDG zt%g{uA=YY$wHjirhFGg1)uL9_qE^+SR@I_b)uL9_qE^+SR@I_b)uL9_qE^+SR@I_b z)uL9_qE^+S*2pq=8{UC;p$V2l9Gam8i~&QpW2R4wXME$UP)>QpW2WGTB@%5K%7 z^{PedRg2cE7Oht;TCZBPUbSewYSDVtqV=jp>si!R7PXZ{ZDmngS=3e*wN<64o!8mR z>+I!q_VPM=d7a^YFkPxbU8+J|szP0=LS3ptt*Sz;szR-*LanMotsm`u5YAh9v;0?L zs%`s8yv;fv5!71eBiwQ0k>aiz;U|-P@?)P&^T}<+?_BMZ=|1_RPaZZh(f*#r{~L<` zKU@6&PsRWLT>L-W*W-8yejmwi?X+jcct&5|~=q|Gd8vvE<4 z#zbuiegaeB8psrGH)?m9QM=QOf!tCu%9!oZe9v92Be5Io<*xUI&-?5Pj^m7PI-;;2 zUuHl4=zjdq&+|XBAc(YjiXV*j&*e zgO@67H7c>0^=lRjPZtYM7Yk1p3r`mdPZtYM7Yk1p3r`mdPZtCKS`0j03_M*7JY5Vt zT?{;33_M*7JY5VtT?{;33_M*7JY5VtT?{;33_M*7JY5VtT?{;33_M-D`fKs(uf?m= z#j6v=s}semrx_!2O=TA(3)ir0{VZEQ%hu1b^|NgKEL%Uz*3Yu_vuyoF^7gZC{j6I* z>(*~Su25iS+{=Ht)F%4XWjZ)w|=96`;7+fXXW}? zxqeozpOx!p<@&2$f|srF{|YRESHa%kEL^j(5{<@6G#V?>Xskq|(Vfl4OEj{4%`9It z%h$~EHM4xpEMGIr*Ua)Y8v)vE1ZXo0*vtYpvw+PkU^5Fizydb2fXysmGYi)onWvuvwbw$&`#>PWQE%(|^+-Bz=1tL>-wIXmxd zZ@0a0rtt{-P=DEedVASRaV8736RXk8YBaMN&8$WEI1p^fpg(J zqlV9SyZ|nQi{J-vFComPRfuF*(;Lyk~!~h;xCih*@++7D zzlM7YTcU3iwi=7OHM++5+&&|%H$y*U!Aw+hF$avQZ62X-{(q${M$;BM(H1+=76;H4 z2mD)G{99Z6TU*c${~u`!e$Rim&*;&?K}K1h4d=kQa4}p8KZL8`r|`>Qbje|6>>qB= z;hNy+lGLyxKG3wE-T?if4ij5j3J?if4ijoj=5tZHE;xc3BC-q@D&&jUxlOKYjCt@ z{P)h~|K7R$-#eF^Nz3O*^EuLdjx=9mbIGqnCaofqR#8bV7;CMN&zh%X^>KOqR#8e? zl#&*uq~$2X{A0cRW4-)iz5HXn{A0cRW4-)iz5HXn{A0cRW4-)iz5HXn{A0cRW4-)i zz5HXn{A0cRW4-)iz5HXn{A0cRW4-)iz5HXn{A0cRW4-)iz5HXn{A0cRW4-)iz5HXn z$maw3$1eHDF8RkU`Ny>UV_N<(%sr;%9@BDTaL`xm=k6rSQ_41Dm@{bMjj}7vV4f2l-@{bMjj}7vV4f2l-@{bMj zk16@baM$Bk*s#QeQDxzu?QMHPwT18Z?BC1vqRjY`q zRYcV)qG}aUwTh@(MO3XKs#XzIt4OL<^pq1h<eNx8nH zTwhYIFDciTlWJK5Xox%jzl8_kckp|d2@k=;@CTR$kHBpB zBRmR^!5nxT<^q|Lqic|(YmlRBkfUpmqic|(YmlRBkfUpmqic|(YmlRBkfUpmqic|( zYmlRBkfUpmqic|(Ylv9uSB@?vN0*YLOUcotF|E+t2olA}w>(WT_*QgU?RPT;S|(Y+!^7nh@p%hAQ<=;Cs8aXGrU z99>+F?pZmyXXWT#kfVD+j_w6Hx)F!kukx|as)?waCq@jhw)lqycQU*1;%TE@$O~1 zC%j7EJyg7dJ z(EGI7O+k;Q2cV6mwhdggz`7MP*%cm87Sbo15ore`_j0iYPo$}J?+QOl( z7-d6FlVvPdUL;PVkfyJmmyW zIl)s-@RSog-d6FlVvPdUL;PVkfyJmmyWIl)s-@RSoO z^=Y1Rj;EaCDd%{~Ii7Nkr<~&{=XlCFo^p<-oZ~6yc*;4Ra*n5*<0pDYb|Gd$%CPdUR=&hV5oJmoY`In7gE z!BY;a^l@zM!`2>b&6XH(YwXK<++S<#%X<7@i@l35_oID|Ft-tNyH)mwN{nh&dr0xJ z)2jPJs{2E#`$IhLsikK-ZX2yUwK!UNav{h2&Z$$R)G4}o;W=J-ju)Qeg=cu-nbJFa z{%g3`IQ!rF{6Y9bA;I%b@VpZ|?*z{~!Shb=yc0a{1kXFc^G@)*Gd%B%nnjxTog+Od z9(a!AJWq0-=ZPnH;t8I3jwhbri6?mC37&X@C!VNSV+D})eq;SWUU`~Vp5vA0c;y-O zj+AQukZS*sYX6XG|B!0`P^GG3rK+N8|4^l>qH6z;YX6XG|B!0`kZS*sYX6XG|B!0` zkZS*sYX6XG|B!0`kZS*sYX6XG|B!0`P!;~G_7AD{52^MKsrC=4_7AD{52^MKsrC=4 z_7AD{52^MKsrC=4_7AD{4;k@wt`T478u4|m5ntyT@pY~dU*{U}b?*O*BW#}#H9R3| zSR`s#Bx+bBYFH#{SR`s#BwCm%T9_(Ym?~PBDq5H-T9_(Ym?~PBDq5JzW6$x}b3FE( znn_B{B&BAOQZq@Zm!#B7y46d%)l0h7OS;ucy46ZjY9%SPl9XCWO06WNR+3UHNvV~j zWIa=ABq=qLlp0A&jU=T;l2Ri{sgb1ANK$GfDK(Om8c9lxB&9}@QXfgFkEBEniK$7saw3PE$RQ_k$cY?sB8QyFAt!Rki5zkwhn&bECvwP%9C9Lu zoX8<3a>$7saw3PE$RQ_k$cY?sB8QyFAt!Rki5zkwhn&bECvwP%9C9LuoX8<3a>$7s zaw3PE$RQ_k$cY?sB8QyFAt!Rki5zkwhn&bECvwP%9C9LuoX8<3a>$7sa_T)P^`4Y^ zPfEQfrQVZL?@6imq||#-YCS2no|IZoYPi;uQtL^n^`z8#QffUZwVsq(PfD#PrPh;D z>q)8gq||y+>O3iRo|HOIN|cflrQ}2@IZ;YZl#&yrJYp zB9FMpBQElYi!j3d1$v?ztw_`bNl3va_!pzl)zVUGX(@TFl)P3-UMnR+NsCa@B9ycU zB`rb;b6wqhiEV2(hU*hG@D##bgBy7YG1jGxpV3#+1J-EcHLe(5i6~sH(rl5EZ7WtT z<5?~B>u?Xtw}<_VH`uAwOR(^)h}E9a;sl%3ieXV-&#_^_Khg+pAfDW+ozuYcF9=2 z;yAxN$XSO+#+IoImo0=9yw?)gj(xJDaJlsi%E_2}T;d)(-Qx;Z%katGE4R0%x^}0U z_K+H8YotND-RH`mGz$N1SIw5}Xgw#|!xfjiVxQH-Kj*3~Jkt@b60UbNYl)3%@tS~7?&C}@!ew9bXjg* z;xA3>$<8Qyn-(Kr_dDqJY>tTa=!kvW;L896^I*?LGcEFFTI7QxgEx%rT*5zJ>Mk1H zEva#*;l9-2?#VswawvGu9`0*>`+a{~=X2v}++oJu{mb}-_ditjnBMzXTvBNtlFD!& zk`v&Yg{|fqZ8g_uxe@!zjo9C6uF+O=jg}j+zubuZ0tzx(Cl;&;+yW`m^fqIf*r*P&Azq7RsT|Qloh|e2FF<|o4h#dTj4cmi;c9! zM%toR)U-vcxd*MGuEnd}K)&ChDc+(f=K57A-{DHap?tT{HSh3bQ_j%k3|-C;-pde~ zUqQn<=#~%T?4b0cIQ!Fl>JC?ryZV2-N|~#_ z?&|Nmdb_K)yL!si`?N&3?sjptGI!AD4mv&0G<))8f_>?LaDR`ROLj2hcSrIs|7f+g z-RXh{>3}(&b(LrRrMnCFeF=BMFBoHx)78>740 zJLo?9t**7B+CJKSp|~<92D?G~C-hRnGyTpp-6Kx;tE;rQ$~0G5JA9RUM7HfB+jh@& zljnL!WZUVP@}=J}BVk)~d!*-kq8Q2FQkXG(2iLlTYdz-^t~^()nH6hhgSX5=3TNgv z1#cIA6Y$Q1CUP0WsO5#b$!sEMF3N3tutH?I(u!WICFa@rJtKdg) zHT>B6r3c!z;~+Q~4uM1AFgP4);0X8+I1==9^vh5SqUNZmIVx(7ikhRM=BTJSDr&Zi zdLk-nj*6P?qMnF~nxn^CPt|TZ(Qkqs0HPD%MEEwG1Si9H3LiwRhaa5?r^5H(G&mj3 zfbYX3P+N*xGd_AYoCD{=d2l}1Z8~}(Tm(OWi{TQu6pY7?8jl^l0w%*0FeW>C75oUU zh983!rK3~f8jv@N${R(mgX`f2xW(=|x5CfhHn7t`^ygr=f#{tu4dlS1a^O*t9+d-+ z-UIUBQF-vFJa|+dJSqqffxR|H0n9Ku1}fZR4LnG?|1PL=;2>LyRN=jS>zX!2^m%6i?M!ty+7c z($|V@t+iIIwN|S=*n`&AYOO`I6>BS06b*_-5fCcOgh>Kngdva+k|Bd9;{1QlBw#>& zd-&eBUZ?pHxm_p9GK1rrLI3Xj?GI`SulgEK$-#xAezh1-kn zD7s^pzwP>o?%#Z__se${7EkE?I`Gm1buYtS@xJ5b_kZE#)5TvZeysnOidSU5={tMn z4SQv;8@i9P*P^{T`&ah=(kC5h*elL?Q~wA0Z{H_x=zBwohrZYS8g^dq*MT=3`222H z7hGj%=e1rMd}8>dU0(;*9avZLk-zTxnH|3cpY8n$zE_%E8XrC;&&(U8R{n+Tost0wy#(X+> z?f9*FQ1|a2{yXllBYzUS#@!wKi>dd_xhUtqLZO_m<=m!D%I!J#Sm*bP+@nKB<{q1S zUPvW}++W%W<^T2S|F2j7f4%y@)2sjgN%KXF(b|pCHX5V7L-QqRzRfh>CYrCF=1bCi zTa49`G~YIwubJjsM)S29w=JamHq(8oj(23Rw$8|0U_aB>mS!|81fFg3)d} z{kN9>Yo-5^RBS3xvGm<0`Yvfq*FfVf>-(6R_m9J${Ot*NN;KgfE5(0dEy3zg7JZl8 z!(6N}-$rA;jmCT%jrqEa`MQkxHX8G7H0J9v=Ib)%+i1+U(U@Go3*Vs&-=Pba(uGUu z!X#a|nJ!Gyg-NB1ykn4}AnbYYS%Owxr( zx-dx>Ch5W?U6`Z`lXPK{E=+ z7P@c?UAToV+(H*_p$oUrgx6JE%f0Q`fv+5q50ms^l0Hn*he`S{NgpQZ!z6u}qz{wyVUj*f(uYaBA&_ zn9TpFQTt3WtM@{kyuHg)V}BSU$ZaA?TkI#$kyQXi#?Qr~9D5lJ_lLb9h-vL(pMiai zjt2UD5PY~}#pbLbem?-rA7%~nexS%eiP7kAznA*`ASmhm8cHdX*zOUGQ-wo-e zzGC-%WqS1$zwg_Uj`x*S)z|)=ecND*Uv)x%% z+nr^#O7lT|?_gJp%__}rR%yOPrTNX)$OOAoZ?I0LBfGEPvtf_)8u7eM**X5!y}QL` zvAvBwvAyE+h2?7kyLNA41T6Unkhq$78un&jq(!-LXoD$;KbALRW| zIML6S`ujKG+kU9L-(HiV zJl&CoPLYO=ARe^C6GRQ(7BOfQ5qVYAV9QP`EtG>aG*l?NV8H)SRP_J;2xcMcY?jY+ zV93025b2feUCcV`SSKldvW`WD$;%icFJpqdj8b_S{aL6i6K4zdV~ert3Ou)}SG=oJ zWGTpA_}|VY*jsC2TC&Og4rZ}8ixO?unkKDz$GzUDMNRSxhM2ia$UG@E3zpKtQCc`y z3kPdmp^TF;S~yx&`#>=)#qj^22Hw=;txzX#r6_OI8CF@37qcV!Y7yWyay**!fomy* z_376rfj23E)*upu{g-0?cQOBS*!@WH=y%1V-xZ;GH}9&@v6$n%ysw4A7~}oCuZQ~Q zebe8r3;h6F9GQ1Rs3h+@p`5%M<=qsD(Z$5)-q))x(W?gg7DV-MtMnjIPyf4~`k1FO zEiS*mr!VR0TjMGFhq;A56wOg0RhNtAUTHn!^_ke`h4u*DXphj1VxJGXd#kfLASt8u zl=S;OKJW;u{U-1ORtvM*W>!0t)uOC6j@8Oot&CsfvD|(vH<9IzF&`HWSLQiP=X+$ERgZ=4V{*KPw4FI zUxd!E%AnXPgJRe9VN^Fb*GJ;MzHx|eRP6G}f*qf9o`alc*ly?9+qVY$*1o%ZYX~ps z;05b>!CSmwH7|(sf;cZ&Lo3F3LJLpW$P?D`gl3+wktYPR5N|ot7-u?+H>~FkoBPhx z%l|Y~=}c!h(6&s(h8|03ox$_^{6|(nHdBKM}MDDbYZx_3k ze!W}0OG|s(=LDZTw)ZC;f4r+6@2abJ`Bu?RtDY=wJk>eQ)q?XwMZ0}_fN%Hr?OpF) z?{j7>wcEEov{dhVKF~SqL*2D0+C}qIJb8olEQQWL#QCpq{!1Mx#qZ+$F0lD|&VPyX zU&xCF@}hxSk&-Li%&V=N5ADH=`|{%a%uZYzt*?FG`r7w<=H=FU@>bI`33?_$&m`!X zr|FqEJrkp667)=ho_RWJFzoN=A#eZ;6_X$4{XqI;xSv&hpk)$0S|&lu1bgX# zTIiKl@0+0ww$Ll>{?=gxl7y{x+UoTChx#Q!w-9Z9+)NmnH3ia1>nrz>J~MS`wK&=m=~B0*OqdUQpCu4tqwHqaDn zvKClJVO9om^l7Szg$hBH%FzDaRq~c))+x)ZQ}wfy+KzUzHXc+n!%iQa)>$mK&SH6} z3aC<ScJ<%kTFx}5uV^+dEvAua@YORu~)!9ciahY13eJ%#OgY>x) z?D)~=YKr1(FeBY8L#tkf);bwl^?jVbkMn1q(VzRj`~3aa@R+|n4m+OPYt!p8o--i5 zPNr2NcxGi*b;_)2mQ}S%R#m;Ms&#uF9Lkba)tqA_kTVJnfkUAR%w^{s4x^zO=@F>iJ$3S+3^${y&b9LtOBiUS?vbj2Cb9Kt*>XgmZ zDVwWPHdkk^YVoqUI%RWp%I4~n&DEK!V!UjwPT5?Yvbj2Cb9Kt*>dZX|%HUua0jkI6 zRzM}F7_S0ZO6|my+KDN(6I1FYrqoSLshgNmH!-DdVoKIkyR55rSy%0{uG(c?wadC{ zw^k!*twu8Ur;hV8xCed#zl2}Gy+#oC!LQ+d_znCP9)RD$gYbKJ82$kITDw_)WRFE43@(` z;7wQoDMvaZ(2x>_geYMrdBb+WG3$+}u6>uOzi0!)PC;CMIz>=h^Ls$SMry{xNx zSy%P4uIgo7)yul7mvvPy>#APXRlTgMdRbTXvaXtCT{X+PYL<1?9KH}Pf=|Q6@L9MF zE{7}Nb0Dik)>X5tt7chO&9bhVWnDGPx@wkn)hz3(S=LpvtgB{OSIx4nnq^%z%etzU zbyY9xs-9Y`mvvPy>#APXRlTgMdRbTXvaaf7UDbzwB}4pPxDV_p7QP>T1HXj_KsAr> zgYXdi9v+52z$2i>M|dVY3TCvz`j)W1C9Kj%Se=jX6EGW|gulR3@K^X7sQ3|{19Rc; z@C?j@XW==R56@$q7oY|fz>Dw_EQFV#7G8zdU=h3yi$T7KtgBVBu2#vqS|#ghm8`2( zvaVLix>_acs#(@m^M9Llwbp%(1K*T=)g0!VvagzDUp33VYLcn z=2fT6t4^6$oieXFWnOj4vTBxP)hx@ZS(a6^EURW&R;y%Lt&(N6N|x0sSyrn;^UR>n zF(!H}wA`w=H`BAJ;j5|P`J$)|6!98S)F@Rvn<~Cr6t$izzK<#n@_`nLn$8h5okJOa zPtr*E+|_J$e2%eKv$0pR z+3`8Kqv4hG9MR1=qMLI>H|L0M&Jo?5Bf2?9baRgA<{Z(@Iij0$L^l_RZY~hrTp+r+ zKy-6~=;i{^%>|;H3q&^;h;A+r-CQ8Lxj=Mtf#~J}(ai;-n+rrY7l>{y5ZzoLy177f zbAjmQ0@2L{qMHjuHy4O*E)d;p5Z!DL-E0uuY!KaS5Z!DL-E0uuY!KaS5Z#Q5Zbn5n zqoSKp(aosnW>j=DD!LgJ-HeKEMnyNHqMK3C&8X;RRCF^cx)~MSjEZhXMK`0On^Dot zsOV-?bTcZt85P~EHzGMwbhAG1>d=A4s8yny^`e{gdDn&p8LL)_Zq^&I9BIUIvk^W~b<8y>aVc(i zA^1H!41a(};Eym99)(%(7(5Ptf{(;i6b%)Tg|bQ($|}*3 zy^W67i6OPi%b7s8{K~kZfgV|AgnVZ1YHQhtgw8Xj?Qc|EY*ai^zyA5~6`?)#d6CSK z|MypQ6n@f3^5aI3yNntK{-2C`dyjTMc7*${bq!HZil@oT>8TkK6 z=HCAud(Zywug=<`R}axwU#+hm zF1A>%kKWTtwyo)FGP5>CA_~Pa5C^2s5pk%M|9jvrEs@tM<9M6dh@WInl8<&~`XsXt zUE+?x`neq$#+Mq&UuJ~}q=)o+2tp zL0Xl!O|M$*`Hr|Vt?o?I9z(5CQ{&27vTfFqZOic)Yst1*OSUa1*o*5(du<&qYIA-1 z4Qo)hiel%Rbt*CgRBVUqU1y$}L~2%w)U4_?^YoTT&08Why=R`fdS;%U6RGLyHS4sg z*R0cmUb9ZCL~6QvW}Q|A{$+Nl%gj<2dv$%x%+ku;W|p4YZDy%UWac>$nPnm}&xy!v zGNZI9Go#c!lk`@vnWRmbnWR4M!-q3S%S29q zFJpLZ>NOM8%nyQ@pk*R5OGIRrh{!Avky#=lv!rLHXQhbDN)ee= zpD@$2sb{8Vm1s=B;m2PoLVnV4=}db%h3K??RP3icFF_*!`Y6DisAJ>|2-c8`?< zkWbAPQL{zV?1j|qWNNlZ573XA{j6SKA~jp$`MF+{{WqfQ_sR0TLGO?{1=W zFUvYH{gtdq-cRy=vcH{{zK!a=jp|*d=eV2dEz)}&N%@{7Zy;aZKt2UrL;)A|eJWi< z0soK!{vic?SN0Fm^QhpvvVWMKrX#mmr>fwDD5J-1QV(4B5J#c+AgBDi>U1)YP*QqE~2)J zsO=(ZyGXYF>$3Gd8KfW-^<`&7y;$}RsoeT((kTC zw*DsB`kSctV(Pt^dLKf)S5oiA)O#`YK7@L&rrwLG_hRb3n0lW?y_Zw(b;nH zA40uXQt!podolGsgnF;0-ixXCV(Pt^dY?qS52oG+Q}0#O`?1vfVCub!dY??a52oG+ zQ}5HM_vzI8bn1ON^*)_?pH96`r{1Si@6)OG>D2pl>U}!(KAn1>PQ6d3-ltRV)2a9A z)cbVmeLD3%oqC^6y-%m!r&I5z>h;G^@Apve2k89|r{3?O-tVE_OQ`oFsP}s?!WfKj zFGe_&dOwqTk70&^c~(PF@2BM5l+Kr%kWa-=rs5}4@sp|e$yEGgDtCq}fm(VOP>CrxA1@Wz+N$I<+7QWRg;9ITyy@Q6?kA^v2 zZ}+zN?X2CelAd`j>oP66-0Z^V;7aQ++SB)Db)K)>C=Zo2WPRvd{1FiUNdUWms=@Z51t}v$ASB&loF}f?n=sqV#_boBHZ;8=; zON{PYVss~p(Oo6pc9eMAvEpoHVr`1-&IAf||##GhD zR2O6YPl;Cz5v!^Yr>Yc_Di@P_Lrkh%OsZT=szOX^l-SaqI)-| zM{j<^y&CLjKXas~9qAhVe^mb;te(G4owa`EruH^BwV%1E0q)z2?%Qkb+dB7co%=S* zeS5)uoA188Oc||r6-(W_+g!z$gR5}=-g5umbKmZDzixJ~ZgHPZcW<6@Z=P~*o^o%V za&K;NZ)UkK-*aES;-1`Kd^(JsuVd#2*!TuEo~|{Ew5EcME7*7<8y~~QpHh8cZ!Nq< z3lB4X-G?o&VapU-{)H`XWXm_%^3~80TECUP+f3hWW`)hX_`9r7#0ro0cd=p9<-$-M{qP#?@B;176j-rXAj<9Xe=-*|fuK+TlmE!+hFdHtp~T?XaA7c#?LQ zOCK!Engpk@${F;)!*+b@j)cwbJJZ^c$IR9}4u29Idjg(H&!z{K(gREBfj|ocI^YO8 zU^Wf#8lHX)PrrtzU&GU{;prrvehp72@pKYTzlNt@!_%|zbPJxIji+bh>DhRCHlCi1 zr)T5o*?4+3o}P`TXXEKEJl%z-yYO@up63Mj19-f|ur|046d3bsro}P!N=i%vjczPb5o`3Mj19-f|ur|046d3bsro}P!N=i%uHo{r$@2%e7M=?I>V;OPjS zj^ODCo?eWn7vt&0czQ9OUW}&~BV?@F`izGrx)Yt#dvx#o?eWn z7vt&0czQ9OUW}&~7{tOq$kR@6i+Y3)BEA+!|?P{JUtOl{}4|f zfv1<^=@g#MF@ie~Pfx|u9eBC}PtV8G^YQe2JUt&z&&SjA@$`H=Js(fc$J6ui^n5%$ zA5YK6)ARB4d^|lLPtV8G^YQe2JUtgr&&AVo@$_6gJr_^U#nW@~^jthW7f;W{({u6k zTs%D&PtV2EbMf?CJUtgr&&AVo@$_6gJr_^U#nW@~^jtjs8lGOJFMeD8$JWr^IQlQR z`OmodC9BW+;pSiB_$YP|xzVo~13*v)mRMsb~4Eo+YJciRe{gdXA}jiGB4D7wRE4>lp^? z83ySYPSi7eS+CH~D6=+mwzKtlPw4BmJL?4)`W|OK%PefCv;I4x2zvxQ0VD5V`_dOWk zcC1~E1wN0pPsaq;m|Z(mOD5_AAJPXtqz`;ZANUY9xJEyCA2yhQ4KBt8S7GQQ%z&M& z)kRqN9?UQuGu#snr%%ETSM{*NpED7W1F>!iCKw+2Ob;{MYDVd+7)6cTrV$3@=^mXI1tBuK~=~rj!S7+)|@6)G# z+j#6+ed-VOryKR9Ki8L@Z44IIkN!*_`Wt=dr}djR=r0H8FCWlfp8d}(uHXE&anvRH z&9iq{Q{Q-@anUs6qG`rO(~OG}#zhI^qG`rO(~OG}#zhI^qG`rO(~OIz85d16E}CXs zG|jkZnsHIWxF}&kL=V(cIqQ% z>LWY#k)8U;PJQG|edJ7i zo}(W;L_au5KX{e??*#qdRQ=x3`n_}Xb%*HVKBJGDrhhw6|8|vr=WF_%i}X8B=y%5H zcTO`tctXGPh<@jA{m!ZSok#RL7wLDN(C=KR-}!3Zw?lpOI|u1^PSo#wO&@ZU)+4jjA*2d~7zEBVsjaBu_%ujEt9_*4_0s>Q)|IQZSH zNpPCj*cl>u52x4irPqwhSMsHYaPTG^ya@-d#K9~3K4mA>+r-H1ugkwq!@a>ys%vrY zTHL!9_pZggYx%}IxOXl8c!z(ygL~KF-nF=QCGOpTdspJ#mAH2$?p=v{SK{84xOXM) zU5R^F;@*|GGKMQ-{2|64Vz@GfD`Wg3#xG*HGKMQ-xH85^VtgdVM`E}#hAU%yCB|1` zxH5(-V|*sYXJWWAhAU&ZGRA*mxN;+|+{lkM@}rHoawA{b$d@+a%8j^kBd%=3m5sQv z5mz?i%0^t-h$|a$Wh1U^#FdS>vJqD{;>t!`*@!C}ab+W}Y{Zp~xUvyfHsZ=gT-k^# z8*ybLpIyyo&*rnM`D_879l~c<^V!vWwvf-3@!8dU_G~`;J3f0FpIwbBSM%92K0B1p zR^iG`xN;M&jNr-$u8iQy2(FCa$_TEE;K~TDjNr-$u8i>W2tSYD$_TEE;K~TDjNr-$ z-;dzRI$T+YE9-D&9j>gym36qX4p-LU$~s(Ghb!xFWgV`p!7JWD z@_I7(OZLJ&H|_C{kNjWvr;pk5fjyt}%KVo1Rj-4F?i;*vj>$PK=lPsl;ho&kxo70w z*8LijJ8nYebHQhKybj7csQc&KzvX>3{QS-Tl+x;r$lv@@ngsd5y{K*WCTn{RxLX$ad`RYJQhA7 z`2Xr_s{b_RnBK4I*qGejzwh#MW#+eOW2TMy&6qj6yqd@M_xeW9>(Q}~jy-1QZ{P6S zqhsUahK!rA^L5z~gT^P181%2aj(Xrfc-0-X+w0gr9bI|spZ=ZK#O!02PB?DDX%n+| zeNDJ76+}A^g z<}S&NhQ{Qs%8k>H>%#e=Q^N)Ng|CInRbad`Tp6wm{U|(21;)F=hwCeT8m?Ap^Jn2B z!zYJ+6+Sg=|DEu;;h%?|2>&V^52*+gekbdgy#4ZS%rZX7dm?LY-jjKM&kAZM{%`bQ zC#qOFAoN+d3@(Q+!8G^^%z*3RE_&f^^FL#)N*Wg`QX5}|#?WB3@%K<0f3RHQ6DX9^ zDU_2bl-ntk+tj{@sML5s)}?S|=nz#YT0}2Cto3nqXn@M615`d8peNqm=RWVh4h>NK zbb#uo1LPeaEARMNJ@a;zPzR`jIzScF0ji)52p7X%&>!{&pAYW?)i4Ie!Z;WYN5Ro> z3>*s+U?Lm`$HNJs0jhko*V2CK@x`^YpH`00$`M+5s8){bY2`jz zxsO(seWaC{iYB2wwPeqrB|FbFsQXNgI94QWoJiU+Dz{94Q`66=aMEagY)37mM3x#f z>R`ODx<~6LoM8`V*khM71baK(>{{=4t$%f`PnhLV=h#Rw*?k`~6`W@7cCLs~WJ+z4 z#VUg=&e>pIBBrli70Ml(^O0{h_-0UNCgGd$o^K}prEk8_^UWPr56;=}@!zD_ z|Fim4|6Tp3T`iDsHNje}cI{~GX-CJ$Ud_K(8T4P<3*&ArA8Y=1oHYu^sJ?S-sFZK+ z=?N(Hte@p6xR7U^#j}3SvwrIO{^404?kO1VDHz}51)JTi%|`0mci9W0`&r+8Ka7+3 z?@2w+`oFdx#(%g6h9@w|bAG9R?QZ32tvtYU-lmoPJ?Cv&*X<_$szGJ;j@SJy_rN7ye?Vh{$Ja?+w^7(OA6?Iomd(-`W$^ESj?B}`L zZazAwN|rQ(vXz(DdIoDfg9*=Im$*;&^?u?J`0L`2zpm~h^*n#w*A=XGih1f@H_}{T zg!z)z=4)+c&5IW1@wFX&bx_&q1J#MIp^!h7J6GLi*%?&w*%b013V8yBd?tlFjzT^O z6JCV}Kd%z;;VKcgV8Edw9)nax{(|aI<(WEE@0#V!tkDn^KP)s7|BS>xBk|8j{4=tr zV)n?;3_oA5#`K4^Z`=9ONW3u;Z;ZqlBXPz^oG}t-jKmWobMLhR>pAc9;d#ov81{nx zus8S|t{Cb17xY~FrLO%V*M6_-u5is)xaLA!G7^`J#3dtf$w*u>5|@m`B_nakNL(@! zmyENmfY$|*y>4Wch+E?U_Ta9!CDsFaI4UI z&YD?)_J4X$_H$3NoMB&QIK&x-Iz!pV+>@+b?nw?$2v#Wu{atI%Q=7T#o|G8-pKAma z?$tjBbNJzf|*=YW`A9uT=AwYW`AfFQ2`$ z?2qHgK2iTQ+>?Eh{%g1=`y~C>a8LJFob4)S`=+y9lUdPu3H@>@Tp7Bu_u2VdHGiw- zZ`J&*n!i=^w`%@YO{1Kl-#WuSJ|%pwn%`CPyJ~({&F`xDT{XX}=6BWnuA1Lf_ihaz ztL9_Xe5{&}1v;^sk5%)rYCcxY$Ex{QH6N?yW7T}DnvYfUvGe%YSU$FYDCp5ESfqkQ zDp;g~MJiaNf<-D=q=H2%SY)5j-C8zAk3Lo(HjY*~#@>&|`h9};iQXrhZR?(S8_FUF z>hI2EkuzC@uAz5&-D_53RbCLl?z$rLRQ(IRVrAef>kP5rGix| zSfzqhDp;k0RVr8|m{Hq#k6ERHRVrAef>kP5rGix|SfzqhDp;k0RVrAef>kP5rGix| zLRJo%P5Ufd2Eojl`8d_q_fc(qANA_@34Ia1M&Lv#;U_ubr`D_uxbIT7O-jos}`{80jzpd)>zgXXU6uJ(2=aVFRLDz zHPQR2EIyS5&-Lt|4;OekFJbLV;Yv^9=RLu@`dk647O-jos}`_o0jn0UY5}XB%&I4| z>M&L zFjgJbW7T0jRvpHw!&tR|RSQ_PfK>}vwSZL%Shavv3s|*)RSQ_PfK>}vwSZL%tW>^> zcDD^%vSamI6TDCKekx2gZaUZhpHFdIV6<_G2=JwFW$3WpmeKlAT0g4y zQ2RqYriTp{{qd>m5zobkH_i!uy6U4-dkM zrN+qz!J(mkd9PY+Kj1&{ogKd5$nB0gtmmlrIO?#_1^S2)ymJSO@aBHJxgT%t z$D8}{=6<|+1aBU}n@5CZ!1ZvKUUQ6gb?;DciuMlG-hfwzYHz?R1GV|n+WdKK{)#q# zL7V$)^BLNF28({Bw?*}!BY5)&-aLXgkKoNCc=HI}JYq)+cym9!=zctU1dkrUqet-Q z5j=VXj~>CJNATzoJbDC=9>Jsg@#ua$x*w13r=RG@qxCJNATzoJbDC=9uc~bWy@H$ zjAhGMwv1)Rv+Q`59nZ4kS#~_jma%LZ%a*Zh8OxTj>==GJm30TQ?x%TE&;y^%x`(jt z*{pjA>keSuYSs-R3@5YhWY)cebx&p8Q(5;4{lyWxS-6aa%UHOKh09pDjD^csxQvA_ z<$;&7@OTy;$iihTT*ks>EL_IIWh`9A!euO6#=>PRT*kuVS$I4Pk7wcWEIgit$FuPG zo<3td3y){v@hsfE|H>%u-97Pm79P*SWh`9A!euO6#=>PRT*ks>EL_IIWh`9A!euO6 z#=>PRT$ZWl8q{hIs=KZX4PdjQ+3R5T%4e@?whHW1z&2sF8P)4qw%dh%pjTh2{bRL% z>@GbgheU6r#YkUn=cVp> zse4}Po|pD+jeA$>-j%v{rS4s+dsph-mAZGO?p>*SSL)uCx_71SU8#Fl>fV*=Q-X@V zaw*)uI`?lI_1w&6A5hyL$mSkpjMWnUtz3q>%ziO{@#HL*Sr!K_k)S)~RuN~L6MF?k+(8{=PwlnRA>Qn&2ruvez?}*;mQ< z`;&JZ+AHfgW-sLFgit(HuI_=*&LSU(f|7}YZ{IhXm-wu@+ zk}4x)*)3+6RTL_y zg`5(FimHd4(&G)ndPCjKpxVo4+>1|V&UA@-0++&-dizhTVjU{f(-n&Pd|1VL;BIGZ z)<*=@$G16pmi{5#bM&_y{VnZz_mhuqHQ(6GioOqzK0vH1sJF9D21AE9aae96y4W%jF|BR zI5qw69{o*LcykvU@5{z-iPhEZJo?F^(WlDw=vC$2buVV$S9D_!sFe&c;jB!t-C(_z+Oi#?m2SUk;6Sl4#o~aZJJ?@Jj9XvIdVTo zF8i1x=Q(non8-dmj~?_vAJ(q#u2~<{xC>?lHtc?co!{ESbu@}hHd=oY%)d1H^t+j! zfA?ek^ZNINY%j9x7^h<2sdjTZ*RyfH_X|8#SIX|~j;{ul^MhD#6T3HwpgoTX$oyWg|?qU+fOlinj*?Fg|?p}$})wvpOT4zesu4@J%cu}#Cq2> z$~BD$&Y$^guy5Vg(6OPR_5>U%Lw;!JI5-|ofD>U7oCGJsWH<$ILg+L&9nOF=VG5iD zXTwxD2hN4_;C#3MJ_Q%TMeu337(N46_{-Rs%s<|ZB z$tor8)aTr(Z@W|9cBj7VPJK!3n?Y*d3<@mP=jWm0`#cyL+UFtoJv)x{Z<+Zr00Yp0pqEzk}f zkc6$!2`ShHZ^JwAF1!ct!*=L`55(OEnp4;h2E!0I09c+kUBsI%;!VMv!$rL5BHnZn zZ@P##UBsI%;!PLvri;|`7^I%ZAoV;3spm0BJ&!@*-@tF-0r(v}2oJ&U;bHg#JOY1& zneZsg0`^ePV~~0tgVggFq@Kqh^*jct=P^hqI+iMkkFAvlpi+-5bUzLV-8^VIipXE;Tr{3=iV#B<6nv04+#Zp zK=yJEPjOXWbPum^4`fg@stkSr-(zv;>O#+YFfUW6)rDGJsMUp9T&Tr`T3o2b zg<4#w#f6^N63=Ui=e5N1dQMO8e=7^z!veoxfje2?o1WJa&udA>5~I9#M|Mg)uXnIW zA&V5UNFj?9vPdC|6tYMmixjd*A&V5UNFj?9vPdC|6tc$Y84Fypi|-FHlQ@*!yRYC* zS8$6fxS`iQxXU+B!3>948Sq)S3@-P&LWc3@pxcfEd+b=;W5;54EdCff7PDh9I~KEJ zF*_EsV=+4xvttk;3w9zdX2)W7EM~`Ib}VMcVsq!mBaieIziKz1D1W5*>~IPlRRUL5#nd5>+&*|z*+Y+KH@hC z!Ag)FbJ-{H$sN()i`nhR>~;j7Jfg=ZkLa;m5DgA`v>nml-Jk7Gj^Mr&I)dHG>@D4o z?f#X>?GgO)2!444zx;BK?e1s0zq<0jvEAcr_bawLf?pod%Thxr#4W@#QMMT*a5G_;Qtd@UkZ{@ZA$# z)fKM)QrG|6URSp_dsp$*D!y99SF8AH6<@95t5tlpimz7j)hfPP#aFBNY879tV(+PZ zb+mq9Aj@6vsr}F!gSm;HYvt~q7w&DVK3AJB_=LHGjMx1-wAa7nbqB~W92$yf<)c0K zH|WE=y{lW#H2lY2^`p>utvfrzqha?j>>h@-ZU#>q;#nKg^Q;Z&dDg-`_ciPj;g7km zVJ!~3uVME!?7oKG*RcB<)<+G|>L9Ns?7oKG*RcB=RiqZ<2f7RIUAC>-=n;D^XL#B|9ut-yYFH5J?y@R-S@Ej z9(Lcu?t9pM54-PS_dV>shu!zE`yTZ9Cuex{!ru4NRh;4;+|qLex4DAvxPt3?dD`v1 zd7@F)Vd~j_7A}L!_5N3c`mUm{e4O3ORn-yy{$CdP0tAxjue2mAH z@VF8lSHk0V&8&PWRLx@lT1MqSE!qzT!w?yK-SLlKvfykMoXvuNWWjrQTu@n{y2scv=@XZz}1{&$E>x1loXhshc^ke2Iyw$JNzmmhcBgEP7}SE=XcWCQ zvt#BqvCM5^ncIB&U7rs2qR7>w-&E#U zdGei;RwzcTHqP&kVs+19_DzQRS#ccG&Mxudc&3tlurIJUSI;bGPtJDF4Cm&s8BWLS za3}j%sd$vR?D6S2YW*x!>t|t4%j$eP*zt6kt6A@A*1MX`u4Yr_YJ%(k@SEMX`0u|_ z=-Qja#vc$>ZOoi+w{L03{^H=j)s}>|Y}S?!te$Q$zW&5-TKRB(sLv;UGpO0OW8a4c zZTaZF54}I}@jF9YX_e^Bc8=Mmy84e*SO2lqqH*_Py?R}7mDS@atH-tLeD%8CR*>T#9T&&V1K`}=ta8~{VjI1KYX+Gc<@6t`&lOiWJ+5+kyl(zkpP>#{TxImQ z8eDM|(HE=16;}~Go}J_8y!07rZ^g6KTFRaRYAj`|Cy;H2*=+R$)ZJ=TcWZIZxb&~o z-TIZfTfb6o>rK^U-c(KIP4%|kRBvl>?h=T?D%hA_tlrk*uy(4o6%VU9pvuf*wYK7_ zpU3T}vdxYv+tk#Gt8)Ifnp$tGI@7AAR$P_yxGLvyRnFt8oX6GEimOD^kw4!od^q${?e-RHaJO57+irG$vo*MF*57V5!{26xzs=g)cC-9# zX8D61Gd7#)@9?Arvl_wPS)0x3w^_UWzM1`$^|o8Bx7})nzs(GPTi>VBZF_X@iQ1;t z)dyPfdhT_e*_+ZcwWL!^W@<^NmUL=KrcwXqOexE-Rp2RzSO~fOc5{?Xm*4%L>>o zD`2~tNfhgKf7Cw%t0|cI#l>@?L&idf zjD-#v3mq~RI%F(#$XMu5&*=j_>N2k*mn=zWSg!U_Pi+ptASIu$-rG4Cl*UE;g%`$pZC61U++w+Sa{S-XW zL4Cx`89#E=(Y@MtSWo*Vex!Z>?5IIs(aUOn-eI+j#XLp3TkM}5G3d8e=xP4pnt~mI z+SohpjxBe`J~5jF^R-d7EA(&;nfg&d4;N*RC`}pkO)u)3ma@x27Jfa`H~rCP>2k_@ zs{cKgu0CI__CfU23VLc2J++mNs-vUo=%Q3GBTw^eQg5`4rm3@=OPlu*xB~$-6l+>(CFLmXm$3+>a}@ zY>EmZH>x0VGaFnk-($22eP?8!`N384ZH~&Gn*LMvdFlOB=qp!6JuA}v>hqI6KPef|XHlQl zKJWEC%zVn0`q-jZ zY4_~3>xZ}Mhqv@ERjNVttXoX5fD^xOCp_0)Gm5f%XWVAvhqZKL{y|0qd`zjf&P|0Y8 zN=EOiWc0pDMk}c5H>m2@DeA4%^j2zmD>c0}_vfmTTxU|9&U?7oo6c`*i;O70-6mcX{)P6g*4{g{ccN>Vn&G}TJjpdd zU#F)i*7FVU%p59LdVKmW?Y~$5-RaJ@`qUPmYBg5>j<&WMt8aAeT`X4Qe~L5NRzY4= zFrJS2#9E(dH=19qWpD31Q_!ovmicX&&ju@S7iF@py4UF*YAoHoRyXL4gJ{NM&b{*r z^~Uw=ALP!x<2tsmeUj~i9Ik)JoBD?{u5-rCAGxNL&Qt%9YueMXcgBl&>bvgUn>=+@ z=K6O2kC~i*7GvteYIm{P3iIRVVwC^c+}JOM)ZFrPraYZ*hTbp+Sb@D7{Jd7Zo%Np3 zjm8XH)nnWv{S#L*-#y-%^-a8aJqzEJex=V3j0YC#2fO>|_tQITw1r$nT%=eu>{z9?h}VH|PGWyqw=;4bAzjpC8C7$oXAXSwCF(hH7$u6gnmME)_$5ZYRqFLi6&5 zhF;AZ7OKoE@$>M|Kk`cbT<+%zf3NiOC_f+K?}vse#l6nUe5^`Acq^;O*~8}>-w8QNO~?}Mma`~TWm?d{M=3iDM}ychZZV6V<4 z{`LkB*{W)8C$4=beVgdgZT2UAFRPD8;U1W^pHW?bs;a6t+5up3-+Ads-{z4ye~KR6mNPOvD`ylO0*68s90rHO zXsCuUFc!w8AI}-@{RlV`j)J4%7&sOtz(hC>j)xQAM3@98!O1WgPJz?l^mMy^zFj{* zOFutLKi{sOZ`aSy($CM*&(G4&&(hD&($CM*&(G4&x9jKI_4Bjz^Rx8x?fUt4{roIZ zsK-U29?!Yl&sU`H%=sK#nf{U8%4YD48Fnn2k$ZM}eeP5^2hN4_-~#v*TnHDzb?LWr zzXjLBx8VkntM9;#@LjkGZcc9zomrgwJ-8LV54XV&z>e2AW($tlB4V>x#AdPmiI<9Q zMMSqE_6vT`e!=hAFZezC1;3Z~eEQw|yVCFH-%X_lYj)n%zdnd(*5aA9`q|&BHXGD{ z4BPME6aH7P(ub-WCl_}-jd?`+x4wIy?|vRf4aQM}a8!`XH`u7BpX1F@aqC4Dw_bGI zaky#k?0dkzmUNDpL`Qo?wxGTWyLDG0n6LNBs5+T@{bcU-6IJe`y6j!@S?-n(JU$aA ze%hykc=kKalkbz6?BcAS`Q#gR5xg;UC{)4Wsw9qvY8V4!VH}K4UmQ9Dj)bHAeheII zAEpT~5sri7;RHAl>=GtMQ7=YOFGf)>Mo}+DQ7=YOFGf)>Mo}+DQ7=YOFGf)>Mo}+D zQ7=YOFGf)>Mo}+DQ7=YOFGf)>Mo}+DQ7=YOFGf)>Mo}NS#4~tl`lisARnWZ(ro&g^ zzg*kZ@HM!`@7KEKuY3Q7ir3$S>)>1PZO6F5{!-t88{xZf6Wk29!1v%*_&(TQC}e*j zv5qZ0I~LZ7cWep$NE~Q<`fzu4kvsdm8H7X3ARHn>KU#!-w6#SOROA0_)+FyIc|TdD z{?pPYT4QvgyZwf{-RW)zyB%JewK2WOPKMX^alLjke8EnJFNlpah>bM#xmmw*n`+Is z`@cK<{FC$@eeUtIUD^BG@An7odiW6h9v+52z$5TSm6Aq0KbC=;rH+``~e<;Kf+9S6lTF=@HqSl{tQpRY z0#Cslm9x5Lh(SFx zKqIV%HP8gwog0UBupSby0o3XrHdaxC*AjSK&JN7F-YfIQ$*B8E%2^!L9IpxD9>)KZHBr&h#DX zyWXL`>mA{{fuDze3O|E;;OAidniyPz7+ixGT!R=~gBVF}MaXxCSw}1~Iq>F}MaXxCSw} zhOqr(#o!vm;2Ol>8pPll#NZml;2Ol>8pPll#NZmj&#QX=0@T0)coANLh43=e!mIEa zEP~fzF)V?l@CGb{oQ$ZJfWnAe%UR!!Y&?cR5--TSV!d*8Kr@7gcz zJ$N6sLsxoHzUM5flcH*(sG6v$_e16Ob*-RpD~&!!iY6XHSse;haF{6j;dJq6sD?2x z7RG`7U$IOI%cQVO3d^LhObwQ)!7?>irUuK@V3`^$Q-ft{uuKh>slhTeSf&Qc)L@w! zEK`GJYOqWVmZ`xqHCUzw%hX_*8Z1+TWoocY4VJ0FGBsGH2Fui7nHnrpgJo*4OdQLk z?3>#fx(qIdE9iIoA%w1kFTfY!Oa5+uO7rop_RMX?NX;0j86!1gq+q|d6h=y6q~_2J z|9`EYzwYO6*l+ina2Azs6XEDPHFis7|slhlk7^eo~)L@(%j8lVgYA{X> z#;L_PwHPOreXY640q{b)2Gi8obGHNA)L@$$Y*T}6YOqZWwn<@|6t-!_HqCn;?LuAHcoo7OdHVHCwP|3)XDGnk`tf1#7lo%@(ZL zf;C&PW((GA!I~{tvjuCmV9ge+*@87&ux1O^Y{8l>ShEFdwqVT`tl5G!Td-ye)@;F= zEm*T9_qlXy?tFM2YRtkefEVE9R{gF$OBXblFf!Jsu5v<8FLV9**2T7yArFlY@1jbqR_290CTI0lVl&^QK- zW6%@^O<~X!22Ekm6b4OU&{VkC%CEhkKkN;B)IPhd_Sx;Q&u&L}FbsiAm0Rz_z>e$T z5*Q9;a4?j^C^!VF;BcsRoG~yK#=&?v3XXUd6X7^G9!`Ks_EtR!PKHzAG&mj3 zfHPqVh|yy8W~|a|$C z7OU4{^;)c6i`8qfdM#G3#p<aAG46|1*m^;WFjiq%`OdMj3M#pwZWtRBVcQLG-t z>QSs7#p-{->VLuN&tmmwvHG)E{aLL3ELMLOt3Qj?pT+9WV)bXS`Xa2p2&*r`>Wi@Y zBCNg$t2blx6h=>B^b|%SLzCeS z%?PiNu{LCO*Mc{g-iEFgpLb*vfRVmFeOk)5Sy9i-)Wi51B3=GF?1my?Dra z@sR1_A=AY}ri+J67Y~^(9x`1#WV(3Bdhw9;;vv(;L#B&|tQQYiFCH>Ivy)lRE@mqD z*QnrMleg<`WHr0(Mplzo<}(Mw2-tNuvKkfqckV{kr;ic+pF=rfjk!<=`@;}801ku- zvDQP(9?0#Y#~SIe1U(j^$0GDtgdU5~V-b2RLXXwaV|Daco&2oTG+Bfui_m0NvcW{K zmpx4urOBc+S(GM=(qvJZEJ~9_X|gCy7NyCeG+C4;i_&CKnk-6_MQO4qO%|oeqBL2Q zCX3Q!QJO4DlSOH=C`}fn$)Yq_lqQSPWGiU0C{322$r3bKf+pKQlWm~Mg6id4=&}uT z*#^2SL6;@yvIJe0pvw|;S%NN0&}9+2EJBw>=&}S|mY~b(=&}S|)<~B%(q)ZwStDJR zpv$6kS&S}=(Pc5ZEJl~b=&~4H7Ng5zbXklpi_v9qx-3qYt)9TgZY%N_D&q~M- zY!9j^Vt&UDxOQ$91v;>_Nr_-WzT9i(U(rHmTElQ_F>9i=F7NygobXt^7i_vK@tLfY1 z4z8!yqV!sVUQ5txQF<*(uWi_4VY;1Wi_&aSnk`DRMQOI^9*wdw*4p!AgZW*#ZFF0L zZcET@F}f|1Bflu;Dwqymg=;`&M2^ge9GMY0G9z+iM&!th$dMV5TLAnwS1x64G3*8X zVQ&}!gJ3@x417G7kLU97+@UZG_iq17U^T7*`M&}tD{EkdhBXtfBf7NON5 zv|5B#i_mHjS}j7WMQF7MtrnrxBD7kBR*TST5n3%ut3_$GD6JNy)uOaolvazS5jwgc2AI zWpFT*!zefes^IWYA6hLzt0ic)1g(~!)e^K?f>uk=Y6)5`L8~QbwFIq}pw$wzT7p(f z&}s=O)grW7gjS2tY7ts3LaRk+wFs>iq17U^T7*`M&}tD{EkdhBXtfBf7NON5v|5B# zOVDZwS}j4VC1|w-t(KtG60};dBUyr0OVDZwTCI^*Yoyg0X|+aLt&vu1q}3W}wMJU4 zkyeY*YB5?ZMythWwHU1yqt#-xT8vhU(P}YTEk>)wXtfxv7NgZ-v|5Z-i_vN^S}jJa z#b~t{trnxzVzgR}R*TVUFAEl#V&X|*`57N^zXv|5~2i_>axS}jhi#c8!Ttrn-%;5f-y-x|gnobS4r{CiATb+EVt+KWDkO!16>$ON`NU;pq0kU5XRp;vC=KtlE$qGrDuX@hB zRKlFpTV@^G%$&bz=Da@J&MnzzrXR{aOIFC#^rr0d(w)2H3S60f#(d68W|%w7j&IHT zrCftR)ddw##!!AL=R5!ZY{i>B|3B*9241Hs?H^zJ<-Yg6_rCYO-(L?p9fu?@$4L@G zh(_il$w-n+HAX#>j3gteBpG8GsnqlsnWiZjBS}V*q&G=2k|ZP{Ns=Va{(skZ-^V#e zRP+1I^ZY*ly*~GKU;El?uf6wL*IIjB-*v6E@sykKl)Leid+?NB;R^r26K;XGSQ7qW zSlI%3i%PsI=8Y~G*o|CxvH zUwP}jIUYtO;Vtu{o442d3Udd9x8K`_v_F$4c<`@A4^p6qB|NNG?tOtiB{!u19bz8B zy==m@VaIqtCD8*q>Be+E@;;IgknVnXCe+xF@>U+%f+z5=y^H&}`iVE3aRgsU6y5>v zZ9MNcjQusz-3!@1{7}bnM_>781Dh0hzUAI)xN~@{dkb*%Q}7>n8=*fnHl)S;Lhny_ z8w&UP0iJF*_Ky@&JAxP>tHP*C1%(ah zc&*KYhcDue@ty(Qha8%N{{tw^YW@9+bxrCo-c5*8Q-2SjE(2|V_I!ya*ydrj1M*^n zpYK%{LVjU93g@qdKku;(*OF;M7o-UP?;JZMwP_$qVzc)!=;b&nOQxIG1=NoX%?H09 zDZYTaT@I~9t)c8ATwOj9?h^HAD{2^!5FYseCHexngE)q3S5b1PTU8tG3?+=CN1?sz z{5;1U`R$Ic9p6YT@Z;miR>Z8tZ#&}eL@uqtRku{7R{igN<28_bUL3#Q;+x2lzt8LH zwZi{id>c^i@AVRxJ0{SQUW(Gi_!{^)TG0C5g^<)o>~SpJf!=kvBEE>qbD)j*-;Cd9 z$7<^~J_FiG9{a+thlueN&ihd2Htu{AbQow7p7KLH1#7Awzi`&AJa;hSz6cLrY~Bj! z>F@D>w9v*Jg}%wOUc+<0?Og@$G2vZ@Gpm#sh znhg1?c%#U4--Pzh#{ZXv()to?U`2V7;d1&SSj5uiNz@zmkmnzv@veewpf?d3iLaT0 zuavC_{-Jw#e*fOrK!4F1)o9m0p!Od`POZf{vNFDG%Xp_%v9SLwj~oV7MGK+9BUgxG zyq)W)=c(sm#rMwY`B-D-0`&sXRPC-_D4MAiYK16Md#dNVnQ^;hck;+#Oe0M@z+d>HspbPRkH*dopg>7d@i0czAz4pr;SQe7tfnP(}q8mV$t4(}@OKdgI zHqQ~;%yZ43iBHT6&5Ol;v$xq>d~5bGZx)Bm(dKPR9rF(JZl%QhgZW40H1mG*0j06M z$X=v0wcoJcP?{m9fCeJy@Sq98i`T%s0~KB_7V^)ACyS2NX zz*;^C_|^qN5+#O};8|u0%B(YHq<2xf2vt2F<)^XyY?NPj5l}BgDF#`JA(UcIVW=0Q zENzx$7-iWHUue1jQQpHrZ!&HcnlTDxpF-K+3VsYU zK&J-i)BqhC@R$e~vyCT3(0B^kU{D(jYJ)*-FsKbCv|*1hjnAPIA?U<@(65Ydg=HLu zewfq`1NvbJ!?d9#Cbh(-me|x1n_3cvmYk2(<-0;xT_cfNKs>opda`O0CgfoZ8)9U5TiEe)P`UUZKy+S(5MX!F`uP5&M8Akpl-K&xAWtBk?=afX;6?uLF(M95+txqD#YOhUkl zO9&>s8z*BG+cpZ;$5z@Y?XWuZxe8WNQrau+!FRx%8&~P5oQDaeF8|K(D~+av^1hvIA?XeyV(maexso0l41?9 zSSwPj2`SbDi#0)GO=!rPkYY_}$eN(D4rr_cI`zJxIt;V(6Y5RsO(L(t8wxdKlsXD^ z;}-Q6$j7K-z>mcmcZPbqdOOyuzDvCe^>YH|OxIN>suK}^k~#@;%m5IlsDD)d2+1_8 zg=eY{VReaw`mp*ij?ToYceeT@*1R*+XVqtgst?dncKQgcJ`vIH(C@%{PIu{dflkmT z;0v;M>v!YJITQ7X;P27zkzdfk8WoYii-BcwrHa7ILJ7PTcn7>}r&EEgfvqAR_%!e- zzRk8Lum`Ia)eqJePOuc~3nYRKv38yj{5JTl$g};f$M(A(+V87GJ=X1F*6I{%b&7R0 zW$Z=^UBo(B#G003O-r$+rC7U8XYD$jwJXNj6=Us+v3BXKUBMc)s}5_I#@eN^b~R+} zYG^)a&J-o)EOS2SLUS?b60EN>B6)`G4J{R?zG z*6YiL-p9&(xzJXu%XcciJ@~0GL%Xr|o*DWobV$_a{0#^5H$H?1@@{J{)>Qq%`by~5 z0qc;+Ti;?vN7#PTMlK08FdOZYFosz2D=Q`FG3-Sz1~b6X!#WN9*4^l9e~BJ5d_vHl z`U1TWpx&}i@k1NVm%YjL=zo_XjgQf1+kxIM#yeomu7gbkq#UWf2djrYos*@7d-)D` z^mF{a^Zq7#HSmk(hPykn`Ygoz09QQZ_kOD7lJhM<*(=8t_cJ}oOWOmpF8#Q8Vp!cL z-guU@?B4hCc#==O@#q(?_XgovKEicB@=k$AkxcvGkLL@nP>#5jB2O!!1@<#FuZsTc z93UD8aTVCKxX161YwN3H_*d|TBaP3|o+@pOonGgvcsLKwMe7&6{Ntaj&_k4c z)GxiiFh69!9iCXQ#bI&y+wo^r$qPrT`@{QjwImJVBzmYd4EprY9g(E=;=OK1S4_wK7{vRBmKCZ!Ve94 z^Bydox;S^McQ?{ojk4Y1{e!lTi?ZH}{`GNs`hAO@cRCIC4h)sLwhsI>SU;6sAOE&t zpG-sQSO)`XeuArh?L7&fC}?8g_&&_QfTfP3JMb)(DEqr`cOT-6%^vLx90ih9$OQgX z<#kONVzG`CY=RdHsegqzI>)vX-+v({bOvek#P3U>2(tc3%SK`_TfBCKIN$jHC!@ah zcqm(x%LhyYr3cGuHJ-arw%!Qn`WEEGRveKC*A7^MOOSs%Yo^L;??>54U6*M*1x+|A zktMmo@_U&m1nwDS{uOEsY$0eKEH@q}%7^iGS>M;oyYj6m{O_r{55`*yI}7Lp#%~Lo z!~p%R@GKAEoX>H;GCxowy;;ziBi$acf`=dJ|*Vj~L5-#BJBw@%?<1@8?SSepZBhKP!AcD{81y zsFPyI_p@Tk_p@T-{d~ESly7FGu6#2qP34@x?cqe<$h!`^a)z2yWn^&w%YGvvy4>@z2+wI;RJrq&wN zT9aC9Qfp0WtxK)7skIulHp1R7R_=uETGU;ax@%K+lhj?4x@(%xqqnJ3Ulr=B%HF2R z-lkTgx2aQib?UCp-loppW&j%eEo{-lSZ6w5eg|zf+4Bst=V`F#X|U&MQL{~Iwn@!4 zso5qq+oWcj?0K5(d7A8bV(mQiJWcjIE%rPu_B>7YJZ<(oZT38E_B<8#Jj3jHhS~FU z*z?0+WM|4gv|nPmUdl6o(DnBr;L zz-gi>CT(C1+UP)gq$R8oK`~)VCeQ;-!tOL_6-%t@6z~!+(TJCrw2-YD7P60*glQp% zh?lsukb|_4Beam~&^E>wpU_U`Sg$g)jg=a zGQ&EVV?B(s9wt~1i)+}fIo8GmYvZY`jXBmvgEcTgt5u=Z8fQH$W<4w-R%Eg^DuGu5 zuLxNi-+@IcZBdQrk;yulA%L)wiU^ZQ)X_(k zOrnlHo}|&r)oA5v#FI?oNhU2`ix#hS5{uWzlftxkL&TF@TD(D8yg^#L5n8+vzBB9a zomq$P%sOm+GHiV^Y<+TUeR8yQGi-e_Y<)6peKKr)6xzB<4O_Q}Elv?zhYVYX3|of` z+k#Ws7Mw~eG|oEju+FQj^GViugLU3uolnr(%+uP`Xl+JmZDxpvnZ(0P+MGFfv~Z-@ z7ET`^MX=-0OZ*T$GLE(#>kR$JnJPO4JuLKQ|KrIQ5-f~$VvOQ{azigzj^}Pb-W`$Q zf96_+(SvIHu3)SDr?2Lfd%vogCakgUu$?~fZuKsze9HT4<(KHwcl9oY4O7>vth}T0 zBcKrHU>v0@M!Rmo*=@as7zebypx3r$IyHINkpF@$a;%4soRe1a2G|~Q+~+M=lbg~1 z{%@RPq36yqbXsx?Fs|*}5f6C3V}4KdX2L#v3l;^u4Ka@Na;@vE^hd<1Wb`IjiFk6f z_Zj?N$FofHkKzt&SXtj-jQDX_hpX`h6oqlT{oc*e_K}-E#_RJZqt*5b;=@LSy+aQO zUo-IJ`{l?Z^q%%3G-nTyeP-{h^8A48vp zK({7Cwj86fk6=XkAy{=oF=B`NlAFxYstxzUvFED&s(+5{z2WawAvB(}C4Vbrm7Be$ z65aAQ*!$zXDHwBqpr)-}byWVtGL#s>6#Nc*& zqBRB{j<#qHB_~MhWY6!XSM?UC!oPg!zfD!qM!bU{#CilpY(P-O2MC(@5J4B8Aq2#i z;xKHwBcc-DAj5DkRyPVMA*=vlD>lCN<|?kJtHhKvR+7jnS&ZxDl|07&>MC`ywpp=q zD#rEdEA{cs>C==(7|}z(SG5rEo!~O1Of=ILYKug3ZL#)GQLeq9EfX!ZmD+2fwf2_w zj%cg>OIt5GYVT|Bi%!~h?Gw>i`&8R0&ewKppNnqVK5d`4P&=S~EqZ9*Y2S$o?WlHC zT%>uLCwl6du8WKH^Yrt?C3+9Nhv*&H9M~)_4SXK>T=WTi9r#-O!kBB!6@87h#=GJ& z<5Od&xZF5u92Hks&8=QyfYsZ&UW~VHu*Qmqtp}{R;wfvMwMe{dEw)}1tE`u-m$2r` z%hoI6UF$V`1AD!-+FC8%v({lfCYhJNJW0-K%vl{dyC3=c6+%!PKrqDD2&OoQ5E9=Y zSmF>uNPLSja8L$Ez#m1hQ5uz4vjfG3)uR;!mbRiR@MKT|N&xFJ1(hHq21?6eX}K(| z5KGHJY2mx|N?gI0U=(=8ikOm8QuxYT8l@OvDJEEoX_jIdr6|AdeJaW_#j=c{EKkE( zjZmU#mS~zKnqi41QKAb)NPA9uPB_{klx_f}yI2_7KT*aO%6KX0i`t7Ks4YWz2TtbbVZg<(BoJtItOf%P1|f3OIeWI>bg zZ2@a3^eIGr3PYb>#)>N|pjB~dRfJlVpjJs=gQr<*4e_zq4!zldV2V!>f`$4jHK~l6 zR1V$w7P!iH2x00?6Y5Pg2X!OpT#QBDCbHKT-@ahg)1lt5lz0mh~@P#VAspdqxxQcg#Wx0ExKGter? zdLLDqDor72t~AH@p{1t)zK9J}r7=+zg{VqnqAChel@w7Gm7W3-Vk;^=1tLUPG$Je- z5f)whi}n|2$sBDC=v-|s=zMKHsMNnQZ7DSGbZxn|T!gikwU@!K&{l{>+AG>CXn|I0 zD4OlX4}wb{gcxf`QDARiFTOe@ThsEu!N5VR1N2Sc8xaf~3ZUgOS{bcG+PKmf z2zrBY1HS*0G4W+2^Gx$h&`Zoq#OdZOCcaN&PBo|Ei%Nes|BP|_1?ID$|1|#zy24xm z&zzO!N)a^QGGPmt@0ss`zHhz{y35>!Z%J7p3p5={!-qW^%3@T%KGw{$LZw(WFA-`M zY6jXl)EScgp({i%G$1qp@oxx?1b=hrX7IO$ZpG1Yp>d#FLR&;>XlG~_z6Y}}v|l9g zHn;$_cf18Z4%TYFK9{jRm$MExK^`x#wb=| z#OizY>-OvL`cXr@q)LQlTkV0dUWA^-N?3weF9@S%@58>@2z%pYj9@Q?_heUCy>~(O zGOWS+7zukB9>TLkxVmpF{ueg%Iq$+6QP?o$Iv5+mr{g?9iXzvlo z-oq&PAy{Qwaraxj)8&!>7h6@Y&wHZ!>L=*u&xED=7Q?zoRHX##`5UZnf82)g?(3>W@J5|jwO1vt>JwMlzg5S7 z+JE)70yuOHOnIb>ptua#+dpu>M|QtFpRLXXJV(+@O

|k+gQT-apOzFy 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 literal 0 HcmV?d00001 diff --git a/fonts/Lato-Italic.ttf b/fonts/Lato-Italic.ttf new file mode 100644 index 0000000000000000000000000000000000000000..b23256ff5326c7145e9b9d28f9282ee35377e57b GIT binary patch literal 723544 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

R)ev>YKQ$*JE|Y!V?FCyyQSQr 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 G^nU>BKycgu literal 0 HcmV?d00001 diff --git a/fonts/Lato-Regular.ttf b/fonts/Lato-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..adbfc467d2d0dd5cdf2b942e5d0cf3aab2b73c3a GIT binary patch literal 657212 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 z

    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
  1. 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 Date: Wed, 30 Mar 2016 02:23:48 -0500 Subject: [PATCH 039/240] Leaving Lato-Regular.ttf out due to GUI1 reasons Eventually, we will add the font to the order list. --- data/hardwired/fonts.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/hardwired/fonts.cfg b/data/hardwired/fonts.cfg index bf193e5fcc64..435850e8b8b4 100644 --- a/data/hardwired/fonts.cfg +++ b/data/hardwired/fonts.cfg @@ -4,7 +4,7 @@ # This is marked as translatable, to allow translators to # provide different font orders: one just has to install the # missing fonts without needing to change the gmo files - order=_ "Lato-Regular.ttf,DejaVuSans.ttf,Andagii.ttf,DroidSansJapanese.ttf,DroidSansFallbackFull.ttf,Junicode-Regular.ttf" + order=_ "DejaVuSans.ttf,Andagii.ttf,DroidSansJapanese.ttf,DroidSansFallbackFull.ttf,Junicode-Regular.ttf" family_order=_ "Lato" # Used by GUI2 only, hence no [font] blocks for these. The font files are From 808c3fb77919c31bde57c81a11e8e157e86f04d4 Mon Sep 17 00:00:00 2001 From: Wedge009 Date: Wed, 30 Mar 2016 19:06:15 +1100 Subject: [PATCH 040/240] Updating load screen file locations (vcproj). --- projectfiles/VC9/wesnoth.vcproj | 68 ++++++++++++++++++++++++------ projectfiles/VC9/wesnothd.vcproj | 12 ++---- projectfiles/VC9/wesnothlib.vcproj | 8 ---- 3 files changed, 60 insertions(+), 28 deletions(-) diff --git a/projectfiles/VC9/wesnoth.vcproj b/projectfiles/VC9/wesnoth.vcproj index fbc3155ed62e..3d6344433efa 100644 --- a/projectfiles/VC9/wesnoth.vcproj +++ b/projectfiles/VC9/wesnoth.vcproj @@ -8167,6 +8167,62 @@ RelativePath="..\..\src\gui\dialogs\language_selection.hpp" > + + + + + + + + + + + + + + + + + + + + + + @@ -23315,14 +23371,6 @@ RelativePath="..\..\src\leader_scroll_dialog.hpp" > - - - - @@ -23639,10 +23687,6 @@ RelativePath="..\..\src\resources.hpp" > - - diff --git a/projectfiles/VC9/wesnothd.vcproj b/projectfiles/VC9/wesnothd.vcproj index da22d2da0e4d..63c9434d9013 100644 --- a/projectfiles/VC9/wesnothd.vcproj +++ b/projectfiles/VC9/wesnothd.vcproj @@ -1,7 +1,7 @@ - + - - diff --git a/projectfiles/VC9/wesnothlib.vcproj b/projectfiles/VC9/wesnothlib.vcproj index 4dc03f421366..b92afba20424 100644 --- a/projectfiles/VC9/wesnothlib.vcproj +++ b/projectfiles/VC9/wesnothlib.vcproj @@ -401,10 +401,6 @@ RelativePath="..\..\src\libc_error.hpp" > - - @@ -421,10 +417,6 @@ RelativePath="..\..\src\log_windows.hpp" > - - From 60653e2632f193d8f4b1f78b7610394faf90f936 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Tue, 29 Mar 2016 22:49:57 +0200 Subject: [PATCH 041/240] ignore c4477 msvc warning. --- src/global.hpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/global.hpp b/src/global.hpp index f26c3bd380b0..88960e89b2ae 100644 --- a/src/global.hpp +++ b/src/global.hpp @@ -31,6 +31,9 @@ // Disable warning about deprecated functions. #pragma warning(disable: 4996) +// Disable warning when using time_t in snprintf. +#pragma warning(disable: 4477) + // Disable some MSVC warnings which are useless according to mordante #pragma warning(disable: 4244) #pragma warning(disable: 4345) From f9ee42c80d4a754e5be70f54bfd9dd676032fe88 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Tue, 29 Mar 2016 22:50:38 +0200 Subject: [PATCH 042/240] fix linked groups in treeview nodes --- src/gui/widgets/tree_view_node.cpp | 11 +++++++++++ src/gui/widgets/tree_view_node.hpp | 1 + 2 files changed, 12 insertions(+) diff --git a/src/gui/widgets/tree_view_node.cpp b/src/gui/widgets/tree_view_node.cpp index ddb60599af0b..b14ce1dd0b5a 100644 --- a/src/gui/widgets/tree_view_node.cpp +++ b/src/gui/widgets/tree_view_node.cpp @@ -808,4 +808,15 @@ void ttree_view_node::select_node() label_->set_value_bool(true); } +void ttree_view_node::layout_initialise(const bool full_initialisation) +{ + // Inherited. + twidget::layout_initialise(full_initialisation); + grid_.layout_initialise(full_initialisation); + // Clear child caches. + FOREACH(AUTO & child, children_) + { + child.layout_initialise(full_initialisation); + } +} } // namespace gui2 diff --git a/src/gui/widgets/tree_view_node.hpp b/src/gui/widgets/tree_view_node.hpp index e50d104cef48..6727be0c5b0c 100644 --- a/src/gui/widgets/tree_view_node.hpp +++ b/src/gui/widgets/tree_view_node.hpp @@ -221,6 +221,7 @@ class ttree_view_node : public twidget ttree_view_node* get_selectable_node_below(); void select_node(); tgrid& get_grid() { return grid_; } + void layout_initialise(const bool full_initialisation); private: int calculate_ypos(); From 99bbaaeff4b58d4e5ad75abd20614de918f8d98f Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 04:43:05 +0200 Subject: [PATCH 043/240] make loadingscreen more responsive to user input. We now create a new thread that does the actual loading while the main thread handles user input (and drawing of the loadingscreen ). That way wesnoth can still react on user input such as close game requests while reading the config files. --- src/game_config_manager.cpp | 21 +++++++++++++-------- src/game_config_manager.hpp | 3 +++ src/game_launcher.cpp | 5 +++-- src/gui/dialogs/loadscreen.cpp | 20 +++++++++++++++++++- src/gui/dialogs/loadscreen.hpp | 34 +++++++++++++++++++++++++++------- src/play_controller.cpp | 4 +++- src/wesnoth.cpp | 15 +++++++++------ 7 files changed, 77 insertions(+), 25 deletions(-) diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index 0629f6ad3a62..110a4757befb 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -89,7 +89,7 @@ bool game_config_manager::init_game_config(FORCE_RELOAD_CONFIG force_reload) game_config::scoped_preproc_define title_screen("TITLE_SCREEN", !cmdline_opts_.multiplayer && !cmdline_opts_.test && !jump_to_editor_); - load_game_config(force_reload); + load_game_config_with_loadscreen(force_reload); game_config::load_config(game_config_.child("game_config")); @@ -119,10 +119,17 @@ bool map_includes(const preproc_map& general, const preproc_map& special) } } // end anonymous namespace -void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, +void game_config_manager::load_game_config_with_loadscreen(FORCE_RELOAD_CONFIG force_reload, game_classification const* classification) { - // Make sure that 'debug mode' symbol is set + gui2::tloadscreen::display(video_, [=]() { + load_game_config(force_reload, classification); + }); +} +void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, + game_classification const* classification) + { + // Make sure that 'debug mode' symbol is set // if command line parameter is selected // also if we're in multiplayer and actual debug mode is disabled. game_config::scoped_preproc_define debug_mode("DEBUG_MODE", @@ -138,8 +145,6 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, } } - gui2::tloadscreen::display(video_); - // The loadscreen will erase the titlescreen. // NOTE: even without loadscreen, needed after MP lobby. try { @@ -493,7 +498,7 @@ void game_config_manager::reload_changed_game_config() void game_config_manager::load_game_config_for_editor() { game_config::scoped_preproc_define editor("EDITOR"); - load_game_config(NO_FORCE_RELOAD); + load_game_config_with_loadscreen(NO_FORCE_RELOAD); } void game_config_manager::load_game_config_for_game( @@ -529,7 +534,7 @@ void game_config_manager::load_game_config_for_game( } try{ - load_game_config(NO_FORCE_RELOAD, &classification); + load_game_config_with_loadscreen(NO_FORCE_RELOAD, &classification); } catch(game::error&) { cache_.clear_defines(); @@ -541,7 +546,7 @@ void game_config_manager::load_game_config_for_game( previous_defines.push_back(new_define); } - load_game_config(NO_FORCE_RELOAD); + load_game_config_with_loadscreen(NO_FORCE_RELOAD); throw; } diff --git a/src/game_config_manager.hpp b/src/game_config_manager.hpp index 38c31489375e..0b560c75b42c 100644 --- a/src/game_config_manager.hpp +++ b/src/game_config_manager.hpp @@ -59,6 +59,9 @@ class game_config_manager void load_game_config(FORCE_RELOAD_CONFIG force_reload, game_classification const* classification = NULL); + void load_game_config_with_loadscreen(FORCE_RELOAD_CONFIG force_reload, + game_classification const* classification = NULL); + // load_game_config() helper functions. void load_addons_cfg(); void set_multiplayer_hashes(); diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 68d06549343d..3bc9bc2821a0 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -1011,9 +1011,9 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload) return; } - gui2::tloadscreen::display(video()); - gui2::tloadscreen::progress("load data"); + gui2::tloadscreen::display(video(), [=]() { + gui2::tloadscreen::progress("load data"); if(reload == RELOAD_DATA) { try { game_config_manager::get()-> @@ -1022,6 +1022,7 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload) return; } } + }); try { campaign_controller ccontroller(video(), state_, game_config_manager::get()->game_config(), game_config_manager::get()->terrain_types()); diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 8825aa1ff33b..023a78e37ab7 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -17,8 +17,12 @@ #include "gui/dialogs/loadscreen.hpp" #include "gui/widgets/window.hpp" #include "gui/widgets/settings.hpp" +#include "gui/core/timer.hpp" #include "video.hpp" +#include +#include + namespace gui2 { @@ -26,6 +30,8 @@ REGISTER_DIALOG(loadscreen) void tloadscreen::show(CVideo& video) { + tdialog::show(video); + return; if(video.faked()) { return; } @@ -53,14 +59,18 @@ twindow* tloadscreen::build_window(CVideo& video) const return build(video, window_id()); } -void tloadscreen::pre_show(twindow& /*window*/) +void tloadscreen::pre_show(twindow& window) { + worker_.reset(new boost::thread(work_)); + timer_id_ = add_timer(100, boost::bind(&tloadscreen::timer_callback, this, boost::ref(window)), true); // FIXME cursor::setter cur(cursor::WAIT); } void tloadscreen::post_show(twindow& /*window*/) { + worker_.reset(); + remove_timer(timer_id_); cursor::setter cur(cursor::NORMAL); } @@ -79,4 +89,12 @@ void tloadscreen::progress(const char* stage) tloadscreen* tloadscreen::current_load = NULL; +void tloadscreen::timer_callback(twindow& window) +{ + if (!worker_ || worker_->timed_join(boost::posix_time::milliseconds(0))) { + window.close(); + + } +} + } // namespace gui2 diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index ed55b7a70c58..d60792755bc8 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -15,8 +15,14 @@ #include "gui/dialogs/dialog.hpp" -class CVideo; +#include +#include +class CVideo; +namespace boost +{ + class thread; +} namespace gui2 { @@ -25,10 +31,13 @@ class twindow; class tloadscreen : public tdialog { public: - tloadscreen() + + tloadscreen(boost::function f) : window_(NULL) - , previous_load(current_load) , current_stage(NULL) + , timer_id_(0) + , work_(f) + , worker_() { current_load = this; } @@ -36,11 +45,18 @@ class tloadscreen : public tdialog ~tloadscreen() { close(); - current_load = previous_load; } - static void display(CVideo& video) { - tloadscreen().show(video); + static void display(CVideo& video, boost::function f) { + static bool already_shown = false; + if (already_shown) { + f(); + } + else { + already_shown = true; + tloadscreen(f).show(video); + already_shown = false; + } } void show(CVideo& video); @@ -56,12 +72,17 @@ class tloadscreen : public tdialog void close(); private: + size_t timer_id_; + boost::function work_; + boost::scoped_ptr worker_; twindow* window_; twindow* build_window(CVideo& video) const; virtual const std::string& window_id() const; + void timer_callback(twindow& window); + /** Inherited from tdialog. */ void pre_show(twindow& window); @@ -69,7 +90,6 @@ class tloadscreen : public tdialog void post_show(twindow& window); static tloadscreen* current_load; - tloadscreen*const previous_load; const char* current_stage; }; diff --git a/src/play_controller.cpp b/src/play_controller.cpp index ad744920ff28..007d6a6146bf 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -224,7 +224,8 @@ struct throw_end_level void play_controller::init(CVideo& video, const config& level) { - gui2::tloadscreen::display(video); + + gui2::tloadscreen::display(video, [this, &video, &level]() { gui2::tloadscreen::progress("load level"); LOG_NG << "initializing game_state..." << (SDL_GetTicks() - ticks()) << std::endl; @@ -307,6 +308,7 @@ void play_controller::init(CVideo& video, const config& level) plugins_context_->set_callback("save_game", boost::bind(&play_controller::save_game_auto, this, boost::bind(get_str, _1, "filename" )), true); plugins_context_->set_callback("save_replay", boost::bind(&play_controller::save_replay_auto, this, boost::bind(get_str, _1, "filename" )), true); plugins_context_->set_callback("quit", throw_end_level(), false); + }); } void play_controller::reset_gamestate(const config& level, int replay_pos) diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 8115d255cdfa..bf33c793cb82 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -640,13 +640,15 @@ static int do_gameloop(const std::vector& args) gui2::init(); const gui2::event::tmanager gui_event_manager; - gui2::tloadscreen::display(game->video()); game_config_manager config_manager(cmdline_opts, game->video(), game->jump_to_editor()); - gui2::tloadscreen::progress("load config"); - res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); + gui2::tloadscreen::display(game->video(), [&]() { + gui2::tloadscreen::progress("load config"); + res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); + }); + if(res == false) { std::cerr << "could not initialize game config\n"; return 1; @@ -851,9 +853,10 @@ static int do_gameloop(const std::vector& args) } continue; } else if(res == gui2::ttitle_screen::RELOAD_GAME_DATA) { - gui2::tloadscreen::display(game->video()); - config_manager.reload_changed_game_config(); - image::flush_cache(); + gui2::tloadscreen::display(game->video(), [&]() { + config_manager.reload_changed_game_config(); + image::flush_cache(); + }); continue; } else if(res == gui2::ttitle_screen::START_MAP_EDITOR) { game->start_editor(); From 3df040502536606ae2ed76c6b2aa52474b81e138 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 14:22:40 +0200 Subject: [PATCH 044/240] fix wait cursor on titlescren. --- src/gui/dialogs/loadscreen.cpp | 16 ++++++++++++---- src/gui/dialogs/loadscreen.hpp | 17 +++++++---------- 2 files changed, 19 insertions(+), 14 deletions(-) diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 023a78e37ab7..0db775a3eaef 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -19,7 +19,7 @@ #include "gui/widgets/settings.hpp" #include "gui/core/timer.hpp" #include "video.hpp" - +#include "cursor.hpp" #include #include @@ -28,6 +28,15 @@ namespace gui2 REGISTER_DIALOG(loadscreen) +tloadscreen::tloadscreen(boost::function f) + : window_(NULL) + , timer_id_(0) + , work_(f) + , worker_() + , cursor_setter_() + , current_stage(NULL) +{ +} void tloadscreen::show(CVideo& video) { tdialog::show(video); @@ -63,15 +72,14 @@ void tloadscreen::pre_show(twindow& window) { worker_.reset(new boost::thread(work_)); timer_id_ = add_timer(100, boost::bind(&tloadscreen::timer_callback, this, boost::ref(window)), true); - // FIXME - cursor::setter cur(cursor::WAIT); + cursor_setter_.reset(new cursor::setter(cursor::WAIT)); } void tloadscreen::post_show(twindow& /*window*/) { worker_.reset(); remove_timer(timer_id_); - cursor::setter cur(cursor::NORMAL); + cursor_setter_.reset(); } void tloadscreen::progress(const char* stage) diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index d60792755bc8..02f62f2aadf9 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -23,6 +23,10 @@ namespace boost { class thread; } +namespace cursor +{ + struct setter; +} namespace gui2 { @@ -32,15 +36,7 @@ class tloadscreen : public tdialog { public: - tloadscreen(boost::function f) - : window_(NULL) - , current_stage(NULL) - , timer_id_(0) - , work_(f) - , worker_() - { - current_load = this; - } + tloadscreen(boost::function f); ~tloadscreen() { @@ -72,10 +68,11 @@ class tloadscreen : public tdialog void close(); private: + twindow* window_; size_t timer_id_; boost::function work_; boost::scoped_ptr worker_; - twindow* window_; + boost::scoped_ptr cursor_setter_; twindow* build_window(CVideo& video) const; From e6c58dcc1ac3ea2e161b69dc2c7f1e46841e389c Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 15:26:19 +0200 Subject: [PATCH 045/240] fix segfault during loadingscreen. --- src/display.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/display.cpp b/src/display.cpp index 8d5ac94cb797..d4395270c773 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -46,6 +46,7 @@ #include "units/drawer.hpp" #include "whiteboard/manager.hpp" #include "show_dialog.hpp" +#include "gui/dialogs/loadscreen.hpp" #include @@ -3782,6 +3783,9 @@ void display::handle_window_event(const SDL_Event& event) { } void display::handle_event(const SDL_Event& event) { + if (gui2::tloadscreen::displaying()) { + return; + } if (event.type == DRAW_ALL_EVENT) { draw(); } From 53e527acc7fbd547a3d3b95e73922e4cd560db59 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 15:26:48 +0200 Subject: [PATCH 046/240] show current stage in loadingscren. --- data/gui/window/loadscreen.cfg | 2 ++ src/gui/dialogs/loadscreen.cpp | 32 ++++++++++++++++++++++++++++---- src/gui/dialogs/loadscreen.hpp | 28 ++++++++++------------------ 3 files changed, 40 insertions(+), 22 deletions(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index a57c8bc700f0..8cb03f332f14 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -102,8 +102,10 @@ border_size = 5 horizontal_alignment = "center" vertical_alignment = "center" + horizontal_grow = "true" [label] + text_alignment = "center" definition = "default_large" id = "status" label = _ "Loading..." diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 0db775a3eaef..1f80ed5286dc 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -18,6 +18,8 @@ #include "gui/widgets/window.hpp" #include "gui/widgets/settings.hpp" #include "gui/core/timer.hpp" +#include "gui/auxiliary/find_widget.hpp" + #include "video.hpp" #include "cursor.hpp" #include @@ -34,8 +36,10 @@ tloadscreen::tloadscreen(boost::function f) , work_(f) , worker_() , cursor_setter_() - , current_stage(NULL) + , current_stage_(NULL) + , current_visible_stage_(NULL) { + current_load = this; } void tloadscreen::show(CVideo& video) { @@ -73,6 +77,7 @@ void tloadscreen::pre_show(twindow& window) worker_.reset(new boost::thread(work_)); timer_id_ = add_timer(100, boost::bind(&tloadscreen::timer_callback, this, boost::ref(window)), true); cursor_setter_.reset(new cursor::setter(cursor::WAIT)); + progress_stage_label_ = &find_widget(&window, "status", false); } void tloadscreen::post_show(twindow& /*window*/) @@ -89,10 +94,8 @@ void tloadscreen::progress(const char* stage) } // Currently this is a no-op stub if(stage) { - // TODO: Update displayed stage - current_load->current_stage = stage; + current_load->current_stage_ = stage; } - // TODO: Indicate progress somehow } tloadscreen* tloadscreen::current_load = NULL; @@ -101,7 +104,28 @@ void tloadscreen::timer_callback(twindow& window) { if (!worker_ || worker_->timed_join(boost::posix_time::milliseconds(0))) { window.close(); + } + if (current_stage_ != current_visible_stage_) + { + current_visible_stage_ = current_stage_; + progress_stage_label_->set_label(current_visible_stage_); + + } +} +tloadscreen::~tloadscreen() +{ + close(); + current_load = NULL; +} + +void tloadscreen::display(CVideo& video, boost::function f) +{ + if (current_load || video.faked()) { + f(); + } + else { + tloadscreen(f).show(video); } } diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 02f62f2aadf9..d344eaaa9203 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -14,6 +14,7 @@ #pragma once #include "gui/dialogs/dialog.hpp" +#include "gui/widgets/label.hpp" #include #include @@ -38,22 +39,10 @@ class tloadscreen : public tdialog tloadscreen(boost::function f); - ~tloadscreen() - { - close(); - } - - static void display(CVideo& video, boost::function f) { - static bool already_shown = false; - if (already_shown) { - f(); - } - else { - already_shown = true; - tloadscreen(f).show(video); - already_shown = false; - } - } + ~tloadscreen(); + + static void display(CVideo& video, boost::function f); + static bool displaying() { return current_load != NULL; } void show(CVideo& video); @@ -66,7 +55,6 @@ class tloadscreen : public tdialog * when the window is not shown. */ void close(); - private: twindow* window_; size_t timer_id_; @@ -86,8 +74,12 @@ class tloadscreen : public tdialog /** Inherited from tdialog. */ void post_show(twindow& window); + tlabel* progress_stage_label_; static tloadscreen* current_load; - const char* current_stage; + + //Note we cannot use std::strings here unless we we explicitly use mutexes. + const char* current_stage_; + const char* current_visible_stage_; }; } // namespace gui2 From 91130a3df28f92146688498614855c8e1ec3823a Mon Sep 17 00:00:00 2001 From: mattsc Date: Wed, 30 Mar 2016 07:20:34 -0700 Subject: [PATCH 047/240] Fix error in Formula AI test scenario --- data/ai/scenarios/scenario-formula.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/ai/scenarios/scenario-formula.cfg b/data/ai/scenarios/scenario-formula.cfg index 92114b377134..2353702e9d10 100644 --- a/data/ai/scenarios/scenario-formula.cfg +++ b/data/ai/scenarios/scenario-formula.cfg @@ -142,7 +142,7 @@ Gs^Fp , Gs^Fp , Wwf , Wwf , Mm , Rd type="Walking Corpse" generate_name=yes [ai] - formula="move(me.loc, nearest_loc(nearest_loc(me.loc,map(filter(map.terrain,id='castle'),loc)),unit_moves(me.loc)))" + formula="move(me.loc, nearest_loc(nearest_loc(me.loc,map(filter(map.terrain,castle=1),loc)),unit_moves(me.loc)))" [/ai] [/unit] From e1777a1f140d427f15acca6f80c276d86dc31d18 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 16:35:31 +0200 Subject: [PATCH 048/240] testing loadingscreen animation this adds a simple animation to the gui2 loadingscreen. It not very good yet, it more about testing whether animations are possible. --- data/gui/window/loadscreen.cfg | 22 ++++++++++++++++++++++ src/gui/dialogs/loadscreen.cpp | 11 ++++++++++- src/gui/dialogs/loadscreen.hpp | 2 ++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index 8cb03f332f14..643b222184b1 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -115,6 +115,28 @@ [/row] + [row] + grow_factor = 0 + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "center" + vertical_alignment = "center" + horizontal_grow = "true" + + [label] + text_alignment = "center" + definition = "default_large" + id = "test_animation" + label = "...................." + [/label] + + [/column] + + [/row] + [row] grow_factor = 1 diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 1f80ed5286dc..05b82f994e30 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -33,6 +33,7 @@ REGISTER_DIALOG(loadscreen) tloadscreen::tloadscreen(boost::function f) : window_(NULL) , timer_id_(0) + , animation_counter_(0) , work_(f) , worker_() , cursor_setter_() @@ -78,6 +79,8 @@ void tloadscreen::pre_show(twindow& window) timer_id_ = add_timer(100, boost::bind(&tloadscreen::timer_callback, this, boost::ref(window)), true); cursor_setter_.reset(new cursor::setter(cursor::WAIT)); progress_stage_label_ = &find_widget(&window, "status", false); + animation_label_ = &find_widget(&window, "test_animation", false); + } void tloadscreen::post_show(twindow& /*window*/) @@ -109,7 +112,13 @@ void tloadscreen::timer_callback(twindow& window) { current_visible_stage_ = current_stage_; progress_stage_label_->set_label(current_visible_stage_); - + } + ++animation_counter_; + if (animation_counter_ % 2 == 0) { + int animation_state = (animation_counter_ / 2) % 20; + std::string s(20, ' '); + s[animation_state] = '.'; + animation_label_->set_label(s); } } diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index d344eaaa9203..4ade28c664c7 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -58,6 +58,7 @@ class tloadscreen : public tdialog private: twindow* window_; size_t timer_id_; + int animation_counter_; boost::function work_; boost::scoped_ptr worker_; boost::scoped_ptr cursor_setter_; @@ -75,6 +76,7 @@ class tloadscreen : public tdialog void post_show(twindow& window); tlabel* progress_stage_label_; + tlabel* animation_label_; static tloadscreen* current_load; //Note we cannot use std::strings here unless we we explicitly use mutexes. From 0d190080ee1837bcc34582634b0dd2f7a3f52908 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 16:36:42 +0200 Subject: [PATCH 049/240] remove tloadingscreen::show it only called tdialog::show() --- src/gui/dialogs/loadscreen.cpp | 16 ---------------- src/gui/dialogs/loadscreen.hpp | 2 -- 2 files changed, 18 deletions(-) diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 05b82f994e30..2b55317ccc67 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -42,22 +42,6 @@ tloadscreen::tloadscreen(boost::function f) { current_load = this; } -void tloadscreen::show(CVideo& video) -{ - tdialog::show(video); - return; - if(video.faked()) { - return; - } - - window_ = build_window(video); - - pre_show(*window_); - - window_->show_non_modal(); - - post_show(*window_); -} void tloadscreen::close() { diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 4ade28c664c7..ecbeb70a3182 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -43,8 +43,6 @@ class tloadscreen : public tdialog static void display(CVideo& video, boost::function f); static bool displaying() { return current_load != NULL; } - - void show(CVideo& video); static void progress(const char* stage_name = NULL); From 0360184942121e75460f1c309a2b758abdce284e Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 17:05:03 +0200 Subject: [PATCH 050/240] add comment --- src/play_controller.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/play_controller.cpp b/src/play_controller.cpp index 007d6a6146bf..df7d4b4aef6b 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -257,6 +257,10 @@ void play_controller::init(CVideo& video, const config& level) LOG_NG << "building terrain rules... " << (SDL_GetTicks() - ticks()) << std::endl; gui2::tloadscreen::progress("build terrain"); + //NOTE: since the loading now happens in a sperate thread creating the game_display object here is dangerous. + // for example becasue it might registers an sdl_handler while the main thread is calling events::pump + //TODO: Find a way to move the sdl_handler::join() calls out of here. + gui_.reset(new game_display(gamestate().board_, video, whiteboard_manager_, *gamestate().reports_, gamestate().tod_manager_, theme_cfg, level)); if (!gui_->video().faked()) { if (saved_game_.mp_settings().mp_countdown) From 085afa0e4a23092ab65653ce481b267243f457a3 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Wed, 30 Mar 2016 18:51:55 +0300 Subject: [PATCH 051/240] Added optional [tile] no_draw= to exclude images from a hex This can be used in rare cases when a multi-hex rule requires that a [tile] be used for matching purposes but without getting the image(s) drawn on it. --- src/terrain/builder.cpp | 8 ++++++-- src/terrain/builder.hpp | 6 ++++++ 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/terrain/builder.cpp b/src/terrain/builder.cpp index f779e3600890..db06492e5204 100644 --- a/src/terrain/builder.cpp +++ b/src/terrain/builder.cpp @@ -782,6 +782,8 @@ void terrain_builder::add_constraints(terrain_builder::constraint_set &constrain item_string.begin(), item_string.end()); + constraint.no_draw = cfg["no_draw"].to_bool(false); + add_images_from_config(constraint.images, cfg, false); } @@ -1081,8 +1083,10 @@ void terrain_builder::apply_rule(const terrain_builder::building_rule &rule, con tile& btile = tile_map_[tloc]; - BOOST_FOREACH(const rule_image &img, constraint.images) { - btile.images.push_back(tile::rule_image_rand(&img, rand_seed)); + if (!constraint.no_draw) { + BOOST_FOREACH(const rule_image &img, constraint.images) { + btile.images.push_back(tile::rule_image_rand(&img, rand_seed)); + } } // Sets flags diff --git a/src/terrain/builder.hpp b/src/terrain/builder.hpp index 8ed8d4f0d12a..21f7de708d9d 100644 --- a/src/terrain/builder.hpp +++ b/src/terrain/builder.hpp @@ -256,6 +256,7 @@ class terrain_builder set_flag(), no_flag(), has_flag(), + no_draw(), images() {} @@ -265,6 +266,7 @@ class terrain_builder set_flag(), no_flag(), has_flag(), + no_draw(), images() {} @@ -273,6 +275,10 @@ class terrain_builder std::vector set_flag; std::vector no_flag; std::vector has_flag; + + /** Whether to actually draw the images onto this hex or not */ + bool no_draw; + rule_imagelist images; }; From c3bf0ee816193da97b58abfd3a477b722be404e2 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Wed, 30 Mar 2016 19:16:10 +0300 Subject: [PATCH 052/240] Improved on some glitchy 3-way corners involving beach waves Corners where water, sand and anything that sand transitions over (such as roads) exhibited the problem. This fix isn't perfect as the convex and concave shore waves don't completely match, but it's a clear improvement. --- data/core/terrain-graphics/new-macros.cfg | 77 +++++++++++++++++++++-- 1 file changed, 73 insertions(+), 4 deletions(-) diff --git a/data/core/terrain-graphics/new-macros.cfg b/data/core/terrain-graphics/new-macros.cfg index f04a26b741af..ba6be85c7cc9 100644 --- a/data/core/terrain-graphics/new-macros.cfg +++ b/data/core/terrain-graphics/new-macros.cfg @@ -1004,6 +1004,8 @@ [/image] [/terrain_graphics] + # These 4 rules draw very special convex-concave combination rules in 3-way + # sand-water-other corners [terrain_graphics] map=" , 2 @@ -1014,21 +1016,22 @@ [tile] pos=1 type={TERRAINLIST} + no_draw=yes [/tile] [tile] pos=2 type={ADJACENT} - set_no_flag=waves_convex-@R0-@R5 [/tile] [tile] pos=3 type=!,{TERRAINLIST},{ADJACENT} + no_draw=yes [/tile] rotations=tr,r,br,bl,l,tl [image] - name={IMAGESTEM}-convex-A[01~13].png~MASK(terrain/masks/7hex-@R0-@R5.png):200 + name={IMAGESTEM}-convex-A[01~13].png~MASK(terrain/masks/7hex-@R0.png):200 random_start=no layer={LAYER} center=90,144 @@ -1036,7 +1039,39 @@ is_water=yes [/image] [/terrain_graphics] + [terrain_graphics] + map=" +, 2 +*, 3 +, 1 +*, * +, *" + [tile] + pos=1 + type={ADJACENT} + no_draw=yes + [/tile] + [tile] + pos=2 + type=!,{TERRAINLIST},{ADJACENT} + no_draw=yes + [/tile] + [tile] + pos=3 + type={TERRAINLIST} + [/tile] + rotations=tr,r,br,bl,l,tl + + [image] + name={IMAGESTEM}-concave-A[01~13].png~MASK(terrain/masks/7hex-@R0-@R1.png):200 + random_start=no + layer={LAYER} + center=90,144 + base=90,144 + is_water=yes + [/image] + [/terrain_graphics] [terrain_graphics] map=" , 2 @@ -1047,21 +1082,55 @@ [tile] pos=1 type={TERRAINLIST} + no_draw=yes [/tile] [tile] pos=2 type=!,{TERRAINLIST},{ADJACENT} + no_draw=yes [/tile] [tile] pos=3 type={ADJACENT} - set_no_flag=waves_convex-@R0-@R1 [/tile] rotations=tr,r,br,bl,l,tl [image] - name={IMAGESTEM}-convex-A[01~13].png~MASK(terrain/masks/7hex-@R0-@R1.png):200 + name={IMAGESTEM}-convex-A[01~13].png~MASK(terrain/masks/7hex-@R0.png):200 + random_start=no + layer={LAYER} + center=90,144 + base=90,144 + is_water=yes + [/image] + [/terrain_graphics] + [terrain_graphics] + map=" +, 2 +*, 3 +, 1 +*, * +, *" + [tile] + pos=1 + type={ADJACENT} + no_draw=yes + [/tile] + [tile] + pos=2 + type={TERRAINLIST} + [/tile] + [tile] + pos=3 + type=!,{TERRAINLIST},{ADJACENT} + no_draw=yes + [/tile] + + rotations=tr,r,br,bl,l,tl + + [image] + name={IMAGESTEM}-concave-A[01~13].png~MASK(terrain/masks/7hex-@R0-@R5.png):200 random_start=no layer={LAYER} center=90,144 From 6910083e86335c78412a88e2f26e49cc20ae6adc Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 20:15:52 +0200 Subject: [PATCH 053/240] fix loading screen when loading mp config. --- src/game_config_manager.cpp | 4 ++-- src/game_initialization/multiplayer_ui.cpp | 4 ++++ 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index 110a4757befb..a39087c099b7 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -560,7 +560,7 @@ void game_config_manager::load_game_config_for_create(bool is_mp) typedef boost::shared_ptr define; try{ - load_game_config(NO_INCLUDE_RELOAD); + load_game_config_with_loadscreen(NO_INCLUDE_RELOAD); } catch(game::error&) { cache_.clear_defines(); @@ -572,7 +572,7 @@ void game_config_manager::load_game_config_for_create(bool is_mp) previous_defines.push_back(new_define); } - load_game_config(NO_FORCE_RELOAD); + load_game_config_with_loadscreen(NO_FORCE_RELOAD); throw; } diff --git a/src/game_initialization/multiplayer_ui.cpp b/src/game_initialization/multiplayer_ui.cpp index 02308bd93aa2..09c4e951266f 100644 --- a/src/game_initialization/multiplayer_ui.cpp +++ b/src/game_initialization/multiplayer_ui.cpp @@ -19,6 +19,7 @@ #include "game_preferences.hpp" #include "gettext.hpp" #include "gui/dialogs/multiplayer/mp_cmd_wrapper.hpp" +#include "gui/dialogs/loadscreen.hpp" #include "lobby_preferences.hpp" #include "log.hpp" #include "marked-up_text.hpp" @@ -309,6 +310,9 @@ void ui::process_event() void ui::handle_event(const SDL_Event& event) { + if (gui2::tloadscreen::displaying()) { + return; + } gui::widget::handle_event(event); if (event.type == SDL_WINDOWEVENT && event.window.event == SDL_WINDOWEVENT_RESIZED) { From 2b565b9abe0c75cfeaf42846ef8b4aaf72f72f2d Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 20:29:02 +0200 Subject: [PATCH 054/240] fix loadingscreen for small resolutions. --- data/gui/window/loadscreen.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index 643b222184b1..97cbb98056cc 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -45,7 +45,7 @@ [column] [spacer] - height = "(screen_height / 4)" + height = "((screen_height - 400) / 4)" [/spacer] [/column] From 249792e08d476c51452639edb93171b0f9aa944e Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Wed, 30 Mar 2016 21:08:31 +0200 Subject: [PATCH 055/240] fix segfault in loadingscreen when staring campaigns, --- src/game_display.cpp | 4 ++-- src/play_controller.cpp | 6 ++---- 2 files changed, 4 insertions(+), 6 deletions(-) diff --git a/src/game_display.cpp b/src/game_display.cpp index 78731ccd1943..31cc4168bb1c 100644 --- a/src/game_display.cpp +++ b/src/game_display.cpp @@ -74,8 +74,8 @@ game_display::game_display(game_board& board, CVideo& video, boost::weak_ptrvideo().faked()) { if (saved_game_.mp_settings().mp_countdown) @@ -313,6 +309,8 @@ void play_controller::init(CVideo& video, const config& level) plugins_context_->set_callback("save_replay", boost::bind(&play_controller::save_replay_auto, this, boost::bind(get_str, _1, "filename" )), true); plugins_context_->set_callback("quit", throw_end_level(), false); }); + //Do this after the loadingscreen, so that ita happens in the main thread. + gui_->join(); } void play_controller::reset_gamestate(const config& level, int replay_pos) From 94d3d5aec66d79b4739eb5c3a6c53989e39e90d8 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 16:10:17 -0400 Subject: [PATCH 056/240] Don't attempt every WML test if binary missing --- run_wml_tests | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/run_wml_tests b/run_wml_tests index e24247528ba4..8b6094c04eb1 100755 --- a/run_wml_tests +++ b/run_wml_tests @@ -274,6 +274,19 @@ shift $(($OPTIND - 1)) extra_opts+="$*" +# Make sure the binary exists +if [ "$DebugMode" -eq 1 ]; then + if [ "! ( -f $BinPath/wesnoth-debug -a -x $BinPath/wesnoth-debug )" ]; then + echo "Wesnoth binary not found at $BinPath/wesnoth-debug" + exit 1 + fi +else + if [ "! ( -f $BinPath/wesnoth -a -x $BinPath/wesnoth )" ]; then + echo "Wesnoth binary not found at $BinPath/wesnoth" + exit 1 + fi +fi + if [ "$Verbose" -ge 2 ]; then if [ "${#extra_opts}" -ge 0 ]; then echo "Found additional arguments to wesnoth: " "$extra_opts" From acc752aa9a3515ba53c79aca3e0c7d3e19d3f51d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 16:12:37 -0400 Subject: [PATCH 057/240] XCode: Build with C++11 and libc++ --- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 40 +++++-------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index c9f8adfb2661..ed435b876d8e 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -5189,22 +5189,18 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; - ENABLE_OPENMP_SUPPORT = YES; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", ); - PREBINDING = NO; PRODUCT_NAME = unit_tests; }; name = Debug; @@ -5222,15 +5218,12 @@ BOOST_TEST_DYN_LINK, "LOCALEDIR=\\\"translations\\\"", ); - GCC_VERSION = com.apple.compilers.llvm.clang.1_0; INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", ); - PREBINDING = NO; PRODUCT_NAME = unit_tests; - ZERO_LINK = NO; }; name = Release; }; @@ -5240,29 +5233,19 @@ COPY_PHASE_STRIP = NO; GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = NO; - GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PREPROCESSOR_DEFINITIONS = ( "LOCALEDIR=\\\"translations\\\"", "FIFODIR=\\\"/var/run/wesnothd\\\"", ); GCC_TREAT_WARNINGS_AS_ERRORS = YES; - GCC_VERSION = ""; INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", "$(PROJECT_DIR)/lib", ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-isystem", - ./Headers, - ); - PREBINDING = NO; PRODUCT_NAME = wesnothd; - SDKROOT = ""; }; name = Debug; }; @@ -5274,16 +5257,13 @@ "LOCALEDIR=\\\"translations\\\"", "FIFODIR=\\\"/var/run/wesnothd\\\"", ); - GCC_VERSION = ""; INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", "$(PROJECT_DIR)/lib", ); - PREBINDING = NO; PRODUCT_NAME = wesnothd; - ZERO_LINK = NO; }; name = Release; }; @@ -5299,7 +5279,6 @@ ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_MODEL_TUNING = G5; GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; @@ -5309,7 +5288,6 @@ "HAVE_LIBPNG=1", "HAVE_HISTORY=1", ); - GCC_VERSION = ""; HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; @@ -5318,7 +5296,6 @@ "\"$(SRCROOT)/lib\"", "$(PROJECT_DIR)/lib", ); - MACOSX_DEPLOYMENT_TARGET = 10.6; OTHER_CPLUSPLUSFLAGS = ( "$(OTHER_CFLAGS)", "-isystem", @@ -5330,7 +5307,6 @@ "-lreadline", ); PRODUCT_NAME = Wesnoth; - SDKROOT = ""; WARNING_CFLAGS = ( "-Werror=format", "-Werror=missing-braces", @@ -5361,7 +5337,6 @@ "HAVE_LIBPNG=1", "HAVE_HISTORY=1", ); - GCC_VERSION = ""; GCC_WARN_UNUSED_VARIABLE = NO; HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Info.plist; @@ -5397,6 +5372,9 @@ C01FCF4F08A954540054247B /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; FRAMEWORK_SEARCH_PATHS = ./lib; GCC_DYNAMIC_NO_PIC = YES; GCC_INLINES_ARE_PRIVATE_EXTERN = NO; @@ -5434,17 +5412,19 @@ ); LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ./lib; + MACOSX_DEPLOYMENT_TARGET = 10.7; ONLY_ACTIVE_ARCH = YES; OTHER_CFLAGS = ( "-Wall", "-Wno-unused-local-typedefs", "-Wno-unknown-warning-option", + "-isystem", + ./Headers, ); OTHER_LDFLAGS = ( "-lz", "-lbz2", ); - PREBINDING = NO; WARNING_CFLAGS = ( "-Werror=format", "-Werror=missing-braces", @@ -5460,14 +5440,15 @@ C01FCF5008A954540054247B /* Release */ = { isa = XCBuildConfiguration; buildSettings = { + ARCHS = "$(ARCHS_STANDARD_64_BIT)"; + CLANG_CXX_LANGUAGE_STANDARD = "c++0x"; + CLANG_CXX_LIBRARY = "libc++"; FRAMEWORK_SEARCH_PATHS = ./lib; GCC_DYNAMIC_NO_PIC = YES; - GCC_MODEL_TUNING = G5; GCC_PREPROCESSOR_DEFINITIONS = ( "LOCALEDIR=\\\"translations\\\"", "LUA_USE_MACOSX=1", ); - GCC_VERSION = ""; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( ../.., @@ -5484,11 +5465,12 @@ ); LD_RUNPATH_SEARCH_PATHS = "@loader_path/../Frameworks"; LIBRARY_SEARCH_PATHS = ./lib; + MACOSX_DEPLOYMENT_TARGET = 10.7; OTHER_LDFLAGS = ( "-lz", "-lbz2", ); - SDKROOT = "$(DEVELOPER_SDK_DIR)/MacOSX10.4u.sdk"; + SDKROOT = macosx10.7; WARNING_CFLAGS = ( "-Werror=format", "-Werror=missing-braces", From 0795ad879bf120684e2afc763fd9976e9ce34c17 Mon Sep 17 00:00:00 2001 From: loonycyborg Date: Thu, 31 Mar 2016 00:10:32 +0300 Subject: [PATCH 058/240] scons: due to switch to std c++11 always pass -std=c++11 --- SConstruct | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/SConstruct b/SConstruct index e8d2b0c36bd2..58ee8cc5b18c 100755 --- a/SConstruct +++ b/SConstruct @@ -103,7 +103,6 @@ opts.AddVariables( BoolVariable('ccache', "Use ccache", False), ('ctool', 'Set c compiler command if not using standard compiler.'), ('cxxtool', 'Set c++ compiler command if not using standard compiler.'), - BoolVariable('cxx0x', 'Use C++0x features.', False), BoolVariable('openmp', 'Enable openmp use.', False), BoolVariable("fast", "Make scons faster at cost of less precise dependency tracking.", False), BoolVariable("lockfile", "Create a lockfile to prevent multiple instances of scons from being run at the same time on this working copy.", False), @@ -500,11 +499,8 @@ for env in [test_env, client_env, env]: if "gcc" in env["TOOLS"]: env.AppendUnique(CCFLAGS = Split("-W -Wall"), CFLAGS = ["-std=c99"]) - if env['cxx0x']: - env.AppendUnique(CXXFLAGS = "-std=c++0x") - env.Append(CPPDEFINES = "HAVE_CXX0X") - else: - env.AppendUnique(CXXFLAGS = "-std=c++98") + env.AppendUnique(CXXFLAGS = "-std=c++11") + env.Append(CPPDEFINES = "HAVE_CXX0X") if env['openmp']: env.AppendUnique(CXXFLAGS = ["-fopenmp"], LIBS = ["gomp"]) From af7286c4214fc6770de2b1dcdb8bf99a1016ac94 Mon Sep 17 00:00:00 2001 From: loonycyborg Date: Thu, 31 Mar 2016 00:46:06 +0300 Subject: [PATCH 059/240] scons: add check for boost.thread since it's a dependency now --- SConstruct | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index 58ee8cc5b18c..fdd05e8a51a0 100755 --- a/SConstruct +++ b/SConstruct @@ -409,7 +409,8 @@ if env["prereqs"]: conf.CheckPango("cairo", require_version = "1.21.3") & \ conf.CheckPKG("fontconfig") & \ conf.CheckBoost("program_options", require_version="1.35.0") & \ - conf.CheckBoost("regex", require_version = "1.35.0") \ + conf.CheckBoost("thread") & \ + conf.CheckBoost("regex") \ or Warning("WARN: Client prerequisites are not met. wesnoth, cutter and exploder cannot be built") have_X = False From f962431710e1e036407319cd8ee2cfb464b13344 Mon Sep 17 00:00:00 2001 From: loonycyborg Date: Thu, 31 Mar 2016 00:59:17 +0300 Subject: [PATCH 060/240] travis: install boost.thread too --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index be7f65cc84e4..4e4a21392875 100644 --- a/.travis.yml +++ b/.travis.yml @@ -51,7 +51,7 @@ before_install: install: - travis_wait sudo apt-get update -qq - - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb + - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libboost-thread-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb script: - ./utils/travis/check_utf8.sh From b98687147a864ced74a46b7d5dc02bd11c321af1 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 03:17:43 +1100 Subject: [PATCH 061/240] Fixup compilation on C++11 --- src/log_windows.hpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/log_windows.hpp b/src/log_windows.hpp index 039989e983cb..f2b8fc23717e 100644 --- a/src/log_windows.hpp +++ b/src/log_windows.hpp @@ -15,6 +15,7 @@ #ifndef DESKTOP_WINDOWS_LOG_HPP_INCLUDED #define DESKTOP_WINDOWS_LOG_HPP_INCLUDED +#include #include /** From 38223569ab0563977aa6e393f55c6d12dfceb7bd Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 09:10:23 +1100 Subject: [PATCH 062/240] Removed unnecessary boost include --- src/units/filter.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/units/filter.cpp b/src/units/filter.cpp index 2664dacbb306..a60cd76a0c73 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -42,7 +42,6 @@ #include #include #include -#include //needed for boost::in_place to initialize optionals #include @@ -102,11 +101,11 @@ class null_unit_filter_impl : public unit_filter_abstract_impl { virtual ~null_unit_filter_impl() {} - + config to_config() const { return config(); } - + bool empty() const { return true; } @@ -146,7 +145,7 @@ class basic_unit_filter_impl : public unit_filter_abstract_impl { const vconfig& cond_filter = cond.get_child(); cond_children_.push_back(unit_filter(cond_filter, &fc_, use_flat_tod_)); - cond_child_types_.push_back(type); + cond_child_types_.push_back(type); } else { static const int NUM_VALID_TAGS = 5; From 1f52abcbfb7b90bed9af287cb3eedc02b136055e Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 09:32:54 +1100 Subject: [PATCH 063/240] tloadscreen: fix conflicting alignment keys in animation label --- data/gui/window/loadscreen.cfg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index 97cbb98056cc..b1fb2ec4fead 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -122,9 +122,8 @@ grow_factor = 1 border = "all" border_size = 5 - horizontal_alignment = "center" - vertical_alignment = "center" horizontal_grow = "true" + vertical_alignment = "center" [label] text_alignment = "center" From c97a5d14ffec909d73346c183ed8d2b5bf46e5f2 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 09:37:10 +1100 Subject: [PATCH 064/240] Codeblocks: enable building with c++11 This also adds the necessary boost::thread linker option required by recent loadscreen code. --- projectfiles/CodeBlocks/liblua.cbp | 1 + projectfiles/CodeBlocks/wesnoth.cbp | 2 ++ projectfiles/CodeBlocks/wesnothd.cbp | 1 + 3 files changed, 4 insertions(+) diff --git a/projectfiles/CodeBlocks/liblua.cbp b/projectfiles/CodeBlocks/liblua.cbp index 4d53e27a8ad6..ca3c3ec8c334 100644 --- a/projectfiles/CodeBlocks/liblua.cbp +++ b/projectfiles/CodeBlocks/liblua.cbp @@ -31,6 +31,7 @@ + diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index ce5c50f86441..2c13b36077b3 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -30,6 +30,7 @@ + @@ -72,6 +73,7 @@ + diff --git a/projectfiles/CodeBlocks/wesnothd.cbp b/projectfiles/CodeBlocks/wesnothd.cbp index c23ae9bfddfd..18f1635ab270 100644 --- a/projectfiles/CodeBlocks/wesnothd.cbp +++ b/projectfiles/CodeBlocks/wesnothd.cbp @@ -29,6 +29,7 @@ + From 3eb45c6b2cdccb744d7061d047e66c37afbbb70f Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 18:28:58 -0400 Subject: [PATCH 065/240] Travis: Force GCC version 4.7 --- .travis.yml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 4e4a21392875..249c6b242722 100644 --- a/.travis.yml +++ b/.travis.yml @@ -33,6 +33,8 @@ before_install: - export NLS=false - export CXX11=true + - if [ "$CXX" == "g++" ]; then export CXX=g++-4.7; fi + - if [ "$BUILD" == "-O2" ]; then export STRICT_COMPILATION=false; fi - if [ "$BUILD" == "-O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi - if [ "$BUILD" == "-O2" ]; then export WML_TEST_TIME=15; fi @@ -51,7 +53,7 @@ before_install: install: - travis_wait sudo apt-get update -qq - - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libboost-thread-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb + - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libboost-thread-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb g++-4.7 script: - ./utils/travis/check_utf8.sh From f849048a426fcb08b8a1c0be30d300e799a250b8 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 09:43:13 +1100 Subject: [PATCH 066/240] Use unique_ptr instead of auto_ptr (deprecated in c++11) --- src/editor/action/action_item.cpp | 8 ++++---- src/editor/action/action_label.cpp | 4 ++-- src/editor/action/action_unit.cpp | 8 ++++---- src/editor/action/action_village.cpp | 4 ++-- src/gui/dialogs/dialog.cpp | 2 +- src/gui/widgets/pane.hpp | 2 +- src/server/game.cpp | 2 +- src/whiteboard/recruit.cpp | 2 +- 8 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/editor/action/action_item.cpp b/src/editor/action/action_item.cpp index d0c122b40745..fdf162f69023 100644 --- a/src/editor/action/action_item.cpp +++ b/src/editor/action/action_item.cpp @@ -35,7 +35,7 @@ editor_action_item* editor_action_item::clone() const editor_action* editor_action_item::perform(map_context& mc) const { - std::auto_ptr undo(new editor_action_item_delete(loc_)); + std::unique_ptr undo(new editor_action_item_delete(loc_)); perform_without_undo(mc); return undo.release(); } @@ -60,7 +60,7 @@ editor_action* editor_action_item_delete::perform(map_context& /*mc*/) const // item_map& items = mc.get_items(); // item_map::const_item_iterator item_it = items.find(loc_); // -// std::auto_ptr undo; +// std::unique_ptr undo; // if (item_it != items.end()) { // undo.reset(new editor_action_item(loc_, *item_it)); // perform_without_undo(mc); @@ -87,7 +87,7 @@ editor_action_item_replace* editor_action_item_replace::clone() const editor_action* editor_action_item_replace::perform(map_context& mc) const { - std::auto_ptr undo(new editor_action_item_replace(new_loc_, loc_)); + std::unique_ptr undo(new editor_action_item_replace(new_loc_, loc_)); perform_without_undo(mc); return undo.release(); @@ -125,7 +125,7 @@ editor_action_item_facing* editor_action_item_facing::clone() const editor_action* editor_action_item_facing::perform(map_context& mc) const { - std::auto_ptr undo(new editor_action_item_facing(loc_, old_direction_, new_direction_)); + std::unique_ptr undo(new editor_action_item_facing(loc_, old_direction_, new_direction_)); perform_without_undo(mc); return undo.release(); } diff --git a/src/editor/action/action_label.cpp b/src/editor/action/action_label.cpp index cd938c63a0ab..c3fd96bfd76f 100644 --- a/src/editor/action/action_label.cpp +++ b/src/editor/action/action_label.cpp @@ -32,7 +32,7 @@ editor_action_label* editor_action_label::clone() const editor_action* editor_action_label::perform(map_context& mc) const { - std::auto_ptr undo; + std::unique_ptr undo; const terrain_label *old_label = mc.get_labels().get_label(loc_); if (old_label) { @@ -59,7 +59,7 @@ editor_action_label_delete* editor_action_label_delete::clone() const editor_action* editor_action_label_delete::perform(map_context& mc) const { - std::auto_ptr undo; + std::unique_ptr undo; const terrain_label* deleted = mc.get_labels().get_label(loc_); diff --git a/src/editor/action/action_unit.cpp b/src/editor/action/action_unit.cpp index 036d9fc6ec4c..558786a306a4 100644 --- a/src/editor/action/action_unit.cpp +++ b/src/editor/action/action_unit.cpp @@ -38,7 +38,7 @@ editor_action_unit* editor_action_unit::clone() const editor_action* editor_action_unit::perform(map_context& mc) const { - std::auto_ptr undo(new editor_action_unit_delete(loc_)); + std::unique_ptr undo(new editor_action_unit_delete(loc_)); perform_without_undo(mc); return undo.release(); } @@ -61,7 +61,7 @@ editor_action* editor_action_unit_delete::perform(map_context& mc) const unit_map& units = mc.get_units(); unit_map::const_unit_iterator unit_it = units.find(loc_); - std::auto_ptr undo; + std::unique_ptr undo; if (unit_it != units.end()) { undo.reset(new editor_action_unit(loc_, *unit_it)); perform_without_undo(mc); @@ -88,7 +88,7 @@ editor_action_unit_replace* editor_action_unit_replace::clone() const editor_action* editor_action_unit_replace::perform(map_context& mc) const { - std::auto_ptr undo(new editor_action_unit_replace(new_loc_, loc_)); + std::unique_ptr undo(new editor_action_unit_replace(new_loc_, loc_)); perform_without_undo(mc); return undo.release(); @@ -126,7 +126,7 @@ editor_action_unit_facing* editor_action_unit_facing::clone() const editor_action* editor_action_unit_facing::perform(map_context& mc) const { - std::auto_ptr undo(new editor_action_unit_facing(loc_, old_direction_, new_direction_)); + std::unique_ptr undo(new editor_action_unit_facing(loc_, old_direction_, new_direction_)); perform_without_undo(mc); return undo.release(); } diff --git a/src/editor/action/action_village.cpp b/src/editor/action/action_village.cpp index 6bdc22e0bedb..2f69d18f7d7e 100644 --- a/src/editor/action/action_village.cpp +++ b/src/editor/action/action_village.cpp @@ -31,7 +31,7 @@ editor_action_village* editor_action_village::clone() const editor_action* editor_action_village::perform(map_context& mc) const { - std::auto_ptr undo; + std::unique_ptr undo; if(!mc.get_map().is_village(loc_)) return NULL; std::vector& teams = mc.get_teams(); @@ -69,7 +69,7 @@ editor_action_village_delete* editor_action_village_delete::clone() const editor_action* editor_action_village_delete::perform(map_context& mc) const { - std::auto_ptr undo; + std::unique_ptr undo; const std::vector& teams = mc.get_teams(); for(std::vector::const_iterator i = teams.begin(); i != teams.end(); ++i) { diff --git a/src/gui/dialogs/dialog.cpp b/src/gui/dialogs/dialog.cpp index 2f8a238527bc..808bc5240f7e 100644 --- a/src/gui/dialogs/dialog.cpp +++ b/src/gui/dialogs/dialog.cpp @@ -38,7 +38,7 @@ bool tdialog::show(CVideo& video, const unsigned auto_close_time) return false; } - std::auto_ptr window(build_window(video)); + std::unique_ptr window(build_window(video)); assert(window.get()); post_build(*window); diff --git a/src/gui/widgets/pane.hpp b/src/gui/widgets/pane.hpp index f74f38f54af6..77beb0e60b79 100644 --- a/src/gui/widgets/pane.hpp +++ b/src/gui/widgets/pane.hpp @@ -161,7 +161,7 @@ class tpane : public twidget unsigned item_id_generator_; /** Helper to do the placement. */ - std::auto_ptr placer_; + std::unique_ptr placer_; /** Places the children on the pane. */ void place_children(); diff --git a/src/server/game.cpp b/src/server/game.cpp index 7a9cc2382495..4469583ec063 100644 --- a/src/server/game.cpp +++ b/src/server/game.cpp @@ -971,7 +971,7 @@ bool game::process_turn(simple_wml::document& data, const player_map::const_iter continue; } - std::auto_ptr message(new simple_wml::document); + std::unique_ptr message(new simple_wml::document); simple_wml::node& turn = message->root().add_child("turn"); simple_wml::node& command = turn.add_child("command"); speak->copy_into(command.add_child("speak")); diff --git a/src/whiteboard/recruit.cpp b/src/whiteboard/recruit.cpp index e6e454035931..b500df45a070 100644 --- a/src/whiteboard/recruit.cpp +++ b/src/whiteboard/recruit.cpp @@ -176,7 +176,7 @@ unit_ptr recruit::create_corresponding_unit() unit_ptr result(new unit(*type, side_num, real_unit)); result->set_movement(0, true); result->set_attacks(0); - return result; //ownership gets transferred to returned auto_ptr copy + return result; //ownership gets transferred to returned unique_ptr copy } action::error recruit::check_validity() const From 531f391ad8bc29c8d2b233cf33735fd79a1edf29 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 09:49:36 +1100 Subject: [PATCH 067/240] Exclude loadscreen from GUI2 tests --- src/tests/gui/test_gui2.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/tests/gui/test_gui2.cpp b/src/tests/gui/test_gui2.cpp index ff014360038a..6b4ec3b31f1f 100644 --- a/src/tests/gui/test_gui2.cpp +++ b/src/tests/gui/test_gui2.cpp @@ -50,6 +50,7 @@ #include "gui/dialogs/gamestate_inspector.hpp" #include "gui/dialogs/label_settings.hpp" #include "gui/dialogs/language_selection.hpp" +#include "gui/dialogs/loadscreen.hpp" #include "gui/dialogs/lobby/lobby.hpp" #include "gui/dialogs/lobby/player_info.hpp" #include "gui/dialogs/lua_interpreter.hpp" @@ -396,6 +397,7 @@ BOOST_AUTO_TEST_CASE(test_gui2) test(); test(); test(); + // test(); TODO: enable test(); test(); test(); @@ -473,6 +475,7 @@ BOOST_AUTO_TEST_CASE(test_gui2) list.erase(std::remove(list.begin(), list.end(), "addon_filter_options"), list.end()); list.erase(std::remove(list.begin(), list.end(), "addon_uninstall_list"), list.end()); list.erase(std::remove(list.begin(), list.end(), "addon_list"), list.end()); + list.erase(std::remove(list.begin(), list.end(), "loadscreen"), list.end()); list.erase(std::remove(list.begin(), list.end(), "network_transmission"), list.end()); list.erase(std::remove(list.begin(), list.end(), "synced_choice_wait"), list.end()); list.erase(std::remove(list.begin(), list.end(), "drop_down_list"), list.end()); From 876710af8c24191ded7d9b82e5ee667aca216832 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 11:15:12 +1100 Subject: [PATCH 068/240] Use std::to_string() or equivalent wherever possible This commit removes the utility srt_cast() function and replaces its calls, along with calls to lexical_cast() (and its boost variant), with std::to_string(). In a few cases where the input type isn't compatible with to_string, lexical_cast is still used. In other cases where lexical_cast was operating on MAKE_ENUM enums, the call has been replaced with ENUM::enum_to_string, which is faster. --- src/actions/move.cpp | 4 +-- src/addon/client.cpp | 2 +- src/addon/manager_ui.cpp | 2 +- src/ai/composite/aspect.hpp | 6 ++-- src/ai/composite/value_translator.hpp | 2 +- src/ai/formula/ai.cpp | 2 +- src/ai/formula/stage_unit_formulas.cpp | 6 ++-- src/ai/manager.cpp | 12 ++++---- src/ai/testing.cpp | 10 +++---- src/carryover.cpp | 2 +- src/color_range.cpp | 2 +- src/config.cpp | 6 ++-- src/editor/editor_display.cpp | 2 +- src/editor/editor_preferences.cpp | 8 +++--- src/editor/map/context_manager.cpp | 2 +- src/editor/map/editor_map.cpp | 2 +- src/formula/callable_objects.cpp | 2 +- src/formula/variant.cpp | 4 +-- src/game_board.cpp | 8 +++--- src/game_classification.cpp | 4 +-- src/game_display.cpp | 4 +-- src/game_initialization/connect_engine.cpp | 10 +++---- src/game_initialization/create_engine.cpp | 4 +-- .../multiplayer_connect.cpp | 8 +++--- src/game_initialization/multiplayer_lobby.cpp | 4 +-- src/game_initialization/multiplayer_ui.cpp | 2 +- src/game_initialization/multiplayer_wait.cpp | 2 +- src/game_preferences.cpp | 2 +- src/game_state.cpp | 2 +- src/generators/default_map_generator.cpp | 8 +++--- src/gui/dialogs/addon/description.cpp | 2 +- src/gui/dialogs/addon/list.cpp | 4 +-- src/gui/dialogs/campaign_selection.cpp | 2 +- src/gui/dialogs/debug_clock.cpp | 2 +- src/gui/dialogs/editor/resize_map.cpp | 6 ++-- .../dialogs/editor/set_starting_position.cpp | 2 +- src/gui/dialogs/gamestate_inspector.cpp | 2 +- src/gui/dialogs/label_settings.cpp | 4 +-- src/gui/dialogs/lobby/lobby.cpp | 6 ++-- .../dialogs/multiplayer/mp_change_control.cpp | 4 +-- src/gui/dialogs/preferences_dialog.cpp | 2 +- src/gui/dialogs/unit_recruit.cpp | 2 +- src/gui/widgets/debug.cpp | 8 +++--- src/gui/widgets/listbox.cpp | 2 +- src/gui/widgets/unit_preview_pane.cpp | 2 +- src/hotkey/hotkey_handler.cpp | 4 +-- src/hotkey/hotkey_item.cpp | 2 +- src/image_modifications.cpp | 2 +- src/map/label.cpp | 4 +-- src/menu_events.cpp | 18 ++++++------ src/network.cpp | 4 +-- src/pathfind/teleport.cpp | 4 +-- src/play_controller.cpp | 10 +++---- src/preferences.cpp | 4 +-- src/replay.cpp | 2 +- src/reports.cpp | 6 ++-- src/save_index.cpp | 2 +- src/scripting/game_lua_kernel.cpp | 28 +++++++++---------- src/scripting/lua_map_location_ops.cpp | 2 +- src/serialization/preprocessor.cpp | 2 +- src/serialization/string_utils.cpp | 2 +- src/synced_context.cpp | 2 +- src/synced_user_choice.cpp | 6 ++-- src/team.cpp | 6 ++-- src/teambuilder.cpp | 2 +- src/terrain/filter.cpp | 6 ++-- src/terrain/translation.cpp | 2 +- src/tests/test_lexical_cast.cpp | 14 +++++----- src/tests/test_make_enum.cpp | 6 ++-- src/tests/test_mp_connect.cpp | 2 +- src/tools/sdl2/window.cpp | 2 +- src/units/animation.cpp | 4 +-- src/units/filter.cpp | 2 +- src/units/frame.cpp | 6 ++-- src/units/types.cpp | 6 ++-- src/units/unit.cpp | 2 +- src/util.hpp | 6 ---- src/whiteboard/manager.cpp | 2 +- src/widgets/progressbar.cpp | 4 +-- 79 files changed, 177 insertions(+), 183 deletions(-) diff --git a/src/actions/move.cpp b/src/actions/move.cpp index 77ad87966218..f47d62419095 100644 --- a/src/actions/move.cpp +++ b/src/actions/move.cpp @@ -1115,8 +1115,8 @@ namespace { // Private helpers for move_unit() // Create the message to display (depends on whether friends, // enemies, or both were sighted, and on how many of each). utils::string_map symbols; - symbols["enemies"] = lexical_cast(enemy_count_); - symbols["friends"] = lexical_cast(friend_count_); + symbols["enemies"] = std::to_string(enemy_count_); + symbols["friends"] = std::to_string(friend_count_); std::string message; SDL_Color msg_color; if ( friend_count_ != 0 && enemy_count_ != 0 ) { diff --git a/src/addon/client.cpp b/src/addon/client.cpp index 098e585e03ba..cac7323f09d8 100644 --- a/src/addon/client.cpp +++ b/src/addon/client.cpp @@ -51,7 +51,7 @@ addons_client::addons_client(CVideo& v, const std::string& address) // FIXME: this parsing will break IPv6 numeric addresses! */ host_ = address_components[0]; port_ = address_components.size() == 2 ? - address_components[1] : str_cast(default_campaignd_port); + address_components[1] : std::to_string(default_campaignd_port); } void addons_client::connect() diff --git a/src/addon/manager_ui.cpp b/src/addon/manager_ui.cpp index cef773d37a8b..bfbfeabf4834 100644 --- a/src/addon/manager_ui.cpp +++ b/src/addon/manager_ui.cpp @@ -708,7 +708,7 @@ void show_addons_manager_dialog(CVideo& v, addons_client& client, addons_list& a const std::string& display_sep = sep; const std::string& display_size = size_display_string(addon.size); const std::string& display_type = addon.display_type(); - const std::string& display_down = str_cast(addon.downloads); + const std::string& display_down = std::to_string(addon.downloads); const std::string& display_icon = addon.display_icon(); const std::string& display_status = describe_addon_status(tracking[addon.id]); diff --git a/src/ai/composite/aspect.hpp b/src/ai/composite/aspect.hpp index 17ccd155dbfa..aca078dae0c6 100644 --- a/src/ai/composite/aspect.hpp +++ b/src/ai/composite/aspect.hpp @@ -403,9 +403,9 @@ class lua_aspect_visitor : public boost::static_visitor { static std::string quote_string(const std::string& s); public: std::string operator()(bool b) const {return b ? "true" : "false";} - std::string operator()(int i) const {return str_cast(i);} - std::string operator()(unsigned long long i) const {return str_cast(i);} - std::string operator()(double i) const {return str_cast(i);} + std::string operator()(int i) const {return std::to_string(i);} + std::string operator()(unsigned long long i) const {return std::to_string(i);} + std::string operator()(double i) const {return std::to_string(i);} std::string operator()(const std::string& s) const {return quote_string(s);} std::string operator()(const t_string& s) const {return quote_string(s.str());} std::string operator()(boost::blank) const {return "nil";} diff --git a/src/ai/composite/value_translator.hpp b/src/ai/composite/value_translator.hpp index b0b2090cede0..0f294351a2f8 100644 --- a/src/ai/composite/value_translator.hpp +++ b/src/ai/composite/value_translator.hpp @@ -47,7 +47,7 @@ class config_value_translator { static void value_to_cfg(const T &value, config &cfg) { - cfg["value"] = str_cast(value); + cfg["value"] = lexical_cast(value); } static config value_to_cfg(const T &value) diff --git a/src/ai/formula/ai.cpp b/src/ai/formula/ai.cpp index ecf7dd2efa5b..1bcf1d9a95a9 100644 --- a/src/ai/formula/ai.cpp +++ b/src/ai/formula/ai.cpp @@ -117,7 +117,7 @@ void formula_ai::handle_exception(game_logic::formula_error& e, const std::strin //if line number = 0, don't display info about filename and line number if (e.line != 0) { LOG_AI << e.type << " in " << e.filename << ":" << e.line << std::endl; - display_message(e.type + " in " + e.filename + ":" + boost::lexical_cast(e.line)); + display_message(e.type + " in " + e.filename + ":" + std::to_string(e.line)); } else { LOG_AI << e.type << std::endl; display_message(e.type); diff --git a/src/ai/formula/stage_unit_formulas.cpp b/src/ai/formula/stage_unit_formulas.cpp index 0c875a1d64cd..5ee6ff47bedd 100644 --- a/src/ai/formula/stage_unit_formulas.cpp +++ b/src/ai/formula/stage_unit_formulas.cpp @@ -76,7 +76,7 @@ bool stage_unit_formulas::do_play_stage() } catch(game_logic::formula_error& e) { if(e.filename == "formula") e.line = 0; - fai_.handle_exception( e, "Unit priority formula error for unit: '" + i->type_id() + "' standing at (" + str_cast(i->get_location().x + 1) + "," + str_cast(i->get_location().y + 1) + ")"); + fai_.handle_exception( e, "Unit priority formula error for unit: '" + i->type_id() + "' standing at (" + std::to_string(i->get_location().x + 1) + "," + std::to_string(i->get_location().y + 1) + ")"); priority = 0; } catch(type_error& e) { @@ -112,7 +112,7 @@ bool stage_unit_formulas::do_play_stage() if(e.filename == "formula") { e.line = 0; } - fai_.handle_exception( e, "Unit formula error for unit: '" + i->type_id() + "' standing at (" + str_cast(i->get_location().x + 1) + "," + str_cast(i->get_location().y + 1) + ")"); + fai_.handle_exception( e, "Unit formula error for unit: '" + i->type_id() + "' standing at (" + std::to_string(i->get_location().x + 1) + "," + std::to_string(i->get_location().y + 1) + ")"); } } } @@ -136,7 +136,7 @@ bool stage_unit_formulas::do_play_stage() if (e.filename == "formula") { e.line = 0; } - fai_.handle_exception( e, "Unit loop formula error for unit: '" + i->type_id() + "' standing at (" + str_cast(i->get_location().x + 1) + "," + str_cast(i->get_location().y + 1) + ")"); + fai_.handle_exception( e, "Unit loop formula error for unit: '" + i->type_id() + "' standing at (" + std::to_string(i->get_location().x + 1) + "," + std::to_string(i->get_location().y + 1) + ")"); } } } diff --git a/src/ai/manager.cpp b/src/ai/manager.cpp index 32b5a3c82d0a..4260fca224f8 100644 --- a/src/ai/manager.cpp +++ b/src/ai/manager.cpp @@ -242,7 +242,7 @@ config holder::to_config() const const std::string holder::describe_ai() { - std::string sidestr = lexical_cast(this->side_); + std::string sidestr = std::to_string(this->side_); if (this->ai_!=NULL) { return this->ai_->describe_self()+std::string(" for side ")+sidestr+std::string(" : "); @@ -575,9 +575,9 @@ const std::string manager::internal_evaluate_command( side_number side, const st side_number side = lexical_cast(cmd.at(1)); std::string file = cmd.at(2); if (add_ai_for_side_from_file(side,file,false)){ - return std::string("AI MANAGER: added [")+manager::get_active_ai_identifier_for_side(side)+std::string("] AI for side ")+lexical_cast(side)+std::string(" from file ")+file; + return std::string("AI MANAGER: added [")+manager::get_active_ai_identifier_for_side(side)+std::string("] AI for side ")+std::to_string(side)+std::string(" from file ")+file; } else { - return std::string("AI MANAGER: failed attempt to add AI for side ")+lexical_cast(side)+std::string(" from file ")+file; + return std::string("AI MANAGER: failed attempt to add AI for side ")+std::to_string(side)+std::string(" from file ")+file; } } //!replace_ai side file @@ -585,9 +585,9 @@ const std::string manager::internal_evaluate_command( side_number side, const st side_number side = lexical_cast(cmd.at(1)); std::string file = cmd.at(2); if (add_ai_for_side_from_file(side,file,true)){ - return std::string("AI MANAGER: added [")+manager::get_active_ai_identifier_for_side(side)+std::string("] AI for side ")+lexical_cast(side)+std::string(" from file ")+file; + return std::string("AI MANAGER: added [")+manager::get_active_ai_identifier_for_side(side)+std::string("] AI for side ")+std::to_string(side)+std::string(" from file ")+file; } else { - return std::string("AI MANAGER: failed attempt to add AI for side ")+lexical_cast(side)+std::string(" from file ")+file; + return std::string("AI MANAGER: failed attempt to add AI for side ")+std::to_string(side)+std::string(" from file ")+file; } } @@ -596,7 +596,7 @@ const std::string manager::internal_evaluate_command( side_number side, const st if (cmd.at(0)=="!remove_ai"){ side_number side = lexical_cast(cmd.at(1)); remove_ai_for_side(side); - return std::string("AI MANAGER: made an attempt to remove AI for side ")+lexical_cast(side); + return std::string("AI MANAGER: made an attempt to remove AI for side ")+std::to_string(side); } if (cmd.at(0)=="!"){ //this command should not be recorded in history diff --git a/src/ai/testing.cpp b/src/ai/testing.cpp index 703830752765..af879fc0c4ac 100644 --- a/src/ai/testing.cpp +++ b/src/ai/testing.cpp @@ -83,7 +83,7 @@ void ai_testing::log_victory(std::set winners) resources::recorder->add_log_data("ai_log","result","victory"); for(std::set::const_iterator w = winners.begin(); w != winners.end(); ++w) { LOG_AI_TESTING << "WINNER: "<< *w <add_log_data("ai_log","winner",str_cast(*w)); + resources::recorder->add_log_data("ai_log","winner",std::to_string(*w)); } } @@ -93,7 +93,7 @@ void ai_testing::log_game_start() int side = tm-resources::teams->begin()+1; LOG_AI_TESTING << "AI_IDENTIFIER"<side() << std::endl; - resources::recorder->add_log_data("ai_log","ai_id"+str_cast(side),ai::manager::get_active_ai_identifier_for_side(side)); + resources::recorder->add_log_data("ai_log","ai_id"+std::to_string(side),ai::manager::get_active_ai_identifier_for_side(side)); ///@todo 1.9: add information about ai_config } LOG_AI_TESTING << "VERSION: " << game_config::revision << std::endl; @@ -104,10 +104,10 @@ void ai_testing::log_game_end() { LOG_AI_TESTING << "GAME_END_TURN: "<< resources::tod_manager->turn() <add_log_data("ai_log","end_turn", - str_cast(resources::tod_manager->turn())); + std::to_string(resources::tod_manager->turn())); for (std::vector::const_iterator tm = resources::teams->begin(); tm != resources::teams->end(); ++tm) { int side = tm-resources::teams->begin()+1; - resources::recorder->add_log_data("ai_log","end_gold"+str_cast(side),str_cast(tm->gold())); - resources::recorder->add_log_data("ai_log","end_units"+str_cast(side),str_cast(resources::gameboard->side_units(side))); + resources::recorder->add_log_data("ai_log","end_gold"+std::to_string(side),std::to_string(tm->gold())); + resources::recorder->add_log_data("ai_log","end_units"+std::to_string(side),std::to_string(resources::gameboard->side_units(side))); } } diff --git a/src/carryover.cpp b/src/carryover.cpp index 752ed1e4a7c6..f1bc1915eb55 100644 --- a/src/carryover.cpp +++ b/src/carryover.cpp @@ -105,7 +105,7 @@ std::string carryover::get_recruits(bool erase){ const std::string carryover::to_string(){ std::string side = ""; - side.append("Side " + save_id_ + ": gold " + str_cast(gold_) + " recruits " + get_recruits(false) + " units "); + side.append("Side " + save_id_ + ": gold " + std::to_string(gold_) + " recruits " + get_recruits(false) + " units "); BOOST_FOREACH(const config & u_cfg, recall_list_) { side.append(u_cfg["name"].str() + ", "); } diff --git a/src/color_range.cpp b/src/color_range.cpp index 4d02df5f1a8d..81066f74ffec 100644 --- a/src/color_range.cpp +++ b/src/color_range.cpp @@ -178,7 +178,7 @@ std::string rgb2highlight_pango(Uint32 rgb) int color_range::index() const { for(int i = 1; i <= gamemap::MAX_PLAYERS; ++i) { - if(*this==(game_config::color_info(lexical_cast(i)))) { + if(*this==(game_config::color_info(std::to_string(i)))) { return i; } } diff --git a/src/config.cpp b/src/config.cpp index f58db7e921e4..24410966cfd0 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -326,9 +326,9 @@ class config::attribute_value::string_visitor std::string operator()(const boost::blank &) const { return std::string(); } std::string operator()(const yes_no & b) const { return b.str(); } std::string operator()(const true_false & b) const { return b.str(); } - std::string operator()(int i) const { return str_cast(i); } - std::string operator()(unsigned long long u) const { return str_cast(u); } - std::string operator()(double d) const { return str_cast(d); } + std::string operator()(int i) const { return std::to_string(i); } + std::string operator()(unsigned long long u) const { return std::to_string(u); } + std::string operator()(double d) const { return std::to_string(d); } std::string operator()(std::string const &s) const { return s; } std::string operator()(t_string const &s) const { return s.str(); } }; diff --git a/src/editor/editor_display.cpp b/src/editor/editor_display.cpp index 376d4b699a23..853574c64f65 100644 --- a/src/editor/editor_display.cpp +++ b/src/editor/editor_display.cpp @@ -151,7 +151,7 @@ void editor_display::draw_sidebar() text = get_map().get_terrain_editor_string(mouseoverHex_); refresh_report("terrain", &element); refresh_report("terrain_info"); - text = str_cast(mouseoverHex_); + text = lexical_cast(mouseoverHex_); refresh_report("position", &element); } diff --git a/src/editor/editor_preferences.cpp b/src/editor/editor_preferences.cpp index 790f6f7514f4..86118bf1cad6 100644 --- a/src/editor/editor_preferences.cpp +++ b/src/editor/editor_preferences.cpp @@ -29,7 +29,7 @@ namespace editor { } void set_auto_update_transitions(int value) { - preferences::set("editor_auto_update_transitions", lexical_cast(value)); + preferences::set("editor_auto_update_transitions", std::to_string(value)); } std::string default_dir() { @@ -67,19 +67,19 @@ namespace editor { void set_tod_r(int value) { normalize_editor_rgb(value); - preferences::set("editor_r",lexical_cast(value)); + preferences::set("editor_r",std::to_string(value)); } void set_tod_g(int value) { normalize_editor_rgb(value); - preferences::set("editor_g",lexical_cast(value)); + preferences::set("editor_g",std::to_string(value)); } void set_tod_b(int value) { normalize_editor_rgb(value); - preferences::set("editor_b",lexical_cast(value)); + preferences::set("editor_b",std::to_string(value)); } int tod_r() diff --git a/src/editor/map/context_manager.cpp b/src/editor/map/context_manager.cpp index 9011c0407f59..0dedc4f1ac57 100644 --- a/src/editor/map/context_manager.cpp +++ b/src/editor/map/context_manager.cpp @@ -305,7 +305,7 @@ void context_manager::expand_open_maps_menu(std::vector& items) else filename = _("(New Scenario)"); } - std::string label = "[" + lexical_cast(mci) + "] " + std::string label = "[" + std::to_string(mci) + "] " + filename + (changed ? " [*]" : ""); if (map_contexts_[mci]->is_embedded()) { label += " (E)"; diff --git a/src/editor/map/editor_map.cpp b/src/editor/map/editor_map.cpp index 65ed58dd5da6..eebeab76b055 100644 --- a/src/editor/map/editor_map.cpp +++ b/src/editor/map/editor_map.cpp @@ -153,7 +153,7 @@ std::set editor_map::set_starting_position_labels(display& disp) label += " "; for (int i = 0, size = starting_positions_.size(); i < size; ++i) { if (starting_positions_[i].valid()) { - disp.labels().set_label(starting_positions_[i], label + lexical_cast(i + 1)); + disp.labels().set_label(starting_positions_[i], label + std::to_string(i + 1)); label_locs.insert(starting_positions_[i]); } } diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 0f4b8c339868..04bf63145961 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -375,7 +375,7 @@ variant unit_type_callable::get_value(const std::string& key) const } else if(key == "type") { return variant(u_.type_name()); } else if(key == "alignment") { - return variant(lexical_cast(u_.alignment())); + return variant(unit_type::ALIGNMENT::enum_to_string(u_.alignment())); } else if(key == "race") { return variant(u_.race_id()); } else if(key == "abilities") { diff --git a/src/formula/variant.cpp b/src/formula/variant.cpp index c88cefa69111..c0be6dbe7ca9 100644 --- a/src/formula/variant.cpp +++ b/src/formula/variant.cpp @@ -1049,7 +1049,7 @@ void variant::serialize_to_string(std::string& str) const str += "null()"; break; case TYPE_INT: - str += boost::lexical_cast(int_value_); + str += std::to_string(int_value_); break; case TYPE_DECIMAL: { std::ostringstream s; @@ -1168,7 +1168,7 @@ std::string variant::string_cast() const case TYPE_NULL: return "0"; case TYPE_INT: - return boost::lexical_cast(int_value_); + return std::to_string(int_value_); case TYPE_DECIMAL: { std::ostringstream s; diff --git a/src/game_board.cpp b/src/game_board.cpp index c0868aa26ed7..cd5cc853bff0 100644 --- a/src/game_board.cpp +++ b/src/game_board.cpp @@ -114,7 +114,7 @@ void game_board::check_victory(bool & continue_level, bool & found_player, bool { DBG_EE << "Found a unit: " << i.id() << " on side " << i.side() << std::endl; const team& tm = teams()[i.side()-1]; - DBG_EE << "That team's defeat condition is: " << lexical_cast (tm.defeat_condition()) << std::endl; + DBG_EE << "That team's defeat condition is: " << tm.defeat_condition() << std::endl; if (i.can_recruit() && tm.defeat_condition() == team::DEFEAT_CONDITION::NO_LEADER) { not_defeated.insert(i.side()); } else if (tm.defeat_condition() == team::DEFEAT_CONDITION::NO_UNITS) { @@ -207,10 +207,10 @@ void game_board::side_drop_to(int side_num, team::CONTROLLER ctrl, team::PROXY_C tm.change_proxy(proxy); tm.set_local(true); - tm.set_current_player(lexical_cast (ctrl) + lexical_cast (side_num)); + tm.set_current_player(team::CONTROLLER::enum_to_string(ctrl) + std::to_string(side_num)); unit_map::iterator leader = units_.find_leader(side_num); - if (leader.valid()) leader->rename(lexical_cast (ctrl) + lexical_cast (side_num)); + if (leader.valid()) leader->rename(team::CONTROLLER::enum_to_string(ctrl) + std::to_string(side_num)); } void game_board::side_change_controller(int side_num, bool is_local, const std::string& pname) { @@ -349,7 +349,7 @@ void game_board::write_config(config & cfg) const config& side = cfg.add_child("side"); t->write(side); side["no_leader"] = true; - side["side"] = str_cast(side_num); + side["side"] = std::to_string(side_num); //current units { diff --git a/src/game_classification.cpp b/src/game_classification.cpp index 5ac5be29ab15..42f8046d867d 100644 --- a/src/game_classification.cpp +++ b/src/game_classification.cpp @@ -96,7 +96,7 @@ config game_classification::to_config() const cfg["label"] = label; cfg["version"] = game_config::version; - cfg["campaign_type"] = lexical_cast (campaign_type); + cfg["campaign_type"] = game_classification::CAMPAIGN_TYPE::enum_to_string(campaign_type); cfg["campaign_define"] = campaign_define; cfg["campaign_extra_defines"] = utils::join(campaign_xtra_defines); cfg["scenario_define"] = scenario_define; @@ -106,7 +106,7 @@ config game_classification::to_config() const cfg["abbrev"] = abbrev; cfg["end_credits"] = end_credits; cfg["end_text"] = end_text; - cfg["end_text_duration"] = str_cast(end_text_duration); + cfg["end_text_duration"] = std::to_string(end_text_duration); cfg["difficulty"] = difficulty; cfg["random_mode"] = random_mode; cfg["oos_debug"] = oos_debug; diff --git a/src/game_display.cpp b/src/game_display.cpp index 31cc4168bb1c..537d07f5f047 100644 --- a/src/game_display.cpp +++ b/src/game_display.cpp @@ -446,7 +446,7 @@ void game_display::draw_hex(const map_location& loc) if(game_config::debug) { int debugH = debugHighlights_[loc]; if (debugH) { - std::string txt = lexical_cast(debugH); + std::string txt = std::to_string(debugH); draw_text_in_hex(loc, LAYER_MOVE_INFO, txt, 18, font::BAD_COLOR); } } @@ -585,7 +585,7 @@ void game_display::draw_movement_info(const map_location& loc) if (!reach_map_.empty()) { reach_map::iterator reach = reach_map_.find(loc); if (reach != reach_map_.end() && reach->second > 1) { - const std::string num = lexical_cast(reach->second); + const std::string num = std::to_string(reach->second); draw_text_in_hex(loc, LAYER_MOVE_INFO, num, 16, font::YELLOW_COLOR); } } diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index f88ae1a7fd1b..d24c75f7b7b4 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -114,7 +114,7 @@ connect_engine::connect_engine(saved_game& state, std::string team_prefix(std::string(_("Team")) + " "); int side_count = 1; BOOST_FOREACH(config& side, sides) { - const std::string side_str = lexical_cast(side_count); + const std::string side_str = std::to_string(side_count); config::attribute_value& team_name = side["team_name"]; config::attribute_value& user_team_name = side["user_team_name"]; @@ -146,9 +146,9 @@ connect_engine::connect_engine(saved_game& state, original_team_names.push_back(team_name); team_name = "Team " + - lexical_cast(original_team_names.size()); + std::to_string(original_team_names.size()); } else { - team_name = "Team " + lexical_cast( + team_name = "Team " + std::to_string( name_itor - original_team_names.begin() + 1); } // Note that the prefix "Team " is untranslatable, as team_name is not meant to be translated. This is needed so that the attribute // is not interpretted as an int when reading from config, which causes bugs later. @@ -892,7 +892,7 @@ side_engine::side_engine(const config& cfg, connect_engine& parent_engine, } if(!parent_.params_.saved_game && cfg_["save_id"].str().empty()) { assert(cfg_["id"].empty()); // we already setted "save_id" to "id" if "id" existed. - cfg_["save_id"] = parent_.scenario()["id"].str() + "_" + lexical_cast(index); + cfg_["save_id"] = parent_.scenario()["id"].str() + "_" + std::to_string(index); } update_controller_options(); @@ -1365,7 +1365,7 @@ std::string side_engine::get_color(int index) const } index -= 1; } - return lexical_cast(index + 1); + return std::to_string(index + 1); } int side_engine::num_colors() const diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index a71116ec20d8..cba987217bb2 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -209,7 +209,7 @@ void scenario::set_sides() pos < map_positions; ++pos) { config& side = data_.add_child("side"); side["side"] = pos + 1; - side["team_name"] = "Team " + lexical_cast(pos + 1); + side["team_name"] = "Team " + std::to_string(pos + 1); side["canrecruit"] = true; side["controller"] = "human"; } @@ -1059,7 +1059,7 @@ void create_engine::init_all_levels() // Stand-alone scenarios. BOOST_FOREACH(const config &data, game_config_manager::get()->game_config().child_range( - lexical_cast (game_classification::CAMPAIGN_TYPE::MULTIPLAYER))) + std::to_string (game_classification::CAMPAIGN_TYPE::MULTIPLAYER))) { if (!data["allow_new_game"].to_bool(true)) continue; diff --git a/src/game_initialization/multiplayer_connect.cpp b/src/game_initialization/multiplayer_connect.cpp index 8d3544d7725f..fc86daee5b2a 100644 --- a/src/game_initialization/multiplayer_connect.cpp +++ b/src/game_initialization/multiplayer_connect.cpp @@ -75,11 +75,11 @@ connect::side::side(connect& parent, ng::side_engine_ptr engine) : color_lock_(engine_->cfg()["color_lock"].to_bool( parent_->force_lock_settings())), changed_(false), - label_player_number_(parent.video(), str_cast(engine_->index() + 1), + label_player_number_(parent.video(), std::to_string(engine_->index() + 1), font::SIZE_LARGE, font::LOBBY_COLOR), label_original_controller_(parent.video(), engine_->reserved_for(), font::SIZE_SMALL), - label_gold_(parent.video(), str_cast(engine_->gold()), font::SIZE_SMALL, font::LOBBY_COLOR), + label_gold_(parent.video(), std::to_string(engine_->gold()), font::SIZE_SMALL, font::LOBBY_COLOR), label_income_(parent.video(), get_income_string(engine_->income()), font::SIZE_SMALL, font::LOBBY_COLOR), combo_controller_(new gui::combo_drag(parent.video(), @@ -220,7 +220,7 @@ void connect::side::process_event() if (slider_gold_.value() != engine_->gold() && slider_gold_.enabled()) { engine_->set_gold(slider_gold_.value()); changed_ = true; - label_gold_.set_text(str_cast(engine_->gold())); + label_gold_.set_text(std::to_string(engine_->gold())); } if (slider_income_.value() != engine_->income() && slider_income_.enabled()) { engine_->set_income(slider_income_.value()); @@ -250,7 +250,7 @@ void connect::side::update_ui() combo_team_.set_selected(engine_->team()); combo_color_.set_selected(engine_->color()); slider_gold_.set_value(engine_->gold()); - label_gold_.set_text(str_cast(engine_->gold())); + label_gold_.set_text(std::to_string(engine_->gold())); slider_income_.set_value(engine_->income()); std::stringstream buf; if (engine_->income() < 0) { diff --git a/src/game_initialization/multiplayer_lobby.cpp b/src/game_initialization/multiplayer_lobby.cpp index 715167115bce..542cea0b8e4c 100644 --- a/src/game_initialization/multiplayer_lobby.cpp +++ b/src/game_initialization/multiplayer_lobby.cpp @@ -620,8 +620,8 @@ void gamebrowser::populate_game_item_map_info(gamebrowser::game_item & item, con // Parsing the map and generating the minimap are both cpu expensive gamemap map(boost::make_shared(game_config), item.map_data); item.mini_map = image::getMinimap(minimap_size_, minimap_size_, map, 0); - item.map_info_size = str_cast(map.w()) + utils::unicode_multiplication_sign - + str_cast(map.h()); + item.map_info_size = std::to_string(map.w()) + utils::unicode_multiplication_sign + + std::to_string(map.h()); } } catch (incorrect_map_format_error &e) { ERR_CF << "illegal map: " << e.message << '\n'; diff --git a/src/game_initialization/multiplayer_ui.cpp b/src/game_initialization/multiplayer_ui.cpp index 09c4e951266f..1b338602155d 100644 --- a/src/game_initialization/multiplayer_ui.cpp +++ b/src/game_initialization/multiplayer_ui.cpp @@ -83,7 +83,7 @@ namespace mp { std::string get_color_string(int id) { std::string prefix = team::get_side_highlight(id); - std::map::iterator name = game_config::team_rgb_name.find(str_cast(id + 1)); + std::map::iterator name = game_config::team_rgb_name.find(std::to_string(id + 1)); if(name != game_config::team_rgb_name.end()){ return prefix + name->second; }else{ diff --git a/src/game_initialization/multiplayer_wait.cpp b/src/game_initialization/multiplayer_wait.cpp index 6c599f04b3b9..7e754025d036 100644 --- a/src/game_initialization/multiplayer_wait.cpp +++ b/src/game_initialization/multiplayer_wait.cpp @@ -372,7 +372,7 @@ void wait::join_game(bool observe) const int faction_choice = gui::show_dialog(video(), NULL, _("Choose your faction:"), _("Starting position: ") + - lexical_cast(side_num + 1), gui::OK_CANCEL, + std::to_string(side_num + 1), gui::OK_CANCEL, &choices, &preview_panes); if(faction_choice < 0) { set_result(QUIT); diff --git a/src/game_preferences.cpp b/src/game_preferences.cpp index 0f367acb7663..996b69998796 100644 --- a/src/game_preferences.cpp +++ b/src/game_preferences.cpp @@ -817,7 +817,7 @@ int village_support() void set_village_support(int value) { - preferences::set("mp_village_support", lexical_cast(value)); + preferences::set("mp_village_support", std::to_string(value)); } int xp_modifier() diff --git a/src/game_state.cpp b/src/game_state.cpp index 4e8e1205e498..cdfe09447cdd 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -211,7 +211,7 @@ void game_state::init(const config& level, play_controller & pc) for(size_t i = 0; i < board_.teams_.size(); i++) { // Labels from players in your ignore list default to hidden if(preferences::is_ignored(board_.teams_[i].current_player())) { - std::string label_cat = "side:" + str_cast(i + 1); + std::string label_cat = "side:" + std::to_string(i + 1); board_.hidden_label_categories_ref().push_back(label_cat); } } diff --git a/src/generators/default_map_generator.cpp b/src/generators/default_map_generator.cpp index 3004c37c1870..19d8a798fd45 100644 --- a/src/generators/default_map_generator.cpp +++ b/src/generators/default_map_generator.cpp @@ -300,15 +300,15 @@ void default_map_generator::user_config(CVideo& v) font::draw_text(&screen,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,landform_rect.x,landform_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, - font::NORMAL_COLOR, str_cast(nplayers_), + font::NORMAL_COLOR, std::to_string(nplayers_), slider_right + horz_margin, players_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, - font::NORMAL_COLOR, str_cast(width_), + font::NORMAL_COLOR, std::to_string(width_), slider_right + horz_margin, width_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, - font::NORMAL_COLOR, str_cast(height_), + font::NORMAL_COLOR, std::to_string(height_), slider_right+horz_margin,height_rect.y); std::stringstream villages_str; @@ -317,7 +317,7 @@ void default_map_generator::user_config(CVideo& v) slider_right+horz_margin,villages_rect.y); font::draw_text(&screen, screen_area(), font::SIZE_NORMAL, - font::NORMAL_COLOR, str_cast(castle_size_), + font::NORMAL_COLOR, std::to_string(castle_size_), slider_right + horz_margin, castlesize_rect.y); std::stringstream landform_str; diff --git a/src/gui/dialogs/addon/description.cpp b/src/gui/dialogs/addon/description.cpp index 904cc9736781..fa2cf17c183f 100644 --- a/src/gui/dialogs/addon/description.cpp +++ b/src/gui/dialogs/addon/description.cpp @@ -320,7 +320,7 @@ taddon_description::taddon_description(const std::string& addon_id, register_label("author", true, addon.author); register_label("type", true, addon.display_type()); register_label("size", true, size_display_string(addon.size)); - register_label("downloads", true, str_cast(addon.downloads)); + register_label("downloads", true, std::to_string(addon.downloads)); register_label("created", true, created_text); register_label("updated", true, updated_text); if(!addon.description.empty()) { diff --git a/src/gui/dialogs/addon/list.cpp b/src/gui/dialogs/addon/list.cpp index 69aa4e1c699b..153e88d0240b 100644 --- a/src/gui/dialogs/addon/list.cpp +++ b/src/gui/dialogs/addon/list.cpp @@ -407,7 +407,7 @@ void taddon_list::pre_show(twindow& window) item["label"] = size_display_string(info.size); data.insert(std::make_pair("size", item)); - item["label"] = lexical_cast(info.downloads); + item["label"] = std::to_string(info.downloads); data.insert(std::make_pair("downloads", item)); item["label"] = info.display_type(); @@ -516,7 +516,7 @@ void taddon_list::on_addon_select(twindow& window) status.set_use_markup(true); find_widget(&window, "size", false).set_label(size_display_string(info.size)); - find_widget(&window, "downloads", false).set_label(lexical_cast(info.downloads)); + find_widget(&window, "downloads", false).set_label(std::to_string(info.downloads)); find_widget(&window, "created", false).set_label(format_addon_time(info.created)); find_widget(&window, "updated", false).set_label(format_addon_time(info.updated)); diff --git a/src/gui/dialogs/campaign_selection.cpp b/src/gui/dialogs/campaign_selection.cpp index ef20528db20a..0a4e5eb37f60 100644 --- a/src/gui/dialogs/campaign_selection.cpp +++ b/src/gui/dialogs/campaign_selection.cpp @@ -155,7 +155,7 @@ void tcampaign_selection::pre_show(twindow& window) tree_group_field["label"] = campaign["completed"].to_bool() ? "misc/laurel.png" : "misc/blank-hex.png"; tree_group_item["victory"] = tree_group_field; - tree.add_node("campaign", tree_group_item).set_id(lexical_cast(id++)); + tree.add_node("campaign", tree_group_item).set_id(std::to_string(id++)); /*** Add detail item ***/ string_map detail_item; diff --git a/src/gui/dialogs/debug_clock.cpp b/src/gui/dialogs/debug_clock.cpp index 5b208947829a..9e95427cff3c 100644 --- a/src/gui/dialogs/debug_clock.cpp +++ b/src/gui/dialogs/debug_clock.cpp @@ -161,7 +161,7 @@ void tdebug_clock::update_time(const bool force) std::map item_data; string_map item; - item["label"] = str_cast(second_stamp); + item["label"] = std::to_string(second_stamp); item_data.insert(std::make_pair("time", item)); if(pane_) { diff --git a/src/gui/dialogs/editor/resize_map.cpp b/src/gui/dialogs/editor/resize_map.cpp index 3c35f746b1fb..054a8920db17 100644 --- a/src/gui/dialogs/editor/resize_map.cpp +++ b/src/gui/dialogs/editor/resize_map.cpp @@ -100,8 +100,8 @@ teditor_resize_map::teditor_resize_map(int& width, { register_bool("copy_edge_terrain", false, copy_edge_terrain); - register_label("old_width", false, str_cast(width)); - register_label("old_height", false, str_cast(height)); + register_label("old_width", false, std::to_string(width)); + register_label("old_height", false, std::to_string(height)); } void teditor_resize_map::pre_show(twindow& window) @@ -122,7 +122,7 @@ void teditor_resize_map::pre_show(twindow& window) std::string name_prefix = "expand"; for(int i = 0; i < 9; ++i) { - std::string name = name_prefix + lexical_cast(i); + std::string name = name_prefix + std::to_string(i); direction_buttons_[i] = find_widget(&window, name, false, true); diff --git a/src/gui/dialogs/editor/set_starting_position.cpp b/src/gui/dialogs/editor/set_starting_position.cpp index 10b62b4e8603..b2060d1f385f 100644 --- a/src/gui/dialogs/editor/set_starting_position.cpp +++ b/src/gui/dialogs/editor/set_starting_position.cpp @@ -94,7 +94,7 @@ void teditor_set_starting_position::pre_show(twindow& window) data.clear(); utils::string_map symbols; - symbols["player_number"] = str_cast(i + 1); + symbols["player_number"] = std::to_string(i + 1); column["label"] = utils::interpolate_variables_into_string( _("Player $player_number"), &symbols); diff --git a/src/gui/dialogs/gamestate_inspector.cpp b/src/gui/dialogs/gamestate_inspector.cpp index 514e1093896a..24e535b15125 100644 --- a/src/gui/dialogs/gamestate_inspector.cpp +++ b/src/gui/dialogs/gamestate_inspector.cpp @@ -703,7 +703,7 @@ class tgamestate_inspector::controller ? static_cast((*resources::teams).size()) : 0; for(int side = 1; side <= sides; ++side) { - std::string side_str = str_cast(side); + std::string side_str = std::to_string(side); sm_controllers_.push_back(boost::shared_ptr( new team_mode_controller( std::string("team ") + side_str, model_, side))); diff --git a/src/gui/dialogs/label_settings.cpp b/src/gui/dialogs/label_settings.cpp index 506d3acb9384..a77d562aa99c 100644 --- a/src/gui/dialogs/label_settings.cpp +++ b/src/gui/dialogs/label_settings.cpp @@ -54,7 +54,7 @@ tlabel_settings::tlabel_settings(display_context& dc) : viewer(dc) { } for(size_t i = 0; i < dc.teams().size(); i++) { const team& team = dc.teams()[i]; - const std::string label_cat_key = "side:" + str_cast(i + 1); + const std::string label_cat_key = "side:" + std::to_string(i + 1); if(team.hidden()) { labels_display[label_cat_key] = ""; continue; @@ -67,7 +67,7 @@ tlabel_settings::tlabel_settings(display_context& dc) : viewer(dc) { team_name = _("Unknown"); } string_map subst; - subst["side_number"] = str_cast(i + 1); + subst["side_number"] = std::to_string(i + 1); subst["name"] = team_name; labels_display[label_cat_key] = vgettext("Side $side_number ($name)", subst); } diff --git a/src/gui/dialogs/lobby/lobby.cpp b/src/gui/dialogs/lobby/lobby.cpp index 12579e1b4b5a..89295ac9cc72 100644 --- a/src/gui/dialogs/lobby/lobby.cpp +++ b/src/gui/dialogs/lobby/lobby.cpp @@ -623,9 +623,9 @@ void tlobby_main::update_gamelist_header() #ifndef GUI2_EXPERIMENTAL_LISTBOX utils::string_map symbols; symbols["num_shown"] - = lexical_cast(lobby_info_.games_filtered().size()); + = std::to_string(lobby_info_.games_filtered().size()); symbols["num_total"] - = lexical_cast(lobby_info_.games().size()); + = std::to_string(lobby_info_.games().size()); std::string games_string = VGETTEXT("Games: showing $num_shown out of $num_total", symbols); find_widget(gamelistbox_, "map", false).set_label(games_string); @@ -1547,7 +1547,7 @@ bool tlobby_main::do_game_join(int idx, bool observe) } config response; config& join = response.add_child("join"); - join["id"] = lexical_cast(game.id); + join["id"] = std::to_string(game.id); join["observe"] = observe; if(join && !observe && game.password_required) { std::string password; diff --git a/src/gui/dialogs/multiplayer/mp_change_control.cpp b/src/gui/dialogs/multiplayer/mp_change_control.cpp index 3f70112449e3..f6ec6ce009db 100644 --- a/src/gui/dialogs/multiplayer/mp_change_control.cpp +++ b/src/gui/dialogs/multiplayer/mp_change_control.cpp @@ -114,7 +114,7 @@ class tmp_change_control::model << "\" label: \"" << label << "\")\n"; std::map data; string_map item; - item["id"] = std::string("side_") + str_cast(side_num); + item["id"] = std::string("side_") + std::to_string(side_num); item["label"] = label; item["use_markup"] = "true"; data.insert(std::make_pair("side", item)); @@ -247,7 +247,7 @@ class tmp_change_control::controller for(int side = 1; side <= sides; ++side) { if(!resources::teams->at(side - 1).hidden()) { string_map symbols; - symbols["side"] = str_cast(side); + symbols["side"] = std::to_string(side); std::string side_str = vgettext("Side $side", symbols); side_str = font::span_color(team::get_side_color(side)) + side_str + ""; diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index bb117345d470..f1e6751e12ac 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -455,7 +455,7 @@ void tpreferences::initialize_members(twindow& window) find_widget(&window, "turbo_slider", false); const int selected_speed = std::find( - (accl_speeds_.begin()), accl_speeds_.end(), lexical_cast(turbo_speed())) + (accl_speeds_.begin()), accl_speeds_.end(), std::to_string(turbo_speed())) - (accl_speeds_.begin()); accl_slider.set_value_labels(accl_speeds_); diff --git a/src/gui/dialogs/unit_recruit.cpp b/src/gui/dialogs/unit_recruit.cpp index 7540911bad19..328c7b92a00f 100644 --- a/src/gui/dialogs/unit_recruit.cpp +++ b/src/gui/dialogs/unit_recruit.cpp @@ -93,7 +93,7 @@ void tunit_recruit::pre_show(twindow& window) const bool can_afford = recruit->cost() < team_.gold() - wb_gold; - const std::string cost_string = lexical_cast(recruit->cost()); + const std::string cost_string = std::to_string(recruit->cost()); column["label"] = image_string; row_data.insert(std::make_pair("unit_image", column)); diff --git a/src/gui/widgets/debug.cpp b/src/gui/widgets/debug.cpp index add3db978c11..0c21986e8519 100644 --- a/src/gui/widgets/debug.cpp +++ b/src/gui/widgets/debug.cpp @@ -57,8 +57,8 @@ std::string get_child_id(const std::string& parent_id, // instead. // return (formatter() << parent_id << "_C_" << row << '_' << col).c_str(); - std::string result = parent_id + "_C_" + lexical_cast(row) - + '_' + lexical_cast(col); + std::string result = parent_id + "_C_" + std::to_string(row) + + '_' + std::to_string(col); return result; } @@ -181,7 +181,7 @@ void tdebug_layout_graph::generate_dot_file(const std::string& generator, id += '_'; } const std::string filename = filename_base_ + id - + lexical_cast(++sequence_number_) + + std::to_string(++sequence_number_) + "-" + generator + ".dot"; std::ofstream file(filename.c_str()); @@ -251,7 +251,7 @@ void tdebug_layout_graph::widget_generate_info(std::ostream& out, for(size_t i = 0; i < generator->get_item_count(); ++i) { const std::string child_id = id + "_I_" - + lexical_cast(i); + + std::to_string(i); widget_generate_info(out, &generator->item(i), child_id, true); diff --git a/src/gui/widgets/listbox.cpp b/src/gui/widgets/listbox.cpp index a57aea9607b8..7ef1222b5b64 100644 --- a/src/gui/widgets/listbox.cpp +++ b/src/gui/widgets/listbox.cpp @@ -539,7 +539,7 @@ void tlistbox::finalize(tbuilder_grid_const_ptr header, } tgrid& p = find_widget(this, "_header_grid", false); for(unsigned i = 0, max = std::max(p.get_cols(), p.get_rows()); i < max; ++i) { - if(tselectable_* selectable = find_widget(&p, "sort_" + lexical_cast(i), false, false)) { + if(tselectable_* selectable = find_widget(&p, "sort_" + std::to_string(i), false, false)) { selectable->set_callback_state_change(boost::bind(&tlistbox::order_by_column, this, i, _1)); if(orders_.size() < max ) { orders_.resize(max); diff --git a/src/gui/widgets/unit_preview_pane.cpp b/src/gui/widgets/unit_preview_pane.cpp index 29876a14aa0c..1e6446bc4347 100644 --- a/src/gui/widgets/unit_preview_pane.cpp +++ b/src/gui/widgets/unit_preview_pane.cpp @@ -90,7 +90,7 @@ void tunit_preview_pane::set_displayed_type(const unit_type* type) if(label_level_) { utils::string_map symbols; - symbols["lvl"] = lexical_cast(type->level()); + symbols["lvl"] = std::to_string(type->level()); std::string l_str = vgettext("Lvl $lvl", symbols); diff --git a/src/hotkey/hotkey_handler.cpp b/src/hotkey/hotkey_handler.cpp index 64575f7f940e..573fc80d1738 100644 --- a/src/hotkey/hotkey_handler.cpp +++ b/src/hotkey/hotkey_handler.cpp @@ -366,11 +366,11 @@ void play_controller::hotkey_handler::expand_autosaves(std::vector& std::vector newitems; std::vector newsaves; for (unsigned int turn = play_controller_.turn(); turn != 0; turn--) { - std::string name = saved_game_.classification().label + "-" + _("Auto-Save") + lexical_cast(turn); + std::string name = saved_game_.classification().label + "-" + _("Auto-Save") + std::to_string(turn); if (savegame::save_game_exists(name, comp_format)) { newsaves.push_back( name + compression::format_extension(comp_format)); - newitems.push_back(_("Back to Turn ") + lexical_cast(turn)); + newitems.push_back(_("Back to Turn ") + std::to_string(turn)); } } diff --git a/src/hotkey/hotkey_item.cpp b/src/hotkey/hotkey_item.cpp index 4bdee7598062..77312f1ca826 100644 --- a/src/hotkey/hotkey_item.cpp +++ b/src/hotkey/hotkey_item.cpp @@ -267,7 +267,7 @@ bool hotkey_mouse::matches_helper(const SDL_Event &event) const const std::string hotkey_mouse::get_name_helper() const { - return "mouse " + lexical_cast(button_); + return "mouse " + std::to_string(button_); } void hotkey_mouse::save_helper(config &item) const diff --git a/src/image_modifications.cpp b/src/image_modifications.cpp index b4624fbc9169..b6cd9a9eaeb8 100644 --- a/src/image_modifications.cpp +++ b/src/image_modifications.cpp @@ -594,7 +594,7 @@ REGISTER_MOD_PARSER(TC, args) else { // This side is not initialized; use default "n" try { - team_color = lexical_cast(side_n); + team_color = std::to_string(side_n); } catch(bad_lexical_cast const&) { ERR_DP << "bad things happen" << std::endl; diff --git a/src/map/label.cpp b/src/map/label.cpp index b05ecada901b..ced1d742899f 100644 --- a/src/map/label.cpp +++ b/src/map/label.cpp @@ -301,7 +301,7 @@ const std::vector& map_labels::all_categories() const { categories.clear(); categories.push_back("team"); for(size_t i = 1; i <= resources::teams->size(); i++) { - categories.push_back("side:" + str_cast(i)); + categories.push_back("side:" + std::to_string(i)); } std::set unique_cats; BOOST_FOREACH(const team_label_map::value_type& m, labels_) { @@ -597,7 +597,7 @@ bool terrain_label::hidden() const { // Respect user's label preferences std::string category = "cat:" + category_; - std::string creator = "side:" + str_cast(creator_ + 1); + std::string creator = "side:" + std::to_string(creator_ + 1); const std::vector& hidden_categories = parent_->disp().get_disp_context().hidden_label_categories(); if(std::find(hidden_categories.begin(), hidden_categories.end(), category) != hidden_categories.end()) diff --git a/src/menu_events.cpp b/src/menu_events.cpp index ed1a37ea517e..4f0c954d44d9 100644 --- a/src/menu_events.cpp +++ b/src/menu_events.cpp @@ -141,7 +141,7 @@ void menu_handler::objectives(int side_num) } config cfg; - cfg["side"] = str_cast(side_num); + cfg["side"] = std::to_string(side_num); gamestate().lua_kernel_->run_wml_action("show_objectives", vconfig(cfg), game_events::queued_event("_from_interface", map_location(), map_location(), config())); @@ -655,7 +655,7 @@ void menu_handler::recall(int side_num, const map_location &last_hex) int wb_gold = pc_.get_whiteboard() ? pc_.get_whiteboard()->get_spent_gold_for(side_num) : 0; if (current_team.gold() - wb_gold < unit_cost) { utils::string_map i18n_symbols; - i18n_symbols["cost"] = lexical_cast(unit_cost); + i18n_symbols["cost"] = std::to_string(unit_cost); std::string msg = vngettext( "You must have at least 1 gold piece to recall a unit", "You must have at least $cost gold pieces to recall this unit", @@ -1480,7 +1480,7 @@ class map_command_handler void command_failed_need_arg(int argn) { utils::string_map symbols; - symbols["arg_id"] = lexical_cast(argn); + symbols["arg_id"] = std::to_string(argn); command_failed(VGETTEXT("Missing argument $arg_id", symbols)); } void print_usage() @@ -2082,7 +2082,7 @@ void chat_handler::send_command(const std::string& cmd, const std::string& args || cmd == "mute" || cmd == "unmute") { data.add_child(cmd)["username"] = args; } else if (cmd == "ping") { - data[cmd] = lexical_cast(time(NULL)); + data[cmd] = std::to_string(time(NULL)); } else if (cmd == "green") { data.add_child("query")["type"] = "lobbymsg @" + args; } else if (cmd == "red") { @@ -2518,7 +2518,7 @@ void console_handler::do_droid() { return; } else if (menu_handler_.teams()[side - 1].is_network()) { utils::string_map symbols; - symbols["side"] = lexical_cast(side); + symbols["side"] = std::to_string(side); command_failed(vgettext("Can't droid networked side: '$side'.", symbols)); return; } else if (menu_handler_.teams()[side - 1].is_local_human()) { @@ -2533,7 +2533,7 @@ void console_handler::do_droid() { } } else if (menu_handler_.teams()[side - 1].is_local_ai()) { // menu_handler_.teams()[side - 1].make_human(); -// menu_handler_.change_controller(lexical_cast(side),"human"); +// menu_handler_.change_controller(std::to_string(side),"human"); utils::string_map symbols; symbols["side"] = side_s; @@ -2557,12 +2557,12 @@ void console_handler::do_idle() { return; } else if (menu_handler_.teams()[side - 1].is_network()) { utils::string_map symbols; - symbols["side"] = lexical_cast(side); + symbols["side"] = std::to_string(side); command_failed(vgettext("Can't idle networked side: '$side'.", symbols)); return; } else if (menu_handler_.teams()[side - 1].is_local_ai()) { utils::string_map symbols; - symbols["side"] = lexical_cast(side); + symbols["side"] = std::to_string(side); command_failed(vgettext("Can't idle local ai side: '$side'.", symbols)); return; } else if (menu_handler_.teams()[side - 1].is_local_human()) { @@ -3071,7 +3071,7 @@ void menu_handler::user_command() void menu_handler::request_control_change ( int side_num, const std::string& player ) { - std::string side = str_cast(side_num); + std::string side = std::to_string(side_num); if (teams()[side_num - 1].is_local_human() && player == preferences::login()) { //this is already our side. return; diff --git a/src/network.cpp b/src/network.cpp index 30d24dde40fc..a870be2ee22a 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -171,8 +171,8 @@ static void check_timeout() ERR_NW << "No server ping since " << timeout << " seconds. Connection timed out.\n"; utils::string_map symbols; - symbols["timeout"] = lexical_cast(timeout); - throw network::error("No server ping since " + str_cast(timeout) + " second. " + symbols["timeout"] = std::to_string(timeout); + throw network::error("No server ping since " + std::to_string(timeout) + " second. " "Connection timed out."); } last_ping_check = now; diff --git a/src/pathfind/teleport.cpp b/src/pathfind/teleport.cpp index b17495904d04..e788e5a7d7ed 100644 --- a/src/pathfind/teleport.cpp +++ b/src/pathfind/teleport.cpp @@ -291,13 +291,13 @@ config manager::to_config() const { for(; tunnel != tunnels_.end(); ++tunnel) { store.add_child("tunnel", tunnel->to_config()); } - store["next_teleport_group_id"] = str_cast(id_); + store["next_teleport_group_id"] = std::to_string(id_); return store; } std::string manager::next_unique_id() { - return str_cast(++id_); + return std::to_string(++id_); } diff --git a/src/play_controller.cpp b/src/play_controller.cpp index ab8f99827e95..8cf181213c44 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -447,8 +447,8 @@ void play_controller::do_init_side() gamestate_->init_side_done() = true; init_side_done_now_ = true; - const std::string turn_num = str_cast(turn()); - const std::string side_num = str_cast(current_side()); + const std::string turn_num = std::to_string(turn()); + const std::string side_num = std::to_string(current_side()); gamestate().gamedata_.get_variable("side_number") = current_side(); @@ -544,8 +544,8 @@ void play_controller::finish_side_turn() // Ending the turn commits all moves. undo_stack().clear(); gamestate().board_.end_turn(current_side()); - const std::string turn_num = str_cast(turn()); - const std::string side_num = str_cast(current_side()); + const std::string turn_num = std::to_string(turn()); + const std::string side_num = std::to_string(current_side()); // Clear shroud, in case units had been slowed for the turn. actions::clear_shroud(current_side()); @@ -568,7 +568,7 @@ void play_controller::finish_side_turn() void play_controller::finish_turn() { set_scontext_synced sync(2); - const std::string turn_num = str_cast(turn()); + const std::string turn_num = std::to_string(turn()); pump().fire("turn end"); pump().fire("turn " + turn_num + " end"); sync.do_final_checkup(); diff --git a/src/preferences.cpp b/src/preferences.cpp index ceed76dc8c3e..b64a4d67c7c9 100644 --- a/src/preferences.cpp +++ b/src/preferences.cpp @@ -381,8 +381,8 @@ bool fullscreen() void _set_resolution(const std::pair& res) { - preferences::set("xresolution", lexical_cast(res.first)); - preferences::set("yresolution", lexical_cast(res.second)); + preferences::set("xresolution", std::to_string(res.first)); + preferences::set("yresolution", std::to_string(res.second)); } void _set_maximized(bool ison) diff --git a/src/replay.cpp b/src/replay.cpp index 08844991a8d1..dc61f6cff41f 100644 --- a/src/replay.cpp +++ b/src/replay.cpp @@ -154,7 +154,7 @@ chat_msg::chat_msg(const config &cfg) { nick_ = cfg["id"].str(); } else { - nick_ = str_cast("*")+cfg["id"].str()+"*"; + nick_ = "*"+cfg["id"].str()+"*"; } int side = cfg["side"].to_int(0); LOG_REPLAY << "side in message: " << side << std::endl; diff --git a/src/reports.cpp b/src/reports.cpp index 1435569b82cc..22f6448b428f 100644 --- a/src/reports.cpp +++ b/src/reports.cpp @@ -336,7 +336,7 @@ static config unit_alignment(reports::context & rc, const unit* u) if (!u) return config(); std::ostringstream str, tooltip; const std::string align = unit_type::alignment_description(u->alignment(), u->gender()); - const std::string align_id = lexical_cast(u->alignment()); + const std::string align_id = unit_type::ALIGNMENT::enum_to_string(u->alignment()); int cm = combat_modifier(rc.units(), rc.map(), rc.screen().displayed_unit_hex(), u->alignment(), u->is_fearless()); @@ -1278,7 +1278,7 @@ REPORT_GENERATOR(villages, rc) REPORT_GENERATOR(num_units, rc) { - return gray_inactive(rc, str_cast(rc.dc().side_units(rc.screen().viewing_side()))); + return gray_inactive(rc, std::to_string(rc.dc().side_units(rc.screen().viewing_side()))); } REPORT_GENERATOR(upkeep, rc) @@ -1296,7 +1296,7 @@ REPORT_GENERATOR(expenses, rc) int viewing_side = rc.screen().viewing_side(); const team &viewing_team = rc.teams()[viewing_side - 1]; team_data td = rc.dc().calculate_team_data(viewing_team, rc.screen().viewing_side()); - return gray_inactive(rc,str_cast(td.expenses)); + return gray_inactive(rc,std::to_string(td.expenses)); } REPORT_GENERATOR(income, rc) diff --git a/src/save_index.cpp b/src/save_index.cpp index d6c428d76fd6..2cbcaeb1f199 100644 --- a/src/save_index.cpp +++ b/src/save_index.cpp @@ -68,7 +68,7 @@ void save_index_class::rebuild(const std::string& name, const time_t& modified) } catch(game::load_game_failed&) { summary["corrupt"] = true; } - summary["mod_time"] = str_cast(static_cast(modified)); + summary["mod_time"] = std::to_string(static_cast(modified)); write_save_index(); } diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 861de7a573cf..607a8c2f3a5a 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -430,7 +430,7 @@ static int impl_unit_set(lua_State *L) u.set_advancements(lua_check >(L, 3)); return 0; } - + if (strcmp(m, "upkeep") == 0) { if(lua_isnumber(L, 3)) { u.set_upkeep(luaL_checkint(L, 3)); @@ -441,10 +441,10 @@ static int impl_unit_set(lua_State *L) u.set_upkeep(unit::upkeep_loyal()); } else if(strcmp(m, "full") == 0) { - u.set_upkeep(unit::upkeep_full()); + u.set_upkeep(unit::upkeep_full()); } else { - + std::string err_msg = "unknown upkeep value of unit: "; err_msg += v; return luaL_argerror(L, 2, err_msg.c_str()); @@ -1551,7 +1551,7 @@ int game_lua_kernel::impl_game_config_get(lua_State *L) const mp_game_settings& mp_settings = play_controller_.get_mp_settings(); const game_classification & classification = play_controller_.get_classification(); - return_string_attrib("campaign_type", lexical_cast(classification.campaign_type)); + return_string_attrib("campaign_type", game_classification::CAMPAIGN_TYPE::enum_to_string(classification.campaign_type)); if(classification.campaign_type==game_classification::CAMPAIGN_TYPE::MULTIPLAYER) { return_cfgref_attrib("mp_settings", mp_settings.to_config()); return_cfgref_attrib("era", game_config_manager::get()->game_config().find_child("era","id",mp_settings.mp_era)); @@ -1967,11 +1967,11 @@ static int load_fake_units(lua_State* L, int arg, T& fake_units) if (!lua_istable(L, entry)) { goto error; } - + if (!luaW_tolocation(L, entry, src)) { goto error; } - + lua_rawgeti(L, entry, 3); if (!lua_isnumber(L, -1)) { lua_getfield(L, entry, "side"); @@ -1980,7 +1980,7 @@ static int load_fake_units(lua_State* L, int arg, T& fake_units) } } int side = lua_tointeger(L, -1); - + lua_rawgeti(L, entry, 4); if (!lua_isstring(L, -1)) { lua_getfield(L, entry, "type"); @@ -1989,10 +1989,10 @@ static int load_fake_units(lua_State* L, int arg, T& fake_units) } } std::string unit_type = lua_tostring(L, -1); - + boost::tuple tuple(src, side, unit_type); fake_units.push_back(tuple); - + lua_settop(L, entry - 1); } return 0; @@ -2547,7 +2547,7 @@ int game_lua_kernel::intf_float_label(lua_State *L) if (!lua_isnoneornil(L, 3)) { color = string_to_color(luaL_checkstring(L, 3)); } - + if (game_display_) { game_display_->float_label(loc, text, color); } @@ -2865,14 +2865,14 @@ int game_lua_kernel::intf_scroll_to_tile(lua_State *L) int game_lua_kernel::intf_select_hex(lua_State *L) { ERR_LUA << "wesnoth.select_hex is deprecated, use wesnoth.select_unit and/or wesnoth.highlight_hex" << std::endl; - + // Need this because check_location may change the stack // By doing this now, we ensure that it won't do so when // intf_select_unit and intf_highlight_hex call it. const map_location loc = luaW_checklocation(L, 1); luaW_pushlocation(L, loc); lua_replace(L, 1); - + intf_select_unit(L); if(!lua_isnoneornil(L, 2) && luaW_toboolean(L,2)) { intf_highlight_hex(L); @@ -4165,7 +4165,7 @@ int game_lua_kernel::intf_teleport(lua_State *L) teleport_path.push_back(src_loc); teleport_path.push_back(vacant_dst); unit_display::move_unit(teleport_path, u, animate); - + resources::units->move(src_loc, vacant_dst); unit::clear_status_caches(); @@ -4769,7 +4769,7 @@ int game_lua_kernel::cfun_builtin_effect(lua_State *L) // The times= key is supposed to be ignored by the effect function. // However, just in case someone doesn't realize this, we will set it to 1 here. cfg["times"] = 1; - + if(need_apply) { u.get()->apply_builtin_effect(which_effect, cfg); return 0; diff --git a/src/scripting/lua_map_location_ops.cpp b/src/scripting/lua_map_location_ops.cpp index 9dd57e49995e..c0405ade9a23 100644 --- a/src/scripting/lua_map_location_ops.cpp +++ b/src/scripting/lua_map_location_ops.cpp @@ -42,7 +42,7 @@ int intf_get_direction(lua_State* L) int nargs = lua_gettop(L); if (nargs != 2 and nargs != 3) { std::string msg("get_direction: must pass 2 or 3 args, found "); - msg += str_cast(nargs); + msg += std::to_string(nargs); luaL_error(L, msg.c_str()); return 0; } diff --git a/src/serialization/preprocessor.cpp b/src/serialization/preprocessor.cpp index 053f43e54c72..a8dd60fcb0cf 100644 --- a/src/serialization/preprocessor.cpp +++ b/src/serialization/preprocessor.cpp @@ -142,7 +142,7 @@ void preproc_define::write(config_writer& writer, const std::string& name) const writer.write_key_val("name", name); writer.write_key_val("value", value); writer.write_key_val("textdomain", textdomain); - writer.write_key_val("linenum", lexical_cast(linenum)); + writer.write_key_val("linenum", std::to_string(linenum)); writer.write_key_val("location", get_location(location)); BOOST_FOREACH(const std::string &arg, arguments) diff --git a/src/serialization/string_utils.cpp b/src/serialization/string_utils.cpp index fc98fcccfd4b..3c1ab68b79d8 100644 --- a/src/serialization/string_utils.cpp +++ b/src/serialization/string_utils.cpp @@ -231,7 +231,7 @@ std::vector< std::string > square_parenthetical_split(std::string const &val, int increment = (end >= begin ? 1 : -1); end+=increment; //include end in expansion for (int k=begin; k!=end; k+=increment) { - std::string pb = boost::lexical_cast(k); + std::string pb = std::to_string(k); for (size_t p=pb.size(); p<=padding; p++) pb = std::string("0") + pb; square_expansion.push_back(pb); diff --git a/src/synced_context.cpp b/src/synced_context.cpp index 4ac5061a97d6..51444d3e8bcf 100644 --- a/src/synced_context.cpp +++ b/src/synced_context.cpp @@ -425,7 +425,7 @@ set_scontext_synced::set_scontext_synced() set_scontext_synced::set_scontext_synced(int number) : set_scontext_synced_base() - , new_checkup_(generate_checkup("checkup" + boost::lexical_cast(number))), disabler_() + , new_checkup_(generate_checkup("checkup" + std::to_string(number))), disabler_() { init(); } diff --git a/src/synced_user_choice.cpp b/src/synced_user_choice.cpp index 27cd65c93987..8eee22c0e18f 100644 --- a/src/synced_user_choice.cpp +++ b/src/synced_user_choice.cpp @@ -285,11 +285,11 @@ void user_choice_manager::search_in_replay() } if(required_.find(from_side) == required_.end()) { - replay::process_error("MP synchronization: we got an answer from side " + boost::lexical_cast(from_side) + "for [" + tagname_ + "] which is not was we expected\n"); + replay::process_error("MP synchronization: we got an answer from side " + std::to_string(from_side) + "for [" + tagname_ + "] which is not was we expected\n"); } if(res_.find(from_side) != res_.end()) { - replay::process_error("MP synchronization: we got already our answer from side " + boost::lexical_cast(from_side) + "for [" + tagname_ + "] now we have it twice.\n"); + replay::process_error("MP synchronization: we got already our answer from side " + std::to_string(from_side) + "for [" + tagname_ + "] now we have it twice.\n"); } res_[from_side] = action->child(tagname_); changed_event_.notify_observers(); @@ -318,7 +318,7 @@ void user_choice_manager::update_local_choice() if(res_.find(side) == res_.end()) { sides_str += " "; - sides_str += lexical_cast(side); + sides_str += std::to_string(side); //and it is local if((*resources::teams)[side-1].is_local() && !(*resources::teams)[side-1].is_idle()) { diff --git a/src/team.cpp b/src/team.cpp index ef781bfac439..11bb9986fbb5 100644 --- a/src/team.cpp +++ b/src/team.cpp @@ -330,7 +330,7 @@ void team::build(const config &cfg, const gamemap& map, int gold) if (gold_ != info_.gold) info_.start_gold = gold; // Old code was doing: - // info_.start_gold = str_cast(gold) + " (" + info_.start_gold + ")"; + // info_.start_gold = std::to_string(gold) + " (" + info_.start_gold + ")"; // Was it correct? // Load in the villages the side controls at the start @@ -660,7 +660,7 @@ void validate_side(int side) } if(side < 1 || side > int(teams->size())) { - throw game::game_error("invalid side(" + str_cast(side) + ") found in unit definition"); + throw game::game_error("invalid side(" + std::to_string(side) + ") found in unit definition"); } } @@ -846,7 +846,7 @@ std::string team::get_side_color_index(int side) return side_map; } } - return str_cast(side); + return std::to_string(side); } std::string team::get_side_highlight(int side) diff --git a/src/teambuilder.cpp b/src/teambuilder.cpp index c2b96c446e13..f0e67a70e558 100644 --- a/src/teambuilder.cpp +++ b/src/teambuilder.cpp @@ -215,7 +215,7 @@ class team_builder { if ( seen_ids_.find(id)!=seen_ids_.end() ) { //seen before config u_tmp = u; - u_tmp["side"] = str_cast(side_); + u_tmp["side"] = std::to_string(side_); t_->recall_list().add(unit_ptr(new unit(u_tmp,true))); } else { //not seen before diff --git a/src/terrain/filter.cpp b/src/terrain/filter.cpp index 818fe34d308f..8cc94460af7c 100644 --- a/src/terrain/filter.cpp +++ b/src/terrain/filter.cpp @@ -270,14 +270,14 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x if(!tod_type.empty()) { const std::vector& vals = utils::split(tod_type); if(tod.lawful_bonus<0) { - if(std::find(vals.begin(),vals.end(),lexical_cast(unit_type::ALIGNMENT::CHAOTIC)) == vals.end()) { + if(std::find(vals.begin(),vals.end(),std::to_string(unit_type::ALIGNMENT::CHAOTIC)) == vals.end()) { return false; } } else if(tod.lawful_bonus>0) { - if(std::find(vals.begin(),vals.end(),lexical_cast(unit_type::ALIGNMENT::LAWFUL)) == vals.end()) { + if(std::find(vals.begin(),vals.end(),std::to_string(unit_type::ALIGNMENT::LAWFUL)) == vals.end()) { return false; } - } else if(std::find(vals.begin(),vals.end(),lexical_cast(unit_type::ALIGNMENT::NEUTRAL)) == vals.end()) { + } else if(std::find(vals.begin(),vals.end(),std::to_string(unit_type::ALIGNMENT::NEUTRAL)) == vals.end()) { return false; } } diff --git a/src/terrain/translation.cpp b/src/terrain/translation.cpp index c281e36a3139..56215386bc67 100644 --- a/src/terrain/translation.cpp +++ b/src/terrain/translation.cpp @@ -783,7 +783,7 @@ static std::string number_to_string_(t_terrain terrain, const int start_position // Insert the start position if(start_position > 0) { - result = str_cast(start_position) + " "; + result = std::to_string(start_position) + " "; } /* diff --git a/src/tests/test_lexical_cast.cpp b/src/tests/test_lexical_cast.cpp index 0bd367ec1c7e..d9d64d49bbfb 100644 --- a/src/tests/test_lexical_cast.cpp +++ b/src/tests/test_lexical_cast.cpp @@ -87,7 +87,7 @@ bool validate(const char* str) type_send val = initializer value; \ \ BOOST_CHECK_EXCEPTION( \ - lexical_cast(val), const char*, validate); \ + std::to_string(val), const char*, validate); \ } BOOST_AUTO_TEST_CASE_TEMPLATE(test_lexical_cast_throw, T, test_types) @@ -200,14 +200,14 @@ BOOST_AUTO_TEST_CASE(test_lexical_cast_unsigned_long_long) BOOST_AUTO_TEST_CASE(test_lexical_cast_result) { - BOOST_CHECK_EQUAL(lexical_cast(true), "1"); - BOOST_CHECK_EQUAL(lexical_cast(false), "0"); + BOOST_CHECK_EQUAL(std::to_string(true), "1"); + BOOST_CHECK_EQUAL(std::to_string(false), "0"); - BOOST_CHECK_EQUAL(lexical_cast(1), "1"); - BOOST_CHECK_EQUAL(lexical_cast(1u), "1"); + BOOST_CHECK_EQUAL(std::to_string(1), "1"); + BOOST_CHECK_EQUAL(std::to_string(1u), "1"); - BOOST_CHECK_EQUAL(lexical_cast(1.2f), "1.2"); - BOOST_CHECK_EQUAL(lexical_cast(1.2), "1.2"); + BOOST_CHECK_EQUAL(std::to_string(1.2f), "1.2"); + BOOST_CHECK_EQUAL(std::to_string(1.2), "1.2"); BOOST_CHECK_EQUAL(lexical_cast("1"), 1); BOOST_CHECK_EQUAL(lexical_cast("-1"), -1); diff --git a/src/tests/test_make_enum.cpp b/src/tests/test_make_enum.cpp index 46627d5cd175..2a29a8d8d662 100644 --- a/src/tests/test_make_enum.cpp +++ b/src/tests/test_make_enum.cpp @@ -36,7 +36,7 @@ namespace foo { enum enumname {con1, con2 ,con3} } -foo::enumname lexical_cast ( std::string str ) throws bad_lexical_cast +foo::enumname std::to_string ( std::string str ) throws bad_lexical_cast { ... } @@ -66,7 +66,7 @@ BOOST_AUTO_TEST_CASE ( test_make_enum_namespace ) BOOST_CHECK_EQUAL ( str, "name1" ); - std::string str2 = lexical_cast (e); //returns "name2" since e is con2 + std::string str2 = std::to_string (e); //returns "name2" since e is con2 BOOST_CHECK_EQUAL ( str2, "name2" ); @@ -107,7 +107,7 @@ BOOST_AUTO_TEST_CASE ( test_make_enum_class ) BOOST_CHECK_EQUAL ( str, "name1" ); - std::string str2 = lexical_cast (e); //returns "name2" since e is val2 + std::string str2 = std::to_string (e); //returns "name2" since e is val2 BOOST_CHECK_EQUAL ( str2, "name2" ); diff --git a/src/tests/test_mp_connect.cpp b/src/tests/test_mp_connect.cpp index 96f8bb7fa6c1..c0fadef1c0b6 100644 --- a/src/tests/test_mp_connect.cpp +++ b/src/tests/test_mp_connect.cpp @@ -82,7 +82,7 @@ struct mp_connect_fixture { state->mp_settings().saved_game = false; state->set_scenario(config_manager-> - game_config().find_child(lexical_cast(game_classification::CAMPAIGN_TYPE::MULTIPLAYER), "id", state->mp_settings().name)); + game_config().find_child(std::to_string(game_classification::CAMPAIGN_TYPE::MULTIPLAYER), "id", state->mp_settings().name)); state->mp_settings().num_turns = state->get_starting_pos()["turns"]; diff --git a/src/tools/sdl2/window.cpp b/src/tools/sdl2/window.cpp index 7acdd34c843c..c50ffbf266e8 100644 --- a/src/tools/sdl2/window.cpp +++ b/src/tools/sdl2/window.cpp @@ -53,7 +53,7 @@ static void create(std::string& command, std::string::const_iterator begin) utf8::insert(command, utf8::size(command), " -> OK ID " - + boost::lexical_cast(windows.size() - 1)); + + std::to_string(windows.size() - 1)); } static void modify(std::string& command, std::string::const_iterator begin) diff --git a/src/units/animation.cpp b/src/units/animation.cpp index 74f182143589..aa41f947c618 100644 --- a/src/units/animation.cpp +++ b/src/units/animation.cpp @@ -533,7 +533,7 @@ void unit_animation::fill_initial_animations( std::vector & anim animations.push_back(*itor); animations.back().event_ = utils::split("movement"); - animations.back().unit_anim_.override(0,200,particule::NO_CYCLE,"","",0,"0~1:200",lexical_cast(display::LAYER_UNIT_MOVE_DEFAULT-display::LAYER_UNIT_FIRST)); + animations.back().unit_anim_.override(0,200,particule::NO_CYCLE,"","",0,"0~1:200",std::to_string(display::LAYER_UNIT_MOVE_DEFAULT-display::LAYER_UNIT_FIRST)); animations.push_back(*itor); animations.back().event_ = utils::split("defend"); @@ -546,7 +546,7 @@ void unit_animation::fill_initial_animations( std::vector & anim animations.push_back(*itor); animations.back().event_ = utils::split("attack"); - animations.back().unit_anim_.override(-150,300,particule::NO_CYCLE,"","",0,"0~0.6:150,0.6~0:150",lexical_cast(display::LAYER_UNIT_MOVE_DEFAULT-display::LAYER_UNIT_FIRST)); + animations.back().unit_anim_.override(-150,300,particule::NO_CYCLE,"","",0,"0~0.6:150,0.6~0:150",std::to_string(display::LAYER_UNIT_MOVE_DEFAULT-display::LAYER_UNIT_FIRST)); animations.back().primary_attack_filter_.push_back(config()); animations.back().primary_attack_filter_.back()["range"] = "melee"; diff --git a/src/units/filter.cpp b/src/units/filter.cpp index a60cd76a0c73..1eb4e98a3db8 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -375,7 +375,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l if (!vcfg["side"].empty() && vcfg["side"].to_int(-999) != u.side()) { std::vector sides = utils::split(vcfg["side"]); - const std::string u_side = str_cast(u.side()); + const std::string u_side = std::to_string(u.side()); if (std::find(sides.begin(), sides.end(), u_side) == sides.end()) { return false; } diff --git a/src/units/frame.cpp b/src/units/frame.cpp index 7a128fbac3a4..1534cd92e12f 100644 --- a/src/units/frame.cpp +++ b/src/units/frame.cpp @@ -270,7 +270,7 @@ frame_builder::frame_builder() : auto_vflip_(t_unset), auto_hflip_(t_unset), primary_frame_(t_unset), - drawing_layer_(str_cast(display::LAYER_UNIT_DEFAULT - display::LAYER_UNIT_FIRST)) + drawing_layer_(std::to_string(display::LAYER_UNIT_DEFAULT - display::LAYER_UNIT_FIRST)) {} frame_builder::frame_builder(const config& cfg,const std::string& frame_string) : @@ -603,11 +603,11 @@ std::vector frame_parsed_parameters::debug_strings() const { if (!sound_.empty()) v.push_back("sound="+sound_); if (!text_.empty()) { v.push_back("text="+text_); - v.push_back("text_color="+str_cast(text_color_)); + v.push_back("text_color="+std::to_string(text_color_)); } if (!blend_ratio_.get_original().empty()) { v.push_back("blend_ratio="+blend_ratio_.get_original()); - v.push_back("blend_with="+str_cast(blend_with_)); + v.push_back("blend_with="+std::to_string(blend_with_)); } if (!highlight_ratio_.get_original().empty()) v.push_back("highlight_ratio="+highlight_ratio_.get_original()); if (!offset_.get_original().empty()) v.push_back("offset="+offset_.get_original()); diff --git a/src/units/types.cpp b/src/units/types.cpp index 7f5bf407e649..d60b1e54bd73 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -836,9 +836,9 @@ std::string unit_type::alignment_description(ALIGNMENT align, unit_race::GENDER std::string str = std::string(); if (gender == unit_race::FEMALE) { ALIGNMENT_FEMALE_VARIATION fem = align.cast(); - str = lexical_cast(fem); + str = ALIGNMENT_FEMALE_VARIATION::enum_to_string(fem); } else { - str = lexical_cast(align); + str = ALIGNMENT::enum_to_string(align); } return translation::sgettext(str.c_str()); } @@ -1307,7 +1307,7 @@ void adjust_profile(std::string& profile) } return; - } + } // else, check for the file with /transparent appended... offset != std::string::npos ? diff --git a/src/units/unit.cpp b/src/units/unit.cpp index b0a2cb3f87a4..303d57fe9c6b 100644 --- a/src/units/unit.cpp +++ b/src/units/unit.cpp @@ -1465,7 +1465,7 @@ void unit::write(config& cfg) const cfg["alignment"] = alignment_.to_string(); cfg["flag_rgb"] = flag_rgb_; cfg["unrenamable"] = unrenamable_; - cfg["alpha"] = str_cast(alpha_); + cfg["alpha"] = std::to_string(alpha_); cfg["attacks_left"] = attacks_left_; cfg["max_attacks"] = max_attacks_; diff --git a/src/util.hpp b/src/util.hpp index a2249ce76bb9..e151aa167910 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -171,12 +171,6 @@ float lexical_cast_default(const std::string& a, floa template<> float lexical_cast_default(const char* a, float def); -template -std::string str_cast(From a) -{ - return lexical_cast(a); -} - template To lexical_cast_in_range(From a, To def, To min, To max) { diff --git a/src/whiteboard/manager.cpp b/src/whiteboard/manager.cpp index 9e0bf47ed107..4cd8e9de503b 100644 --- a/src/whiteboard/manager.cpp +++ b/src/whiteboard/manager.cpp @@ -452,7 +452,7 @@ static void draw_numbers(map_location const& hex, side_actions::numbers_t number { int number = numbers_to_draw[i]; - std::string number_text = boost::lexical_cast(number); + std::string number_text = std::to_string(number); size_t font_size; if (int(i) == main_number) font_size = 19; else if (secondary_numbers.find(i)!=secondary_numbers.end()) font_size = 17; diff --git a/src/widgets/progressbar.cpp b/src/widgets/progressbar.cpp index 762b65677652..626bb250a80a 100644 --- a/src/widgets/progressbar.cpp +++ b/src/widgets/progressbar.cpp @@ -71,8 +71,8 @@ void progress_bar::draw_contents() //remove 50% of color to simulate a shadow effect sdl::fill_rect(surf,&lightning,SDL_MapRGB(surf->format,fcr/2,fcg/2,fcb/2)); - const std::string text = text_.empty() ? str_cast(progress_) + "%" : - text_ + " (" + str_cast(progress_) + "%)"; + const std::string text = text_.empty() ? std::to_string(progress_) + "%" : + text_ + " (" + std::to_string(progress_) + "%)"; SDL_Rect text_area = font::text_area(text,font::SIZE_NORMAL); text_area.x = area.x + area.w/2 - text_area.w/2; From 5afdb0f72a2a743b2ca99b53c228fdd77568748c Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 11:33:08 +1100 Subject: [PATCH 069/240] tloadscreen: better calculations for positioning spacers This allows the loadscreen to look good on both small and large resolutions --- data/gui/window/loadscreen.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index b1fb2ec4fead..e0a1f0009161 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -43,9 +43,9 @@ [row] [column] - + [spacer] - height = "((screen_height - 400) / 4)" + height = "((screen_height - if(screen_height < 800, 400, 0)) / 4)" [/spacer] [/column] From 7f1dd72c9321d21ade727d491e790799f7c27998 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 11:33:44 +1100 Subject: [PATCH 070/240] tloadscreen: fixed another case of conflicting layout keys --- data/gui/window/loadscreen.cfg | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index e0a1f0009161..3722ac7741c4 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -100,9 +100,8 @@ grow_factor = 1 border = "all" border_size = 5 - horizontal_alignment = "center" - vertical_alignment = "center" horizontal_grow = "true" + vertical_alignment = "center" [label] text_alignment = "center" From cf6fa69d27249640d27cac3fdeb99afcbb47e7a8 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 12:05:47 +1100 Subject: [PATCH 071/240] Removed C++11 include guards This also expands the OVERRIDE compatibility macro (FINAL was not used). --- src/config.cpp | 2 - src/config.hpp | 17 ----- src/fake_unit_ptr.hpp | 16 +---- src/global.hpp | 24 ------- src/gui/auxiliary/filter.hpp | 13 ---- src/gui/widgets/button.hpp | 8 +-- src/gui/widgets/combobox.hpp | 14 ++-- src/gui/widgets/container.hpp | 42 +++++------ src/gui/widgets/control.hpp | 26 +++---- src/gui/widgets/drawing.hpp | 12 ++-- src/gui/widgets/generator.hpp | 22 +++--- src/gui/widgets/generator_private.hpp | 90 ++++++++++++------------ src/gui/widgets/grid.hpp | 42 +++++------ src/gui/widgets/group.hpp | 8 --- src/gui/widgets/horizontal_scrollbar.hpp | 2 +- src/gui/widgets/image.hpp | 14 ++-- src/gui/widgets/label.hpp | 20 +++--- src/gui/widgets/list.hpp | 10 +-- src/gui/widgets/listbox.hpp | 10 +-- src/gui/widgets/matrix.hpp | 34 ++++----- src/gui/widgets/minimap.hpp | 12 ++-- src/gui/widgets/multi_page.hpp | 10 +-- src/gui/widgets/pane.hpp | 20 +++--- src/gui/widgets/panel.hpp | 16 ++--- src/gui/widgets/password_box.hpp | 2 +- src/gui/widgets/progress_bar.hpp | 10 +-- src/gui/widgets/repeating_button.hpp | 8 +-- src/gui/widgets/scroll_label.hpp | 12 ++-- src/gui/widgets/scrollbar.hpp | 10 +-- src/gui/widgets/scrollbar_container.hpp | 38 +++++----- src/gui/widgets/scrollbar_panel.hpp | 8 +-- src/gui/widgets/slider.hpp | 6 +- src/gui/widgets/spacer.hpp | 14 ++-- src/gui/widgets/stacked_widget.hpp | 10 +-- src/gui/widgets/text.hpp | 6 +- src/gui/widgets/text_box.hpp | 6 +- src/gui/widgets/toggle_button.hpp | 12 ++-- src/gui/widgets/toggle_panel.hpp | 24 +++---- src/gui/widgets/tree_view.hpp | 8 +-- src/gui/widgets/tree_view_node.hpp | 24 +++---- src/gui/widgets/unit_preview_pane.hpp | 10 +-- src/gui/widgets/vertical_scrollbar.hpp | 2 +- src/gui/widgets/viewport.hpp | 24 +++---- src/gui/widgets/widget.hpp | 4 +- src/gui/widgets/window.hpp | 10 +-- src/help/help_button.hpp | 2 +- src/hotkey/hotkey_handler.hpp | 2 +- src/hotkey/hotkey_handler_sp.hpp | 20 +++--- src/play_controller.hpp | 2 +- src/replay_controller.hpp | 2 +- src/scripting/game_lua_kernel.cpp | 2 +- src/synced_checkup.cpp | 6 +- src/variable.hpp | 5 -- 53 files changed, 345 insertions(+), 428 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index 24410966cfd0..9f346bf75b64 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -464,7 +464,6 @@ config& config::operator=(const config& cfg) return *this; } -#ifdef HAVE_CXX11 config::config(config &&cfg): values(std::move(cfg.values)), children(std::move(cfg.children)), @@ -478,7 +477,6 @@ config &config::operator=(config &&cfg) swap(cfg); return *this; } -#endif bool config::valid_id(const std::string& id) { diff --git a/src/config.hpp b/src/config.hpp index 6e819bf55209..7f214d3749d6 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -75,16 +75,6 @@ class config */ void check_valid(const config &cfg) const; -#ifndef HAVE_CXX11 - struct safe_bool_impl { void nonnull() {} }; - /** - * Used as the return type of the conversion operator for boolean contexts. - * Needed, since the compiler would otherwise consider the following - * conversion (C legacy): cfg["abc"] -> "abc"[bool(cfg)] -> 'b' - */ - typedef void (safe_bool_impl::*safe_bool)(); -#endif - public: // Create an empty node. config(); @@ -92,10 +82,8 @@ class config config(const config &); config &operator=(const config &); -#ifdef HAVE_CXX11 config(config &&); config &operator=(config &&); -#endif /** * Creates a config object with an empty child of name @a child. @@ -107,13 +95,8 @@ class config // Verifies that the string can be used as an attribute or tag name static bool valid_id(const std::string& id); -#ifdef HAVE_CXX11 explicit operator bool() const { return this != &invalid; } -#else - operator safe_bool() const - { return this != &invalid ? &safe_bool_impl::nonnull : NULL; } -#endif typedef std::vector child_list; typedef std::map child_map; diff --git a/src/fake_unit_ptr.hpp b/src/fake_unit_ptr.hpp index eecefbd680d3..0cb19e7cd378 100644 --- a/src/fake_unit_ptr.hpp +++ b/src/fake_unit_ptr.hpp @@ -67,24 +67,10 @@ private : internal_ptr unit_; //!< Internal unit pointer. fake_unit_manager * my_manager_; //!< Raw pointer to the manager. -#ifndef HAVE_CXX11 - struct safe_bool_impl { void nonnull() {} }; - /** - * Used as t he return type of the conversion operator for boolean contexts. - * Needed, since the compiler would otherwise consider the following - * conversion (C legacy): cfg["abc"] -> "abc"[bool(cfg)] -> 'b' - */ - typedef void (safe_bool_impl::*safe_bool)(); -#endif - public: -#ifdef HAVE_CXX11 + explicit operator bool() const { return unit_.get(); } -#else - operator safe_bool() const - { return unit_ ? &safe_bool_impl::nonnull : NULL; } -#endif }; #endif diff --git a/src/global.hpp b/src/global.hpp index 88960e89b2ae..83d5678971e9 100644 --- a/src/global.hpp +++ b/src/global.hpp @@ -43,30 +43,6 @@ #endif //_MSC_VER -/** - * Enable C++11 support in some parts of the code. - * - * These parts \em must also work without C++11, since Wesnoth still uses C++98 - * as the official C++ version. - * - * @note Older versions of GCC don't define the proper version for - * @c __cplusplus, but have their own test macro. That test is omitted since - * the amount of support for these compilers depends a lot on the exact - * compiler version. If you want to enable it for these compilers simply define - * the macro manually. - */ -#if (__cplusplus >= 201103L) -#define HAVE_CXX11 -#endif - -#ifdef HAVE_CXX11 -#define FINAL final -#define OVERRIDE override -#else -#define FINAL -#define OVERRIDE -#endif - #ifdef NDEBUG /* * Wesnoth uses asserts to avoid undefined behaviour. For example, to make sure diff --git a/src/gui/auxiliary/filter.hpp b/src/gui/auxiliary/filter.hpp index bff261cd9977..121fd26d443f 100644 --- a/src/gui/auxiliary/filter.hpp +++ b/src/gui/auxiliary/filter.hpp @@ -38,7 +38,6 @@ inline bool sort(const tpane::titem& lhs, const std::string& tag, const bool ascending) { -#ifdef HAVE_CXX11 if(ascending) { return lexical_cast(lhs.tags.at(tag)) < lexical_cast(rhs.tags.at(tag)); @@ -46,18 +45,6 @@ inline bool sort(const tpane::titem& lhs, return lexical_cast(lhs.tags.at(tag)) > lexical_cast(rhs.tags.at(tag)); } -#else - typedef std::map::const_iterator iterator; - iterator lhs_it = lhs.tags.find(tag), rhs_it = rhs.tags.find(tag); - if(lhs_it == lhs.tags.end() || rhs_it == rhs.tags.end()) { - throw std::out_of_range("Key »" + tag + "« doesn't exist."); - } - if(ascending) { - return lexical_cast(*lhs_it) < lexical_cast(*rhs_it); - } else { - return lexical_cast(*lhs_it) > lexical_cast(*rhs_it); - } -#endif } /** diff --git a/src/gui/widgets/button.hpp b/src/gui/widgets/button.hpp index 71bc06a84a40..d05276267b51 100644 --- a/src/gui/widgets/button.hpp +++ b/src/gui/widgets/button.hpp @@ -37,13 +37,13 @@ class tbutton : public tcontrol, public tclickable_ /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** Inherited from tclickable. */ void connect_click_handler(const event::tsignal_function& signal) @@ -96,7 +96,7 @@ class tbutton : public tcontrol, public tclickable_ int retval_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/combobox.hpp b/src/gui/widgets/combobox.hpp index 59eee15c7767..8dd55d164acc 100644 --- a/src/gui/widgets/combobox.hpp +++ b/src/gui/widgets/combobox.hpp @@ -36,13 +36,13 @@ class tcombobox : public tcontrol, public tselectable_ /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** Inherited from tclickable. */ void connect_click_handler(const event::tsignal_function& signal) @@ -69,13 +69,13 @@ class tcombobox : public tcontrol, public tselectable_ boost::function callback_state_change_; /** Inherited from tselectable_ */ - virtual unsigned get_value() const OVERRIDE { return selected_; } + virtual unsigned get_value() const override { return selected_; } /** Inherited from tselectable_ */ - virtual void set_value(const unsigned value ) OVERRIDE { set_selected(value); } + virtual void set_value(const unsigned value ) override { set_selected(value); } /** Inherited from tselectable_ */ - virtual unsigned num_states() const OVERRIDE { return values_.size(); } + virtual unsigned num_states() const override { return values_.size(); } /** Inherited from tselectable_ */ virtual void set_callback_state_change(boost::function callback) @@ -126,7 +126,7 @@ class tcombobox : public tcontrol, public tselectable_ boost::function selected_callback_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/container.hpp b/src/gui/widgets/container.hpp index f8fa9ef97367..41a069a1914a 100644 --- a/src/gui/widgets/container.hpp +++ b/src/gui/widgets/container.hpp @@ -53,7 +53,7 @@ class tcontainer_ : public tcontrol /***** ***** ***** ***** layout functions ***** ***** ***** *****/ /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** * Tries to reduce the width of a container. @@ -65,10 +65,10 @@ class tcontainer_ : public tcontrol void reduce_width(const unsigned maximum_width); /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** See @ref twidget::demand_reduce_width. */ - virtual void demand_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void demand_reduce_width(const unsigned maximum_width) override; /** * Tries to reduce the height of a container. @@ -80,75 +80,75 @@ class tcontainer_ : public tcontrol void reduce_height(const unsigned maximum_height); /** See @ref twidget::request_reduce_height. */ - virtual void request_reduce_height(const unsigned maximum_height) OVERRIDE; + virtual void request_reduce_height(const unsigned maximum_height) override; /** See @ref twidget::demand_reduce_height. */ - virtual void demand_reduce_height(const unsigned maximum_height) OVERRIDE; + virtual void demand_reduce_height(const unsigned maximum_height) override; private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::can_wrap. */ - virtual bool can_wrap() const OVERRIDE; + virtual bool can_wrap() const override; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref twidget::has_widget. */ - virtual bool has_widget(const twidget& widget) const OVERRIDE; + virtual bool has_widget(const twidget& widget) const override; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** See @ref twidget::set_visible_rectangle. */ - virtual void set_visible_rectangle(const SDL_Rect& rectangle) OVERRIDE; + virtual void set_visible_rectangle(const SDL_Rect& rectangle) override; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; protected: /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; public: /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /** * See @ref twidget::create_walker. * * @todo Implement properly. */ - virtual iterator::twalker_* create_walker() OVERRIDE + virtual iterator::twalker_* create_walker() override { return NULL; } diff --git a/src/gui/widgets/control.hpp b/src/gui/widgets/control.hpp index b7d4d7ed727c..76a5b9530fc8 100644 --- a/src/gui/widgets/control.hpp +++ b/src/gui/widgets/control.hpp @@ -97,10 +97,10 @@ class tcontrol : public twidget * The default behavior is that a widget blocks easy close, if not it * should override this function. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /** See @ref twidget::create_walker. */ - virtual iterator::twalker_* create_walker() OVERRIDE; + virtual iterator::twalker_* create_walker() override; /***** ***** ***** ***** layout functions ***** ***** ***** *****/ @@ -171,18 +171,18 @@ class tcontrol : public twidget * @todo Also handle the tooltip state. * Handle if shrunken_ && use_tooltip_on_label_overflow_. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; protected: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /***** ***** ***** ***** Inherited ***** ***** ***** *****/ @@ -211,18 +211,18 @@ class tcontrol : public twidget public: /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** * Sets the definition. @@ -432,12 +432,12 @@ class tcontrol : public twidget /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::impl_draw_foreground. */ virtual void impl_draw_foreground(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** Exposes font::ttext::get_token, for the text label of this control */ std::string get_label_token(const gui2::tpoint & position, const char * delimiters = " \n\r\t") const; @@ -521,7 +521,7 @@ struct tbuilder_control : public tbuilder_widget using tbuilder_widget::build; - virtual twidget* build(const treplacements& replacements) const OVERRIDE; + virtual twidget* build(const treplacements& replacements) const override; /** @deprecated The control can initialize itself. */ void init_control(tcontrol* control) const; diff --git a/src/gui/widgets/drawing.hpp b/src/gui/widgets/drawing.hpp index b607f0c46bbb..f39413463d9e 100644 --- a/src/gui/widgets/drawing.hpp +++ b/src/gui/widgets/drawing.hpp @@ -42,22 +42,22 @@ class tdrawing : public tcontrol private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -82,7 +82,7 @@ class tdrawing : public tcontrol tpoint best_size_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/generator.hpp b/src/gui/widgets/generator.hpp index 1bc06ce110c8..1710a8529a09 100644 --- a/src/gui/widgets/generator.hpp +++ b/src/gui/widgets/generator.hpp @@ -247,48 +247,48 @@ class tgenerator_ : public twidget */ /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE = 0; + virtual void layout_initialise(const bool full_initialisation) override = 0; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE + virtual void request_reduce_width(const unsigned maximum_width) override = 0; /** See @ref twidget::request_reduce_height. */ - virtual void request_reduce_height(const unsigned maximum_height) OVERRIDE + virtual void request_reduce_height(const unsigned maximum_height) override = 0; /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE = 0; + virtual tpoint calculate_best_size() const override = 0; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE = 0; + virtual void place(const tpoint& origin, const tpoint& size) override = 0; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE = 0; + virtual void set_origin(const tpoint& origin) override = 0; /** See @ref twidget::set_visible_rectangle. */ - virtual void set_visible_rectangle(const SDL_Rect& rectangle) OVERRIDE = 0; + virtual void set_visible_rectangle(const SDL_Rect& rectangle) override = 0; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE = 0; + int y_offset) override = 0; protected: /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE + const std::vector& call_stack) override = 0; public: /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE = 0; + const bool must_be_active) override = 0; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE + const bool must_be_active) const override = 0; /***** ***** ***** ***** keyboard functions ***** ***** ***** *****/ diff --git a/src/gui/widgets/generator_private.hpp b/src/gui/widgets/generator_private.hpp index 8a75314439b6..afed64a7c583 100644 --- a/src/gui/widgets/generator_private.hpp +++ b/src/gui/widgets/generator_private.hpp @@ -144,7 +144,7 @@ struct tone : public virtual tgenerator_ * * @param index The item to select. */ - void select_item(const unsigned index, const bool select) OVERRIDE + void select_item(const unsigned index, const bool select) override { assert(select); @@ -161,7 +161,7 @@ struct tone : public virtual tgenerator_ struct tinfinite : public virtual tgenerator_ { /** See tone::select_item(). */ - void select_item(const unsigned index, const bool select) OVERRIDE + void select_item(const unsigned index, const bool select) override { assert(select); @@ -195,26 +195,26 @@ struct thorizontal_list : public virtual tgenerator_ using tgenerator_::create_item; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned /*maximum_width*/) OVERRIDE + virtual void request_reduce_width(const unsigned /*maximum_width*/) override { /* DO NOTHING */ } /** See @ref twidget::request_reduce_height. */ virtual void request_reduce_height(const unsigned /*maximum_height*/) - OVERRIDE + override { /* DO NOTHING */ } /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** * Sets the visible rectangle of the generator. @@ -225,11 +225,11 @@ struct thorizontal_list : public virtual tgenerator_ /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /***** ***** ***** ***** keyboard functions ***** ***** ***** *****/ @@ -274,37 +274,37 @@ struct tvertical_list : public virtual tgenerator_ using tgenerator_::create_item; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned /*maximum_width*/) OVERRIDE + virtual void request_reduce_width(const unsigned /*maximum_width*/) override { /* DO NOTHING */ } /** See @ref twidget::request_reduce_height. */ virtual void request_reduce_height(const unsigned /*maximum_height*/) - OVERRIDE + override { /* DO NOTHING */ } /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** See @ref thorizontal_list::set_visible_rectangle(). */ void set_visible_rectangle(const SDL_Rect& rectangle); /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /***** ***** ***** ***** keyboard functions ***** ***** ***** *****/ @@ -360,20 +360,20 @@ struct tmatrix : public virtual tgenerator_ using tgenerator_::create_item; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned /*maximum_width*/) OVERRIDE + virtual void request_reduce_width(const unsigned /*maximum_width*/) override { /* DO NOTHING */ } /** See @ref twidget::request_reduce_height. */ virtual void request_reduce_height(const unsigned /*maximum_height*/) - OVERRIDE + override { /* DO NOTHING */ } /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE + virtual tpoint calculate_best_size() const override { ERROR_LOG(false); } @@ -381,13 +381,13 @@ struct tmatrix : public virtual tgenerator_ /** See @ref twidget::place. */ virtual void place(const tpoint& /*origin*/ , - const tpoint& /*size*/) OVERRIDE + const tpoint& /*size*/) override { ERROR_LOG(false); } /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& /*origin*/) OVERRIDE + virtual void set_origin(const tpoint& /*origin*/) override { ERROR_LOG(false); } @@ -401,7 +401,7 @@ struct tmatrix : public virtual tgenerator_ /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& /*coordinate*/ , - const bool /*must_be_active*/) OVERRIDE + const bool /*must_be_active*/) override { ERROR_LOG(false); } @@ -409,7 +409,7 @@ struct tmatrix : public virtual tgenerator_ /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& /*coordinate*/ , - const bool /*must_be_active*/) const OVERRIDE + const bool /*must_be_active*/) const override { ERROR_LOG(false); } @@ -460,37 +460,37 @@ struct tindependent : public virtual tgenerator_ using tgenerator_::create_item; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** See thorizontal_list::request_reduce_height. */ virtual void request_reduce_height(const unsigned maximum_height); /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** See @ref thorizontal_list::set_visible_rectangle(). */ void set_visible_rectangle(const SDL_Rect& rectangle); /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /***** ***** ***** ***** keyboard functions ***** ***** ***** *****/ @@ -818,7 +818,7 @@ class tgenerator : public minimum_selection, } /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE + virtual void layout_initialise(const bool full_initialisation) override { FOREACH(AUTO item, items_) { @@ -831,25 +831,25 @@ class tgenerator : public minimum_selection, } /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE + virtual void request_reduce_width(const unsigned maximum_width) override { placement::request_reduce_width(maximum_width); } /** See @ref twidget::request_reduce_height. */ - virtual void request_reduce_height(const unsigned maximum_height) OVERRIDE + virtual void request_reduce_height(const unsigned maximum_height) override { placement::request_reduce_height(maximum_height); } /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE + virtual tpoint calculate_best_size() const override { return placement::calculate_best_size(); } /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE + virtual void place(const tpoint& origin, const tpoint& size) override { // Inherited, so we get useful debug info. twidget::place(origin, size); @@ -858,7 +858,7 @@ class tgenerator : public minimum_selection, } /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE + virtual void set_origin(const tpoint& origin) override { // Inherited. twidget::set_origin(origin); @@ -867,7 +867,7 @@ class tgenerator : public minimum_selection, } /** See @ref twidget::set_visible_rectangle. */ - virtual void set_visible_rectangle(const SDL_Rect& rectangle) OVERRIDE + virtual void set_visible_rectangle(const SDL_Rect& rectangle) override { placement::set_visible_rectangle(rectangle); } @@ -875,7 +875,7 @@ class tgenerator : public minimum_selection, /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE + int y_offset) override { assert(this->get_visible() == twidget::tvisible::visible); calculate_order(); @@ -893,7 +893,7 @@ class tgenerator : public minimum_selection, /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE + const std::vector& call_stack) override { FOREACH(AUTO item, items_) { @@ -904,20 +904,20 @@ class tgenerator : public minimum_selection, /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE + const bool must_be_active) override { return placement::find_at(coordinate, must_be_active); } /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE + const bool must_be_active) const override { return placement::find_at(coordinate, must_be_active); } /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE + bool disable_click_dismiss() const override { FOREACH(AUTO item, items_) { @@ -933,7 +933,7 @@ class tgenerator : public minimum_selection, * * @todo Implement properly. */ - virtual iterator::twalker_* create_walker() OVERRIDE + virtual iterator::twalker_* create_walker() override { return NULL; } @@ -1031,7 +1031,7 @@ class tgenerator : public minimum_selection, torder_func order_func_; - virtual void set_order(const torder_func& order) OVERRIDE + virtual void set_order(const torder_func& order) override { order_func_ = order; order_dirty_ = true; diff --git a/src/gui/widgets/grid.hpp b/src/gui/widgets/grid.hpp index 622abee4a793..24b32d8070a5 100644 --- a/src/gui/widgets/grid.hpp +++ b/src/gui/widgets/grid.hpp @@ -184,11 +184,11 @@ class tgrid : public twidget return child(row, col).widget(); } - virtual bool can_mouse_focus() const OVERRIDE { return false; } + virtual bool can_mouse_focus() const override { return false; } /***** ***** ***** ***** layout functions ***** ***** ***** *****/ /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** * Tries to reduce the width of a container. @@ -200,10 +200,10 @@ class tgrid : public twidget void reduce_width(const unsigned maximum_width); /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** See @ref twidget::demand_reduce_width. */ - virtual void demand_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void demand_reduce_width(const unsigned maximum_width) override; /** * Tries to reduce the height of a container. @@ -215,10 +215,10 @@ class tgrid : public twidget void reduce_height(const unsigned maximum_height); /** See @ref twidget::request_reduce_height. */ - virtual void request_reduce_height(const unsigned maximum_height) OVERRIDE; + virtual void request_reduce_height(const unsigned maximum_height) override; /** See @ref twidget::demand_reduce_height. */ - virtual void demand_reduce_height(const unsigned maximum_height) OVERRIDE; + virtual void demand_reduce_height(const unsigned maximum_height) override; /** * Recalculates the best size. @@ -232,55 +232,55 @@ class tgrid : public twidget private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::can_wrap. */ - virtual bool can_wrap() const OVERRIDE; + virtual bool can_wrap() const override; public: /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** See @ref twidget::set_visible_rectangle. */ - virtual void set_visible_rectangle(const SDL_Rect& rectangle) OVERRIDE; + virtual void set_visible_rectangle(const SDL_Rect& rectangle) override; /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::has_widget. */ - virtual bool has_widget(const twidget& widget) const OVERRIDE; + virtual bool has_widget(const twidget& widget) const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /** See @ref twidget::create_walker. */ - virtual iterator::twalker_* create_walker() OVERRIDE; + virtual iterator::twalker_* create_walker() override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -489,7 +489,7 @@ class tgrid : public twidget /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; }; /** diff --git a/src/gui/widgets/group.hpp b/src/gui/widgets/group.hpp index ddde6a47e874..de4e370e23ff 100644 --- a/src/gui/widgets/group.hpp +++ b/src/gui/widgets/group.hpp @@ -53,16 +53,8 @@ class tgroup */ void remove_member(tselectable_* widget) { -#ifdef HAVE_CXX11 members_.erase(std::find_if(members_.begin(), members_.end(), [&widget](const group_type& member){ return member.first == widget; })); -#else - for(group_iterator iter = members_.end() - 1; iter >= members_.begin(); iter--) { - if(iter->first == widget) { - iter = members_.erase(iter); - } - } -#endif } /** diff --git a/src/gui/widgets/horizontal_scrollbar.hpp b/src/gui/widgets/horizontal_scrollbar.hpp index 0d64c249c476..6b4716a1d61c 100644 --- a/src/gui/widgets/horizontal_scrollbar.hpp +++ b/src/gui/widgets/horizontal_scrollbar.hpp @@ -69,7 +69,7 @@ class thorizontal_scrollbar : public tscrollbar_ } /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/image.hpp b/src/gui/widgets/image.hpp index efb2d7e6f61b..7dd94fdbaf69 100644 --- a/src/gui/widgets/image.hpp +++ b/src/gui/widgets/image.hpp @@ -59,28 +59,28 @@ class timage : public tcontrol return label(); } - virtual bool can_mouse_focus() const OVERRIDE { return false; } + virtual bool can_mouse_focus() const override { return false; } /***** ***** ***** ***** layout functions ***** ***** ***** *****/ private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; private: /** @@ -94,7 +94,7 @@ class timage : public tcontrol }; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/label.hpp b/src/gui/widgets/label.hpp index 7558ff1bccac..b45fad6313bd 100644 --- a/src/gui/widgets/label.hpp +++ b/src/gui/widgets/label.hpp @@ -32,28 +32,28 @@ class tlabel : public tcontrol tlabel(); /** See @ref twidget::can_wrap. */ - virtual bool can_wrap() const OVERRIDE; + virtual bool can_wrap() const override; /** See @ref tcontrol::get_characters_per_line. */ - virtual unsigned get_characters_per_line() const OVERRIDE; + virtual unsigned get_characters_per_line() const override; /** See @ref tcontrol::get_link_aware. */ - virtual bool get_link_aware() const OVERRIDE; + virtual bool get_link_aware() const override; /** See @ref tcontrol::get_link_aware. */ - virtual std::string get_link_color() const OVERRIDE; + virtual std::string get_link_color() const override; /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -68,7 +68,7 @@ class tlabel : public tcontrol void set_link_color(const std::string & color); - virtual bool can_mouse_focus() const OVERRIDE { return false; } + virtual bool can_mouse_focus() const override { return false; } private: /** * Possible states of the widget. @@ -113,7 +113,7 @@ class tlabel : public tcontrol std::string link_color_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** Inherited from tcontrol. */ void load_config_extra(); diff --git a/src/gui/widgets/list.hpp b/src/gui/widgets/list.hpp index c0e6817db171..7efa4bc10055 100644 --- a/src/gui/widgets/list.hpp +++ b/src/gui/widgets/list.hpp @@ -201,13 +201,13 @@ class tlist : public tcontainer_ void init(); /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; private: /** @@ -269,10 +269,10 @@ class tlist : public tcontainer_ virtual void set_content_size(const tpoint& origin, const tpoint& size); #endif /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/listbox.hpp b/src/gui/widgets/listbox.hpp index 92858ded5500..f3b8e58be313 100644 --- a/src/gui/widgets/listbox.hpp +++ b/src/gui/widgets/listbox.hpp @@ -183,7 +183,7 @@ class tlistbox : public tscrollbar_container void list_item_clicked(twidget& caller); /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; /** * Request to update the size of the content after changing the content. @@ -204,15 +204,15 @@ class tlistbox : public tscrollbar_container /***** ***** ***** ***** inherited ***** ***** ****** *****/ /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /***** ***** ***** setters / getters for members ***** ****** *****/ void @@ -346,7 +346,7 @@ class tlistbox : public tscrollbar_container virtual void set_content_size(const tpoint& origin, const tpoint& size); /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; void order_by_column(unsigned column, twidget& widget); }; diff --git a/src/gui/widgets/matrix.hpp b/src/gui/widgets/matrix.hpp index f18f303ea19b..9ad9b9e8530c 100644 --- a/src/gui/widgets/matrix.hpp +++ b/src/gui/widgets/matrix.hpp @@ -77,19 +77,19 @@ class tcontrol_NEW : public tcontrol, public STATE } /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE + virtual void set_active(const bool active) override { STATE::set_active(active); } /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE + virtual bool get_active() const override { return STATE::get_active(); } /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE + virtual unsigned get_state() const override { return STATE::get_state(); } @@ -117,41 +117,41 @@ class tmatrix : public tbase /***** ***** ***** ***** Inherited operations. ***** ***** ****** *****/ /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /***** ***** ***** ***** Forwarded to pane_. ***** ***** ****** *****/ /** @@ -182,14 +182,14 @@ class tmatrix : public tbase private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /** See @ref twidget::create_walker. */ - virtual iterator::twalker_* create_walker() OVERRIDE; + virtual iterator::twalker_* create_walker() override; /** * Returns a grid in the pane. @@ -227,7 +227,7 @@ class tmatrix : public tbase tpane* pane_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/minimap.hpp b/src/gui/widgets/minimap.hpp index 4bcef13f5336..8de2bc4b6469 100644 --- a/src/gui/widgets/minimap.hpp +++ b/src/gui/widgets/minimap.hpp @@ -43,16 +43,16 @@ class tminimap : public tcontrol /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -103,10 +103,10 @@ class tminimap : public tcontrol /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/multi_page.hpp b/src/gui/widgets/multi_page.hpp index 810a8d98b23e..676890d6a20b 100644 --- a/src/gui/widgets/multi_page.hpp +++ b/src/gui/widgets/multi_page.hpp @@ -127,10 +127,10 @@ class tmulti_page : public tcontainer_ /***** ***** ***** inherited ***** ****** *****/ /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -162,13 +162,13 @@ class tmulti_page : public tcontainer_ /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/pane.hpp b/src/gui/widgets/pane.hpp index 77beb0e60b79..b7495fbfae0b 100644 --- a/src/gui/widgets/pane.hpp +++ b/src/gui/widgets/pane.hpp @@ -71,31 +71,31 @@ class tpane : public twidget const std::map& tags); /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** * Sorts the contents of the pane. @@ -117,14 +117,14 @@ class tpane : public twidget private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /** See @ref twidget::create_walker. */ - virtual iterator::twalker_* create_walker() OVERRIDE; + virtual iterator::twalker_* create_walker() override; /** * Returns a grid in the pane. diff --git a/src/gui/widgets/panel.hpp b/src/gui/widgets/panel.hpp index 69fe145e334e..05387ecb459b 100644 --- a/src/gui/widgets/panel.hpp +++ b/src/gui/widgets/panel.hpp @@ -45,33 +45,33 @@ class tpanel : public tcontainer_ } /** See @ref tcontainer_::get_client_rect. */ - virtual SDL_Rect get_client_rect() const OVERRIDE; + virtual SDL_Rect get_client_rect() const override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; private: /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::impl_draw_foreground. */ virtual void impl_draw_foreground(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** See @ref tcontainer_::border_space. */ - virtual tpoint border_space() const OVERRIDE; + virtual tpoint border_space() const override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/password_box.hpp b/src/gui/widgets/password_box.hpp index 3fda9966820f..825f34d78f07 100644 --- a/src/gui/widgets/password_box.hpp +++ b/src/gui/widgets/password_box.hpp @@ -85,7 +85,7 @@ class tpassword_box : public ttext_box std::string real_value_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- BUILDER -----------{ diff --git a/src/gui/widgets/progress_bar.hpp b/src/gui/widgets/progress_bar.hpp index 145838a6fd50..a4e903c31db7 100644 --- a/src/gui/widgets/progress_bar.hpp +++ b/src/gui/widgets/progress_bar.hpp @@ -37,16 +37,16 @@ class tprogress_bar : public tcontrol /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -72,7 +72,7 @@ class tprogress_bar : public tcontrol unsigned percentage_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/repeating_button.hpp b/src/gui/widgets/repeating_button.hpp index 7b02b1ddfc1e..2fa0896f1fe8 100644 --- a/src/gui/widgets/repeating_button.hpp +++ b/src/gui/widgets/repeating_button.hpp @@ -54,13 +54,13 @@ class trepeating_button : public tcontrol, public tclickable_ /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** Inherited from tclickable. */ void connect_click_handler(const event::tsignal_function& signal) @@ -101,7 +101,7 @@ class trepeating_button : public tcontrol, public tclickable_ size_t repeat_timer_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/scroll_label.hpp b/src/gui/widgets/scroll_label.hpp index 781ea8c4fece..0344dbff3207 100644 --- a/src/gui/widgets/scroll_label.hpp +++ b/src/gui/widgets/scroll_label.hpp @@ -48,21 +48,21 @@ class tscroll_label : public tscrollbar_container tscroll_label(bool wrap); /** See @ref tcontrol::set_label. */ - virtual void set_label(const t_string& label) OVERRIDE; + virtual void set_label(const t_string& label) override; /** See @ref tcontrol::set_use_markup. */ - virtual void set_use_markup(bool use_markup) OVERRIDE; + virtual void set_use_markup(bool use_markup) override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; /***** ***** ***** setters / getters for members ***** ****** *****/ /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; bool can_wrap() const; void set_can_wrap(bool can_wrap); @@ -96,7 +96,7 @@ class tscroll_label : public tscrollbar_container /***** ***** ***** inherited ****** *****/ /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/scrollbar.hpp b/src/gui/widgets/scrollbar.hpp index a106db02abba..4983568254e9 100644 --- a/src/gui/widgets/scrollbar.hpp +++ b/src/gui/widgets/scrollbar.hpp @@ -98,18 +98,18 @@ class tscrollbar_ : public tcontrol /***** ***** ***** ***** layout functions ***** ***** ***** *****/ /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -169,7 +169,7 @@ class tscrollbar_ : public tcontrol * * After a recalculation the canvasses also need to be updated. */ - virtual void update_canvas() OVERRIDE; + virtual void update_canvas() override; /** * Callback for subclasses to get notified about positioner movement. diff --git a/src/gui/widgets/scrollbar_container.hpp b/src/gui/widgets/scrollbar_container.hpp index 3d0d676951c1..5a3dd5f43aec 100644 --- a/src/gui/widgets/scrollbar_container.hpp +++ b/src/gui/widgets/scrollbar_container.hpp @@ -88,60 +88,60 @@ class tscrollbar_container : public tcontainer_ /***** ***** ***** ***** layout functions ***** ***** ***** *****/ /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** See @ref twidget::request_reduce_height. */ - virtual void request_reduce_height(const unsigned maximum_height) OVERRIDE; + virtual void request_reduce_height(const unsigned maximum_height) override; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** * See @ref twidget::can_wrap. * * @note This function is called before the object is finalised. */ - virtual bool can_wrap() const OVERRIDE; + virtual bool can_wrap() const override; private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** See @ref twidget::set_visible_rectangle. */ - virtual void set_visible_rectangle(const SDL_Rect& rectangle) OVERRIDE; + virtual void set_visible_rectangle(const SDL_Rect& rectangle) override; /***** ***** ***** inherited ****** *****/ /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -493,17 +493,17 @@ class tscrollbar_container : public tcontainer_ } /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /** * Sets the size of the content grid. @@ -520,7 +520,7 @@ class tscrollbar_container : public tcontainer_ void scrollbar_moved(); /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/scrollbar_panel.hpp b/src/gui/widgets/scrollbar_panel.hpp index c2a5cdd25318..a4a91b3350bd 100644 --- a/src/gui/widgets/scrollbar_panel.hpp +++ b/src/gui/widgets/scrollbar_panel.hpp @@ -52,17 +52,17 @@ class tscrollbar_panel : public tscrollbar_container } /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; private: /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/slider.hpp b/src/gui/widgets/slider.hpp index e2f39e83fed0..636b82423417 100644 --- a/src/gui/widgets/slider.hpp +++ b/src/gui/widgets/slider.hpp @@ -36,7 +36,7 @@ class tslider : public tscrollbar_, public tinteger_selector_ private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /***** ***** ***** ***** Inherited ***** ***** ***** *****/ @@ -154,7 +154,7 @@ class tslider : public tscrollbar_, public tinteger_selector_ } /** See @ref tcontrol::update_canvas. */ - virtual void update_canvas() OVERRIDE; + virtual void update_canvas() override; /** * When the slider shows the minimum value can show a special text. @@ -177,7 +177,7 @@ class tslider : public tscrollbar_, public tinteger_selector_ tlabel_creator value_labels_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** * Handlers for keyboard input diff --git a/src/gui/widgets/spacer.hpp b/src/gui/widgets/spacer.hpp index 19a3bbfcb3c9..1dbe45a5ba2c 100644 --- a/src/gui/widgets/spacer.hpp +++ b/src/gui/widgets/spacer.hpp @@ -46,22 +46,22 @@ class tspacer : public tcontrol private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -77,10 +77,10 @@ class tspacer : public tcontrol /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/stacked_widget.hpp b/src/gui/widgets/stacked_widget.hpp index fe451d1c5b88..55c8f2e7cfb6 100644 --- a/src/gui/widgets/stacked_widget.hpp +++ b/src/gui/widgets/stacked_widget.hpp @@ -43,13 +43,13 @@ class tstacked_widget : public tcontainer_ /***** ***** ***** inherited ***** ****** *****/ /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /** * Gets the current visible layer number. @@ -104,10 +104,10 @@ class tstacked_widget : public tcontainer_ void select_layer_internal(const unsigned int layer, const bool select) const; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/text.hpp b/src/gui/widgets/text.hpp index 2ef2cbe5dee0..e28d4b6276cf 100644 --- a/src/gui/widgets/text.hpp +++ b/src/gui/widgets/text.hpp @@ -47,13 +47,13 @@ class ttext_ : public tcontrol ttext_(); /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /***** ***** ***** ***** expose some functions ***** ***** ***** *****/ diff --git a/src/gui/widgets/text_box.hpp b/src/gui/widgets/text_box.hpp index 3d38721fa2e8..dade3f1b1546 100644 --- a/src/gui/widgets/text_box.hpp +++ b/src/gui/widgets/text_box.hpp @@ -147,12 +147,12 @@ class ttext_box : public ttext_ /***** ***** ***** ***** layout functions ***** ***** ***** *****/ /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /***** ***** ***** ***** Inherited ***** ***** ***** *****/ /** See @ref tcontrol::update_canvas. */ - virtual void update_canvas() OVERRIDE; + virtual void update_canvas() override; /** Inherited from ttext_. */ void goto_end_of_line(const bool select = false) @@ -257,7 +257,7 @@ class ttext_box : public ttext_ void handle_key_clear_line(SDLMod modifier, bool& handled); /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** Inherited from tcontrol. */ void load_config_extra(); diff --git a/src/gui/widgets/toggle_button.hpp b/src/gui/widgets/toggle_button.hpp index cba0fa41e818..093afb75c3cc 100644 --- a/src/gui/widgets/toggle_button.hpp +++ b/src/gui/widgets/toggle_button.hpp @@ -40,24 +40,24 @@ class ttoggle_button : public tcontrol, public tselectable_ void set_members(const string_map& data); /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** Inherited from tcontrol. */ void update_canvas(); /** Inherited from tselectable_ */ - unsigned get_value() const OVERRIDE + unsigned get_value() const override { return state_num_; } /** Inherited from tselectable_ */ - unsigned num_states() const OVERRIDE; + unsigned num_states() const override; /** Inherited from tselectable_ */ void set_value(const unsigned selected); @@ -128,7 +128,7 @@ class ttoggle_button : public tcontrol, public tselectable_ std::string icon_name_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/toggle_panel.hpp b/src/gui/widgets/toggle_panel.hpp index 0f22c6259397..9ad9fb32f1e7 100644 --- a/src/gui/widgets/toggle_panel.hpp +++ b/src/gui/widgets/toggle_panel.hpp @@ -52,20 +52,20 @@ class ttoggle_panel : public tpanel, public tselectable_ /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; /** * See @ref tcontainer_::get_client_rect. @@ -74,7 +74,7 @@ class ttoggle_panel : public tpanel, public tselectable_ * tpanel_definition we need to override this function and do about the * same, look at a way to 'fix' that. */ - virtual SDL_Rect get_client_rect() const OVERRIDE; + virtual SDL_Rect get_client_rect() const override; /** * See @ref tcontainer_::border_space. @@ -83,10 +83,10 @@ class ttoggle_panel : public tpanel, public tselectable_ * tpanel_definition we need to override this function and do about the * same, look at a way to 'fix' that. */ - virtual tpoint border_space() const OVERRIDE; + virtual tpoint border_space() const override; /** Inherited from tselectable_ */ - unsigned get_value() const OVERRIDE + unsigned get_value() const override { return state_num_;; } @@ -95,7 +95,7 @@ class ttoggle_panel : public tpanel, public tselectable_ void set_value(const unsigned selected); /** Inherited from tselectable_ */ - unsigned num_states() const OVERRIDE; + unsigned num_states() const override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -161,15 +161,15 @@ class ttoggle_panel : public tpanel, public tselectable_ /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::impl_draw_foreground. */ virtual void impl_draw_foreground(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/tree_view.hpp b/src/gui/widgets/tree_view.hpp index 3c4a38d36e04..ede8eb8b606d 100644 --- a/src/gui/widgets/tree_view.hpp +++ b/src/gui/widgets/tree_view.hpp @@ -62,15 +62,15 @@ class ttree_view : public tscrollbar_container /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; bool empty() const; /** See @ref twidget::layout_children. */ - virtual void layout_children() OVERRIDE; + virtual void layout_children() override; /***** ***** ***** setters / getters for members ***** ****** *****/ @@ -153,7 +153,7 @@ class ttree_view : public tscrollbar_container virtual void finalize_setup(); /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/tree_view_node.hpp b/src/gui/widgets/tree_view_node.hpp index 6727be0c5b0c..2f7c6139ae98 100644 --- a/src/gui/widgets/tree_view_node.hpp +++ b/src/gui/widgets/tree_view_node.hpp @@ -135,25 +135,25 @@ class ttree_view_node : public twidget * * @todo Implement properly. */ - virtual iterator::twalker_* create_walker() OVERRIDE + virtual iterator::twalker_* create_walker() override { return NULL; } /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** * The "size" of the widget. @@ -226,7 +226,7 @@ class ttree_view_node : public twidget int calculate_ypos(); /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** * Our parent node. @@ -277,10 +277,10 @@ class ttree_view_node : public twidget const std::vector& call_stack); /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; tpoint calculate_best_size(const int indention_level, const unsigned indention_step_size) const; @@ -290,21 +290,21 @@ class ttree_view_node : public twidget tpoint get_unfolded_size() const; /** See @ref twidget::set_origin. */ - virtual void set_origin(const tpoint& origin) OVERRIDE; + virtual void set_origin(const tpoint& origin) override; /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; unsigned place(const unsigned indention_step_size, tpoint origin, unsigned width); /** See @ref twidget::set_visible_rectangle. */ - virtual void set_visible_rectangle(const SDL_Rect& rectangle) OVERRIDE; + virtual void set_visible_rectangle(const SDL_Rect& rectangle) override; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See tselectable_::set_callback_state_change. */ boost::function callback_state_change_; diff --git a/src/gui/widgets/unit_preview_pane.hpp b/src/gui/widgets/unit_preview_pane.hpp index 24db15c03f1a..db5d75461f08 100644 --- a/src/gui/widgets/unit_preview_pane.hpp +++ b/src/gui/widgets/unit_preview_pane.hpp @@ -66,13 +66,13 @@ class tunit_preview_pane : public tcontainer_ void profile_button_callback(); /** See @ref tcontrol::set_active. */ - virtual void set_active(const bool active) OVERRIDE; + virtual void set_active(const bool active) override; /** See @ref tcontrol::get_active. */ - virtual bool get_active() const OVERRIDE; + virtual bool get_active() const override; /** See @ref tcontrol::get_state. */ - virtual unsigned get_state() const OVERRIDE; + virtual unsigned get_state() const override; private: std::string current_type_; @@ -92,10 +92,10 @@ class tunit_preview_pane : public tcontainer_ }; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** See @ref tcontainer_::set_self_active. */ - virtual void set_self_active(const bool active) OVERRIDE; + virtual void set_self_active(const bool active) override; }; diff --git a/src/gui/widgets/vertical_scrollbar.hpp b/src/gui/widgets/vertical_scrollbar.hpp index 30bf912df748..fef0770869d4 100644 --- a/src/gui/widgets/vertical_scrollbar.hpp +++ b/src/gui/widgets/vertical_scrollbar.hpp @@ -66,7 +66,7 @@ class tvertical_scrollbar : public tscrollbar_ } /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; }; // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/viewport.hpp b/src/gui/widgets/viewport.hpp index 6b725cd8ff99..64a00750eb22 100644 --- a/src/gui/widgets/viewport.hpp +++ b/src/gui/widgets/viewport.hpp @@ -49,49 +49,49 @@ class tviewport : public twidget ~tviewport(); /** See @ref twidget::place. */ - virtual void place(const tpoint& origin, const tpoint& size) OVERRIDE; + virtual void place(const tpoint& origin, const tpoint& size) override; /** See @ref twidget::layout_initialise. */ - virtual void layout_initialise(const bool full_initialisation) OVERRIDE; + virtual void layout_initialise(const bool full_initialisation) override; /** See @ref twidget::impl_draw_children. */ virtual void impl_draw_children(surface& frame_buffer, int x_offset, - int y_offset) OVERRIDE; + int y_offset) override; /** See @ref twidget::child_populate_dirty_list. */ virtual void child_populate_dirty_list(twindow& caller, - const std::vector& call_stack) OVERRIDE; + const std::vector& call_stack) override; /** See @ref twidget::request_reduce_width. */ - virtual void request_reduce_width(const unsigned maximum_width) OVERRIDE; + virtual void request_reduce_width(const unsigned maximum_width) override; /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; private: /** See @ref twidget::calculate_best_size. */ - virtual tpoint calculate_best_size() const OVERRIDE; + virtual tpoint calculate_best_size() const override; public: /** See @ref twidget::disable_click_dismiss. */ - bool disable_click_dismiss() const OVERRIDE; + bool disable_click_dismiss() const override; /** See @ref twidget::create_walker. */ - virtual iterator::twalker_* create_walker() OVERRIDE; + virtual iterator::twalker_* create_walker() override; private: twidget& widget_; diff --git a/src/gui/widgets/widget.hpp b/src/gui/widgets/widget.hpp index 7c1801078551..274286d96133 100644 --- a/src/gui/widgets/widget.hpp +++ b/src/gui/widgets/widget.hpp @@ -158,7 +158,7 @@ class twidget : private boost::noncopyable, */ explicit twidget(const tbuilder_widget& builder); - virtual ~twidget() OVERRIDE; + virtual ~twidget() override; /***** ***** ***** ***** ID functions. ***** ***** ***** *****/ @@ -801,7 +801,7 @@ class twidget : private boost::noncopyable, private: /** See @ref event::tdispatcher::is_at. */ - virtual bool is_at(const tpoint& coordinate) const OVERRIDE; + virtual bool is_at(const tpoint& coordinate) const override; /** * Is the coordinate inside our area. diff --git a/src/gui/widgets/window.hpp b/src/gui/widgets/window.hpp index 6700d0379145..f47baf942858 100644 --- a/src/gui/widgets/window.hpp +++ b/src/gui/widgets/window.hpp @@ -281,11 +281,11 @@ class twindow : public tpanel, public cursor::setter /** See @ref twidget::find_at. */ virtual twidget* find_at(const tpoint& coordinate, - const bool must_be_active) OVERRIDE; + const bool must_be_active) override; /** See @ref twidget::find_at. */ virtual const twidget* find_at(const tpoint& coordinate, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; /** Inherited from twidget. */ tdialog* dialog() @@ -294,11 +294,11 @@ class twindow : public tpanel, public cursor::setter } /** See @ref twidget::find. */ - twidget* find(const std::string& id, const bool must_be_active) OVERRIDE; + twidget* find(const std::string& id, const bool must_be_active) override; /** See @ref twidget::find. */ const twidget* find(const std::string& id, - const bool must_be_active) const OVERRIDE; + const bool must_be_active) const override; #if 0 /** @todo Implement these functions. */ @@ -669,7 +669,7 @@ class twindow : public tpanel, public cursor::setter Uint8 mouse_button_state_; /** See @ref tcontrol::get_control_type. */ - virtual const std::string& get_control_type() const OVERRIDE; + virtual const std::string& get_control_type() const override; /** * Inherited from tpanel. diff --git a/src/help/help_button.hpp b/src/help/help_button.hpp index 0692907fb5c7..9bd4c971894f 100644 --- a/src/help/help_button.hpp +++ b/src/help/help_button.hpp @@ -31,7 +31,7 @@ class help_button : public gui::dialog_button, public hotkey::command_executor { std::string topic() const { return topic_; } void join(); void leave(); - CVideo& get_video() OVERRIDE { return video_; } + CVideo& get_video() override { return video_; } private: void show_help(); bool can_execute_command(const hotkey::hotkey_command& command, int/*index*/ =-1) const; diff --git a/src/hotkey/hotkey_handler.hpp b/src/hotkey/hotkey_handler.hpp index 5e20a85b5414..2f6ffb114ccc 100644 --- a/src/hotkey/hotkey_handler.hpp +++ b/src/hotkey/hotkey_handler.hpp @@ -117,7 +117,7 @@ class play_controller::hotkey_handler : public hotkey::command_executor_default virtual void toggle_grid(); virtual void search(); virtual void toggle_accelerated_speed(); - virtual void replay_skip_animation() OVERRIDE + virtual void replay_skip_animation() override { return play_controller_.toggle_skipping_replay(); } virtual std::string get_action_image(hotkey::HOTKEY_COMMAND, int index) const; diff --git a/src/hotkey/hotkey_handler_sp.hpp b/src/hotkey/hotkey_handler_sp.hpp index 92e4c48a60a7..49f60ec8dbd9 100644 --- a/src/hotkey/hotkey_handler_sp.hpp +++ b/src/hotkey/hotkey_handler_sp.hpp @@ -77,25 +77,25 @@ class playsingle_controller::hotkey_handler : public play_controller::hotkey_han assert(playsingle_controller_.get_replay_controller()); return *playsingle_controller_.get_replay_controller(); } - virtual void stop_replay() OVERRIDE + virtual void stop_replay() override { return get_replay_controller().stop_replay(); } - virtual void play_replay() OVERRIDE + virtual void play_replay() override { return get_replay_controller().play_replay(); } - virtual void replay_next_turn() OVERRIDE + virtual void replay_next_turn() override { return get_replay_controller().replay_next_turn(); } - virtual void replay_next_side() OVERRIDE + virtual void replay_next_side() override { return get_replay_controller().replay_next_side(); } - virtual void replay_next_move() OVERRIDE + virtual void replay_next_move() override { return get_replay_controller().replay_next_move(); } - virtual void replay_show_everything() OVERRIDE + virtual void replay_show_everything() override { return get_replay_controller().replay_show_everything(); } - virtual void replay_show_each() OVERRIDE + virtual void replay_show_each() override { return get_replay_controller().replay_show_each(); } - virtual void replay_show_team1() OVERRIDE + virtual void replay_show_team1() override { return get_replay_controller().replay_show_team1(); } - virtual void reset_replay() OVERRIDE + virtual void reset_replay() override { return playsingle_controller_.reset_replay(); } - virtual void replay_exit() OVERRIDE; + virtual void replay_exit() override; virtual void load_autosave(const std::string& filename); virtual hotkey::ACTION_STATE get_action_state(hotkey::HOTKEY_COMMAND command, int index) const; }; diff --git a/src/play_controller.hpp b/src/play_controller.hpp index 1770bf255fd2..e76fbba2168a 100644 --- a/src/play_controller.hpp +++ b/src/play_controller.hpp @@ -214,7 +214,7 @@ class play_controller : public controller_base, public events::observer, public actions::undo_list& get_undo_stack() { return undo_stack(); } - bool is_browsing() const OVERRIDE; + bool is_browsing() const override; bool is_lingering() const { return linger_; } class hotkey_handler; diff --git a/src/replay_controller.hpp b/src/replay_controller.hpp index 27790a757fe9..4add7a3eb47a 100644 --- a/src/replay_controller.hpp +++ b/src/replay_controller.hpp @@ -62,7 +62,7 @@ class replay_controller : public events::observer void init(); void update_gui(); void rebuild_replay_theme(); - void handle_generic_event(const std::string& name) OVERRIDE; + void handle_generic_event(const std::string& name) override; void reset_replay_ui(); void update_replay_ui(); diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 607a8c2f3a5a..266ebde035fe 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -2974,7 +2974,7 @@ namespace return cfg; } - virtual std::string description() const OVERRIDE + virtual std::string description() const override { return desc; } diff --git a/src/synced_checkup.cpp b/src/synced_checkup.cpp index 3ca256df110d..5d6df496e2dd 100644 --- a/src/synced_checkup.cpp +++ b/src/synced_checkup.cpp @@ -91,15 +91,15 @@ namespace virtual ~checkup_choice() { } - virtual config random_choice(int /*side*/) const OVERRIDE + virtual config random_choice(int /*side*/) const override { throw "not implemented"; } - virtual bool is_visible() const OVERRIDE + virtual bool is_visible() const override { return false; } - virtual config query_user(int /*side*/) const OVERRIDE + virtual config query_user(int /*side*/) const override { return cfg_; } diff --git a/src/variable.hpp b/src/variable.hpp index 59bd867900e9..a2b1264a1df9 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -66,13 +66,8 @@ class vconfig static vconfig empty_vconfig(); // Valid to dereference. Contains nothing static vconfig unconstructed_vconfig(); // Must not be dereferenced -#ifdef HAVE_CXX11 /// A vconfig evaluates to true iff it can be dereferenced. explicit operator bool() const { return !null(); } -#else - /// A vconfig evaluates to true iff it can be dereferenced. - operator safe_bool() const { return !null() ? &safe_bool_impl::nonnull : NULL; } -#endif bool null() const { assert(cfg_); return cfg_ == &default_empty_config; } void make_safe() const; //!< instruct the vconfig to make a private copy of its underlying data. From 7a2955f053806e7dc77d453d439687cb609d5dde Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 12:14:30 +1100 Subject: [PATCH 072/240] Revert accidental conversion of lexical_cast test to to_string (from 876710af8c24) --- src/tests/test_lexical_cast.cpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/tests/test_lexical_cast.cpp b/src/tests/test_lexical_cast.cpp index d9d64d49bbfb..0bd367ec1c7e 100644 --- a/src/tests/test_lexical_cast.cpp +++ b/src/tests/test_lexical_cast.cpp @@ -87,7 +87,7 @@ bool validate(const char* str) type_send val = initializer value; \ \ BOOST_CHECK_EXCEPTION( \ - std::to_string(val), const char*, validate); \ + lexical_cast(val), const char*, validate); \ } BOOST_AUTO_TEST_CASE_TEMPLATE(test_lexical_cast_throw, T, test_types) @@ -200,14 +200,14 @@ BOOST_AUTO_TEST_CASE(test_lexical_cast_unsigned_long_long) BOOST_AUTO_TEST_CASE(test_lexical_cast_result) { - BOOST_CHECK_EQUAL(std::to_string(true), "1"); - BOOST_CHECK_EQUAL(std::to_string(false), "0"); + BOOST_CHECK_EQUAL(lexical_cast(true), "1"); + BOOST_CHECK_EQUAL(lexical_cast(false), "0"); - BOOST_CHECK_EQUAL(std::to_string(1), "1"); - BOOST_CHECK_EQUAL(std::to_string(1u), "1"); + BOOST_CHECK_EQUAL(lexical_cast(1), "1"); + BOOST_CHECK_EQUAL(lexical_cast(1u), "1"); - BOOST_CHECK_EQUAL(std::to_string(1.2f), "1.2"); - BOOST_CHECK_EQUAL(std::to_string(1.2), "1.2"); + BOOST_CHECK_EQUAL(lexical_cast(1.2f), "1.2"); + BOOST_CHECK_EQUAL(lexical_cast(1.2), "1.2"); BOOST_CHECK_EQUAL(lexical_cast("1"), 1); BOOST_CHECK_EQUAL(lexical_cast("-1"), -1); From 0acea0c5025c27e5b39a91d5dcb58b38070efc7d Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 13:18:16 +1100 Subject: [PATCH 073/240] Revert accidental conversion of make_enum test to to_string (from 876710af8c24) --- src/tests/test_make_enum.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/tests/test_make_enum.cpp b/src/tests/test_make_enum.cpp index 2a29a8d8d662..46627d5cd175 100644 --- a/src/tests/test_make_enum.cpp +++ b/src/tests/test_make_enum.cpp @@ -36,7 +36,7 @@ namespace foo { enum enumname {con1, con2 ,con3} } -foo::enumname std::to_string ( std::string str ) throws bad_lexical_cast +foo::enumname lexical_cast ( std::string str ) throws bad_lexical_cast { ... } @@ -66,7 +66,7 @@ BOOST_AUTO_TEST_CASE ( test_make_enum_namespace ) BOOST_CHECK_EQUAL ( str, "name1" ); - std::string str2 = std::to_string (e); //returns "name2" since e is con2 + std::string str2 = lexical_cast (e); //returns "name2" since e is con2 BOOST_CHECK_EQUAL ( str2, "name2" ); @@ -107,7 +107,7 @@ BOOST_AUTO_TEST_CASE ( test_make_enum_class ) BOOST_CHECK_EQUAL ( str, "name1" ); - std::string str2 = std::to_string (e); //returns "name2" since e is val2 + std::string str2 = lexical_cast (e); //returns "name2" since e is val2 BOOST_CHECK_EQUAL ( str2, "name2" ); From 486cf469930c4742f40737c49ae1463876d4bd2b Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 22:41:40 -0400 Subject: [PATCH 074/240] scons: sort source file lists --- src/SConscript | 224 ++++++++++++++++++++++++------------------------- 1 file changed, 112 insertions(+), 112 deletions(-) diff --git a/src/SConscript b/src/SConscript index 301481c6458f..c4d977a51966 100644 --- a/src/SConscript +++ b/src/SConscript @@ -18,17 +18,12 @@ libwesnoth_core_sources = Split(""" config.cpp hash.cpp log.cpp - map/map.cpp map/location.cpp + map/map.cpp md5.cpp mt_rng.cpp - seed_rng.cpp network.cpp - terrain/type_data.cpp - thread.cpp - tstring.cpp - util.cpp - version.cpp + seed_rng.cpp serialization/binary_or_text.cpp serialization/parser.cpp serialization/preprocessor.cpp @@ -37,7 +32,12 @@ libwesnoth_core_sources = Split(""" serialization/tokenizer.cpp serialization/unicode.cpp serialization/validator.cpp + terrain/type_data.cpp + thread.cpp tools/schema/tag.cpp + tstring.cpp + util.cpp + version.cpp """) libwesnoth_core_sources.extend(env.Object("network_worker.cpp", EXTRA_DEFINE = env['raw_sockets'] and "NETWORK_USE_RAW_SOCKETS" or None)) @@ -90,30 +90,29 @@ libwesnoth_sources = Split(""" construct_dialog.cpp cursor.cpp desktop/clipboard.cpp - display.cpp display_context.cpp + display.cpp events.cpp floating_label.cpp font.cpp format_time_summary.cpp + game_end_exceptions.cpp + generators/cave_map_generator.cpp + generators/default_map_generator_job.cpp + generators/default_map_generator.cpp + generators/lua_map_generator.cpp + generators/map_create.cpp + generators/map_generator.cpp generic_event.cpp - hotkey/hotkey_item.cpp - hotkey/hotkey_command.cpp hotkey/command_executor.cpp + hotkey/hotkey_command.cpp + hotkey/hotkey_item.cpp hotkey/hotkey_manager.cpp - image.cpp image_modifications.cpp + image.cpp joystick.cpp - game_end_exceptions.cpp - generators/cave_map_generator.cpp - generators/map_create.cpp - generators/map_generator.cpp - generators/default_map_generator.cpp - generators/default_map_generator_job.cpp - generators/lua_map_generator.cpp key.cpp language.cpp - utils/make_enum.cpp map/label.cpp marked-up_text.cpp minimap.cpp @@ -124,22 +123,23 @@ libwesnoth_sources = Split(""" race.cpp reports.cpp show_dialog.cpp + sound_music_track.cpp sound.cpp soundsource.cpp - sound_music_track.cpp - terrain/terrain.cpp terrain/builder.cpp + terrain/terrain.cpp terrain/translation.cpp text.cpp + theme.cpp time_of_day.cpp tooltips.cpp + utils/make_enum.cpp video.cpp - theme.cpp widgets/button.cpp widgets/file_menu.cpp widgets/label.cpp - widgets/menu.cpp widgets/menu_style.cpp + widgets/menu.cpp widgets/multimenu.cpp widgets/progressbar.cpp widgets/scrollarea.cpp @@ -163,11 +163,11 @@ libcampaignd_sources = Split(""" libcampaignd = env.Library("campaignd", libcampaignd_sources, OBJPREFIX = "campaignd_") libwesnoth_sdl_sources = Split(""" - sdl/utils.cpp sdl/alpha.cpp sdl/exception.cpp - sdl/rect.cpp sdl/image.cpp + sdl/rect.cpp + sdl/utils.cpp sdl/window.cpp tracer.cpp xBRZ/xbrz.cpp @@ -192,19 +192,19 @@ wesnoth_sources = Split(""" actions/heal.cpp actions/move.cpp actions/shroud_clearing_action.cpp - actions/undo.cpp actions/undo_action.cpp actions/undo_dismiss_action.cpp actions/undo_move_action.cpp actions/undo_recall_action.cpp actions/undo_recruit_action.cpp actions/undo_update_shroud_action.cpp + actions/undo.cpp actions/unit_creator.cpp actions/vision.cpp addon/client.cpp addon/info.cpp - addon/manager.cpp addon/manager_ui.cpp + addon/manager.cpp addon/state.cpp addon/validation.cpp ai/actions.cpp @@ -220,8 +220,8 @@ wesnoth_sources = Split(""" ai/contexts.cpp ai/default/aspect_attacks.cpp ai/default/attack.cpp - ai/default/ca.cpp ai/default/ca_move_to_targets.cpp + ai/default/ca.cpp ai/default/contexts.cpp ai/default/engine_cpp.cpp ai/default/recruitment.cpp @@ -235,69 +235,64 @@ wesnoth_sources = Split(""" ai/formula/stage_unit_formulas.cpp ai/game_info.cpp ai/gamestate_observer.cpp + ai/lua/aspect_advancements.cpp ai/lua/core.cpp ai/lua/engine_lua.cpp ai/lua/lua_object.cpp - ai/lua/aspect_advancements.cpp ai/manager.cpp ai/registry.cpp ai/simulated_actions.cpp ai/testing.cpp animated_game.cpp - attack_prediction.cpp attack_prediction_display.cpp + attack_prediction.cpp build_info.cpp - commandline_options.cpp carryover.cpp + commandline_options.cpp config_cache.cpp - game_initialization/configure_engine.cpp - game_initialization/connect_engine.cpp controller_base.cpp countdown_clock.cpp - game_initialization/create_engine.cpp desktop/notifications.cpp desktop/open.cpp desktop/version.cpp - game_initialization/depcheck.cpp dialogs.cpp display_chat_manager.cpp - editor/action/action.cpp - editor/action/action_unit.cpp - editor/action/action_label.cpp - editor/action/action_village.cpp editor/action/action_item.cpp + editor/action/action_label.cpp editor/action/action_select.cpp - editor/action/mouse/mouse_action.cpp + editor/action/action_unit.cpp + editor/action/action_village.cpp + editor/action/action.cpp + editor/action/mouse/mouse_action_item.cpp editor/action/mouse/mouse_action_map_label.cpp + editor/action/mouse/mouse_action_select.cpp editor/action/mouse/mouse_action_unit.cpp editor/action/mouse/mouse_action_village.cpp - editor/action/mouse/mouse_action_item.cpp - editor/action/mouse/mouse_action_select.cpp + editor/action/mouse/mouse_action.cpp editor/controller/editor_controller.cpp + editor/editor_display.cpp + editor/editor_main.cpp + editor/editor_preferences.cpp + editor/map/context_manager.cpp editor/map/editor_map.cpp editor/map/map_context.cpp editor/map/map_fragment.cpp - editor/map/context_manager.cpp editor/palette/editor_palettes.cpp + editor/palette/item_palette.cpp + editor/palette/palette_manager.cpp editor/palette/terrain_palettes.cpp editor/palette/tristate_button.cpp editor/palette/unit_palette.cpp - editor/palette/item_palette.cpp - editor/palette/palette_manager.cpp - editor/editor_display.cpp - editor/editor_main.cpp - editor/editor_preferences.cpp editor/toolkit/brush.cpp editor/toolkit/editor_toolkit.cpp fake_unit_manager.cpp fake_unit_ptr.cpp filechooser.cpp - game_initialization/flg_manager.cpp floating_textbox.cpp formula/callable_objects.cpp - formula/formula.cpp - formula/debugger.cpp formula/debugger_fwd.cpp + formula/debugger.cpp + formula/formula.cpp formula/function.cpp formula/string_utils.cpp formula/tokenizer.cpp @@ -312,53 +307,71 @@ wesnoth_sources = Split(""" game_events/conditional_wml.cpp game_events/entity_location.cpp game_events/handlers.cpp - game_events/manager.cpp game_events/manager_impl.cpp + game_events/manager.cpp game_events/menu_item.cpp game_events/pump.cpp game_events/wmi_container.cpp + game_initialization/configure_engine.cpp + game_initialization/connect_engine.cpp + game_initialization/create_engine.cpp + game_initialization/depcheck.cpp + game_initialization/flg_manager.cpp + game_initialization/mp_game_utils.cpp + game_initialization/mp_options.cpp + game_initialization/multiplayer_configure.cpp + game_initialization/multiplayer_connect.cpp + game_initialization/multiplayer_create.cpp + game_initialization/multiplayer_lobby.cpp + game_initialization/multiplayer_ui.cpp + game_initialization/multiplayer_wait.cpp + game_initialization/multiplayer.cpp + game_initialization/playcampaign.cpp + game_initialization/singleplayer.cpp game_launcher.cpp game_preferences.cpp game_state.cpp + gui/auxiliary/iterator/iterator.cpp + gui/auxiliary/iterator/walker_grid.cpp + gui/auxiliary/iterator/walker_widget.cpp + gui/auxiliary/old_markup.cpp gui/core/canvas.cpp gui/core/event/dispatcher.cpp gui/core/event/distributor.cpp gui/core/event/handler.cpp - gui/auxiliary/iterator/iterator.cpp - gui/auxiliary/iterator/walker_grid.cpp - gui/auxiliary/iterator/walker_widget.cpp gui/core/log.cpp gui/core/placer.cpp gui/core/placer/horizontal_list.cpp gui/core/placer/vertical_list.cpp - gui/auxiliary/old_markup.cpp + gui/core/point.cpp gui/core/timer.cpp gui/core/tips.cpp gui/core/widget_definition.cpp gui/core/window_builder.cpp gui/core/window_builder/helper.cpp gui/core/window_builder/instance.cpp + gui/dialogs/addon/connect.cpp gui/dialogs/addon/description.cpp gui/dialogs/addon/filter_options.cpp - gui/dialogs/addon/uninstall_list.cpp - gui/dialogs/addon/connect.cpp gui/dialogs/addon/list.cpp + gui/dialogs/addon/uninstall_list.cpp gui/dialogs/advanced_graphics_options.cpp gui/dialogs/campaign_difficulty.cpp gui/dialogs/campaign_selection.cpp gui/dialogs/campaign_settings.cpp - gui/dialogs/core_selection.cpp gui/dialogs/chat_log.cpp + gui/dialogs/core_selection.cpp gui/dialogs/debug_clock.cpp gui/dialogs/depcheck_confirm_change.cpp gui/dialogs/depcheck_select_new.cpp gui/dialogs/dialog.cpp gui/dialogs/drop_down_list.cpp gui/dialogs/edit_label.cpp + gui/dialogs/edit_text.cpp + gui/dialogs/editor/custom_tod.cpp gui/dialogs/editor/edit_label.cpp gui/dialogs/editor/edit_scenario.cpp gui/dialogs/editor/edit_side.cpp - gui/dialogs/editor/custom_tod.cpp gui/dialogs/editor/generate_map.cpp gui/dialogs/editor/new_map.cpp gui/dialogs/editor/resize_map.cpp @@ -381,23 +394,22 @@ wesnoth_sources = Split(""" gui/dialogs/lua_interpreter.cpp gui/dialogs/message.cpp gui/dialogs/multiplayer/mp_alerts_options.cpp - gui/dialogs/multiplayer/mp_cmd_wrapper.cpp gui/dialogs/multiplayer/mp_change_control.cpp + gui/dialogs/multiplayer/mp_cmd_wrapper.cpp gui/dialogs/multiplayer/mp_connect.cpp - gui/dialogs/multiplayer/mp_create_game.cpp gui/dialogs/multiplayer/mp_create_game_set_password.cpp + gui/dialogs/multiplayer/mp_create_game.cpp gui/dialogs/multiplayer/mp_host_game_prompt.cpp gui/dialogs/multiplayer/mp_join_game_password_prompt.cpp gui/dialogs/multiplayer/mp_login.cpp gui/dialogs/multiplayer/mp_method_selection.cpp + gui/dialogs/multiplayer/synced_choice_wait.cpp gui/dialogs/network_transmission.cpp gui/dialogs/popup.cpp gui/dialogs/preferences_dialog.cpp - gui/dialogs/edit_text.cpp gui/dialogs/screenshot_notification.cpp gui/dialogs/select_orb_colors.cpp gui/dialogs/simple_item_selector.cpp - gui/dialogs/multiplayer/synced_choice_wait.cpp gui/dialogs/theme_list.cpp gui/dialogs/tip.cpp gui/dialogs/title_screen.cpp @@ -407,7 +419,6 @@ wesnoth_sources = Split(""" gui/dialogs/unit_recruit.cpp gui/dialogs/wml_error.cpp gui/dialogs/wml_message.cpp - gui/core/point.cpp gui/widgets/button.cpp gui/widgets/combobox.cpp gui/widgets/container.cpp @@ -430,36 +441,36 @@ wesnoth_sources = Split(""" gui/widgets/progress_bar.cpp gui/widgets/repeating_button.cpp gui/widgets/scroll_label.cpp - gui/widgets/scrollbar.cpp gui/widgets/scrollbar_container.cpp gui/widgets/scrollbar_panel.cpp + gui/widgets/scrollbar.cpp gui/widgets/settings.cpp gui/widgets/slider.cpp gui/widgets/spacer.cpp gui/widgets/stacked_widget.cpp - gui/widgets/text.cpp gui/widgets/text_box.cpp + gui/widgets/text.cpp gui/widgets/toggle_button.cpp gui/widgets/toggle_panel.cpp - gui/widgets/tree_view.cpp gui/widgets/tree_view_node.cpp + gui/widgets/tree_view.cpp gui/widgets/unit_preview_pane.cpp gui/widgets/vertical_scrollbar.cpp gui/widgets/viewport.cpp gui/widgets/widget.cpp gui/widgets/window.cpp halo.cpp - help/help.cpp help/help_browser.cpp help/help_button.cpp help/help_impl.cpp help/help_menu.cpp help/help_text_area.cpp help/help_topic_generators.cpp - hotkey/hotkey_preferences_display.cpp - hotkey/hotkey_handler.cpp - hotkey/hotkey_handler_sp.cpp + help/help.cpp hotkey/hotkey_handler_mp.cpp + hotkey/hotkey_handler_sp.cpp + hotkey/hotkey_handler.cpp + hotkey/hotkey_preferences_display.cpp intro.cpp leader_scroll_dialog.cpp lobby_preferences.cpp @@ -468,16 +479,7 @@ wesnoth_sources = Split(""" mouse_handler_base.cpp movetype.cpp mp_game_settings.cpp - game_initialization/mp_game_utils.cpp - game_initialization/mp_options.cpp mp_ui_alerts.cpp - game_initialization/multiplayer.cpp - game_initialization/multiplayer_configure.cpp - game_initialization/multiplayer_connect.cpp - game_initialization/multiplayer_create.cpp - game_initialization/multiplayer_lobby.cpp - game_initialization/multiplayer_ui.cpp - game_initialization/multiplayer_wait.cpp network_asio.cpp pathfind/pathfind.cpp pathfind/teleport.cpp @@ -485,19 +487,18 @@ wesnoth_sources = Split(""" persist_manager.cpp persist_var.cpp play_controller.cpp - game_initialization/playcampaign.cpp playmp_controller.cpp playsingle_controller.cpp - playturn.cpp playturn_network_adapter.cpp - random_new.cpp + playturn.cpp random_new_deterministic.cpp random_new_synced.cpp + random_new.cpp recall_list_manager.cpp - replay.cpp - replay_helper.cpp replay_controller.cpp + replay_helper.cpp replay_recorder_base.cpp + replay.cpp resources.cpp save_blocker.cpp save_index.cpp @@ -523,29 +524,26 @@ wesnoth_sources = Split(""" scripting/plugins/manager.cpp settings.cpp side_filter.cpp - game_initialization/singleplayer.cpp - statistics.cpp statistics_dialog.cpp + statistics.cpp storyscreen/controller.cpp storyscreen/interface.cpp storyscreen/part.cpp storyscreen/render.cpp strftime.cpp synced_checkup.cpp - synced_context.cpp synced_commands.cpp + synced_context.cpp synced_user_choice.cpp syncmp_handler.cpp team.cpp teambuilder.cpp terrain/filter.cpp tod_manager.cpp - units/unit.cpp units/abilities.cpp - units/animation.cpp units/animation_component.cpp + units/animation.cpp units/attack_type.cpp - units/udisplay.cpp units/drawer.cpp units/filter.cpp units/formula_manager.cpp @@ -554,9 +552,11 @@ wesnoth_sources = Split(""" units/id.cpp units/map.cpp units/types.cpp + units/udisplay.cpp + units/unit.cpp utils/sha1.cpp - variable.cpp variable_info.cpp + variable.cpp whiteboard/action.cpp whiteboard/attack.cpp whiteboard/highlighter.cpp @@ -568,8 +568,8 @@ wesnoth_sources = Split(""" whiteboard/side_actions.cpp whiteboard/suppose_dead.cpp whiteboard/utility.cpp - widgets/combo.cpp widgets/combo_drag.cpp + widgets/combo.cpp widgets/drop_target.cpp widgets/scrollpane.cpp wmi_pager.cpp @@ -637,11 +637,11 @@ wesnothd_sources = Split(""" server/game.cpp server/input_stream.cpp server/metrics.cpp - server/player.cpp server/player_network.cpp + server/player.cpp server/proxy.cpp - server/room.cpp server/room_manager.cpp + server/room.cpp server/sample_user_handler.cpp server/simple_wml.cpp server/user_handler.cpp @@ -656,35 +656,35 @@ cutter_sources = Split(""" client_env.WesnothProgram("cutter", cutter_sources + [libcutter, libwesnoth_core, libwesnoth_sdl, libwesnothd, libwesnoth], have_client_prereqs, LIBS = ["$LIBS", "png"]) exploder_sources = Split(""" - tools/exploder.cpp tools/exploder_composer.cpp + tools/exploder.cpp """) client_env.WesnothProgram("exploder", exploder_sources + [libcutter, libwesnoth_core, libwesnoth_sdl, libwesnothd, libwesnoth], have_client_prereqs, LIBS = ["$LIBS", "png"]) schema_generator_sources = Split(""" + tools/schema/error_container.cpp tools/schema/schema_generator.cpp tools/schema/sourceparser.cpp - tools/schema/error_container.cpp """) client_env.WesnothProgram("schema_generator", schema_generator_sources + [libwesnoth_core, libwesnothd], have_client_prereqs) test_utils_sources = Split(""" - tests/utils/game_config_manager.cpp - tests/utils/fake_event_source.cpp tests/utils/fake_display.cpp + tests/utils/fake_event_source.cpp + tests/utils/game_config_manager.cpp """) wesmage_sources = Split(""" - wesmage/wesmage.cpp - wesmage/exit.cpp - wesmage/filter.cpp - wesmage/options.cpp - tools/dummy_video.cpp - tools/exploder_utils.cpp - sdl/utils.cpp sdl/alpha.cpp + sdl/utils.cpp sdl/window.cpp + tools/dummy_video.cpp + tools/exploder_utils.cpp tracer.cpp + wesmage/exit.cpp + wesmage/filter.cpp + wesmage/options.cpp + wesmage/wesmage.cpp """) client_env.WesnothProgram("wesmage", wesmage_sources + [libwesnoth_core], have_client_prereqs, OBJPREFIX = "wesmage_", LIBS = ["$LIBS", "png"]) @@ -709,12 +709,12 @@ test_sources = Split(""" tests/test_image_modifications.cpp tests/test_lexical_cast.cpp tests/test_lua.cpp - tests/test_map_location.cpp tests/test_make_enum.cpp - tests/test_rng.cpp + tests/test_map_location.cpp tests/test_mp_connect.cpp tests/test_network_worker.cpp tests/test_recall_list.cpp + tests/test_rng.cpp tests/test_sdl_utils.cpp tests/test_serialization.cpp tests/test_team.cpp @@ -729,12 +729,12 @@ test_sources.extend(test_env.Object("tests/test_config_cache.cpp")) test = test_env.WesnothProgram("test", test_sources + [libtest_utils, libwesnoth_extras, libwesnoth_core, libwesnoth, libwesnoth_sdl, libwesnoth_extras], have_test_prereqs) create_images_sources = Split(""" + sdl/alpha.cpp + sdl/utils.cpp + sdl/window.cpp tests/create_images.cpp tools/dummy_video.cpp tools/exploder_utils.cpp - sdl/utils.cpp - sdl/alpha.cpp - sdl/window.cpp tracer.cpp """) From 3ac7f8d970d92f65f17c76e502c36a2a1240c438 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 00:42:38 -0400 Subject: [PATCH 075/240] NULL -> nullptr A few cases of NULL were missed, since changing them led to errors (Mainly instances where it was passed to a boost::function) --- projectfiles/Xcode/Mac Sources/SDLMain.mm | 2 +- src/SDL_SavePNG/savepng.cpp | 10 +- src/about.cpp | 9 +- src/actions/attack.cpp | 66 ++-- src/actions/attack.hpp | 20 +- src/actions/create.cpp | 10 +- src/actions/move.cpp | 16 +- src/actions/move.hpp | 6 +- src/actions/shroud_clearing_action.cpp | 4 +- src/actions/undo.cpp | 13 +- src/actions/undo_action.hpp | 2 +- src/actions/unit_creator.cpp | 8 +- src/actions/unit_creator.hpp | 6 +- src/actions/vision.cpp | 28 +- src/actions/vision.hpp | 22 +- src/addon/client.cpp | 8 +- src/addon/manager_ui.cpp | 6 +- src/ai/actions.cpp | 20 +- src/ai/composite/aspect.hpp | 4 +- src/ai/composite/component.cpp | 22 +- src/ai/composite/engine.cpp | 2 +- src/ai/composite/engine.hpp | 2 +- src/ai/composite/goal.hpp | 2 +- src/ai/composite/property_handler.hpp | 4 +- src/ai/composite/rca.hpp | 2 +- src/ai/composite/stage.hpp | 2 +- src/ai/contexts.cpp | 14 +- src/ai/contexts.hpp | 18 +- src/ai/default/attack.cpp | 6 +- src/ai/default/ca.cpp | 4 +- src/ai/default/contexts.hpp | 2 +- src/ai/default/recruitment.cpp | 16 +- src/ai/formula/ai.cpp | 12 +- src/ai/formula/callable_objects.cpp | 10 +- src/ai/formula/candidates.cpp | 4 +- src/ai/formula/engine_fai.cpp | 2 +- src/ai/formula/function_table.cpp | 14 +- src/ai/lua/aspect_advancements.cpp | 3 +- src/ai/lua/core.cpp | 12 +- src/ai/lua/engine_lua.cpp | 2 +- src/ai/lua/lua_object.cpp | 2 +- src/ai/manager.cpp | 33 +- src/ai/simulated_actions.cpp | 4 +- src/attack_prediction.cpp | 14 +- src/attack_prediction.hpp | 2 +- src/attack_prediction_display.cpp | 8 +- src/build_info.cpp | 4 +- src/campaign_server/campaign_server.cpp | 16 +- src/carryover.cpp | 2 +- src/config.cpp | 14 +- src/config.hpp | 2 +- src/construct_dialog.cpp | 46 +-- src/construct_dialog.hpp | 14 +- src/controller_base.cpp | 4 +- src/controller_base.hpp | 6 +- src/cursor.cpp | 14 +- src/desktop/dbus_notification.cpp | 12 +- src/desktop/open.cpp | 4 +- src/desktop/version.cpp | 4 +- src/desktop/windows_tray_notification.cpp | 34 +- src/dialogs.cpp | 16 +- src/dialogs.hpp | 6 +- src/display.cpp | 98 +++--- src/display.hpp | 16 +- src/display_context.cpp | 4 +- src/editor/action/action.cpp | 4 +- src/editor/action/action_item.cpp | 2 +- src/editor/action/action_label.cpp | 2 +- src/editor/action/action_unit.cpp | 2 +- src/editor/action/action_village.cpp | 8 +- src/editor/action/mouse/mouse_action.cpp | 62 ++-- src/editor/action/mouse/mouse_action.hpp | 8 +- src/editor/action/mouse/mouse_action_item.cpp | 40 +-- src/editor/action/mouse/mouse_action_item.hpp | 2 +- .../action/mouse/mouse_action_map_label.cpp | 16 +- .../action/mouse/mouse_action_select.cpp | 4 +- src/editor/action/mouse/mouse_action_unit.cpp | 38 +-- src/editor/action/mouse/mouse_action_unit.hpp | 2 +- .../action/mouse/mouse_action_village.cpp | 10 +- .../action/mouse/mouse_action_village.hpp | 4 +- src/editor/controller/editor_controller.cpp | 26 +- src/editor/controller/editor_controller.hpp | 4 +- src/editor/map/context_manager.cpp | 4 +- src/editor/map/map_context.cpp | 18 +- src/editor/map/map_context.hpp | 4 +- src/editor/palette/editor_palettes.cpp | 2 +- src/editor/palette/empty_palette.hpp | 2 +- src/editor/palette/item_palette.cpp | 4 +- src/editor/palette/terrain_palettes.cpp | 8 +- src/editor/palette/tristate_button.cpp | 18 +- src/editor/palette/unit_palette.cpp | 4 +- src/editor/toolkit/editor_toolkit.cpp | 4 +- src/events.hpp | 4 +- src/fake_unit_ptr.cpp | 16 +- src/filechooser.cpp | 2 +- src/filesystem.hpp | 6 +- src/filesystem_boost.cpp | 16 +- src/filesystem_common.cpp | 6 +- src/floating_label.cpp | 66 ++-- src/floating_label.hpp | 2 +- src/floating_textbox.cpp | 20 +- src/floating_textbox.hpp | 2 +- src/font.cpp | 40 +-- src/format_time_summary.cpp | 6 +- src/formula/callable.hpp | 2 +- src/formula/callable_objects.cpp | 10 +- src/formula/debugger.cpp | 10 +- src/formula/debugger.hpp | 4 +- src/formula/debugger_fwd.cpp | 4 +- src/formula/formula.cpp | 18 +- src/formula/formula.hpp | 18 +- src/formula/function.cpp | 12 +- src/formula/function.hpp | 8 +- src/formula/string_utils.hpp | 2 +- src/formula/variant.cpp | 2 +- src/formula/variant.hpp | 6 +- src/game_board.cpp | 2 +- src/game_config_manager.cpp | 6 +- src/game_config_manager.hpp | 4 +- src/game_display.cpp | 24 +- src/game_display.hpp | 2 +- src/game_events/action_wml.cpp | 6 +- src/game_events/conditional_wml.cpp | 2 +- src/game_events/menu_item.cpp | 4 +- src/game_events/pump.cpp | 12 +- src/game_initialization/connect_engine.cpp | 4 +- src/game_initialization/create_engine.cpp | 20 +- src/game_initialization/create_engine.hpp | 2 +- src/game_initialization/flg_manager.cpp | 12 +- src/game_initialization/multiplayer.cpp | 8 +- .../multiplayer_create.cpp | 4 +- src/game_initialization/multiplayer_lobby.cpp | 6 +- src/game_initialization/multiplayer_lobby.hpp | 2 +- src/game_initialization/multiplayer_ui.cpp | 36 +-- src/game_initialization/multiplayer_wait.cpp | 8 +- src/game_initialization/playcampaign.hpp | 2 +- src/game_initialization/singleplayer.cpp | 2 +- src/game_launcher.cpp | 4 +- src/game_state.cpp | 8 +- src/game_state.hpp | 2 +- src/generators/cave_map_generator.cpp | 6 +- src/generators/default_map_generator.cpp | 22 +- src/generators/default_map_generator_job.cpp | 24 +- src/generators/default_map_generator_job.hpp | 4 +- src/generators/map_create.cpp | 6 +- src/generators/map_generator.cpp | 2 +- src/gettext.cpp | 16 +- src/gettext_boost.cpp | 4 +- src/global.hpp | 2 +- src/gui/auxiliary/field.hpp | 8 +- src/gui/auxiliary/formula.hpp | 6 +- src/gui/auxiliary/iterator/policy_visit.hpp | 2 +- src/gui/auxiliary/iterator/walker_grid.cpp | 10 +- src/gui/auxiliary/iterator/walker_widget.cpp | 8 +- src/gui/core/canvas.cpp | 6 +- src/gui/core/event/dispatcher.cpp | 2 +- src/gui/core/event/dispatcher.hpp | 2 +- src/gui/core/event/dispatcher_private.hpp | 14 +- src/gui/core/event/distributor.cpp | 46 +-- src/gui/core/event/distributor.hpp | 2 +- src/gui/core/event/handler.cpp | 32 +- src/gui/core/notifiee.hpp | 2 +- src/gui/core/notifier.hpp | 4 +- src/gui/core/timer.cpp | 2 +- src/gui/dialogs/chat_log.cpp | 2 +- src/gui/dialogs/debug_clock.cpp | 2 +- src/gui/dialogs/debug_clock.hpp | 18 +- src/gui/dialogs/editor/custom_tod.cpp | 12 +- src/gui/dialogs/editor/custom_tod.hpp | 2 +- src/gui/dialogs/editor/generate_map.cpp | 4 +- src/gui/dialogs/formula_debugger.cpp | 2 +- src/gui/dialogs/game_cache_options.cpp | 8 +- src/gui/dialogs/game_load.cpp | 6 +- src/gui/dialogs/loadscreen.cpp | 12 +- src/gui/dialogs/loadscreen.hpp | 4 +- src/gui/dialogs/lobby/data.cpp | 6 +- src/gui/dialogs/lobby/data.hpp | 2 +- src/gui/dialogs/lobby/info.cpp | 12 +- src/gui/dialogs/lobby/lobby.cpp | 38 +-- src/gui/dialogs/lobby/lobby.hpp | 2 +- src/gui/dialogs/lobby/player_info.cpp | 14 +- src/gui/dialogs/lua_interpreter.cpp | 12 +- src/gui/dialogs/message.cpp | 4 +- .../dialogs/multiplayer/mp_change_control.cpp | 2 +- .../dialogs/multiplayer/mp_create_game.cpp | 6 +- src/gui/dialogs/popup.cpp | 4 +- src/gui/dialogs/preferences_dialog.cpp | 2 +- src/gui/dialogs/title_screen.cpp | 4 +- src/gui/dialogs/wml_message.hpp | 4 +- src/gui/widgets/container.hpp | 2 +- src/gui/widgets/control.cpp | 12 +- src/gui/widgets/control.hpp | 6 +- src/gui/widgets/debug.cpp | 2 +- src/gui/widgets/generator.cpp | 18 +- src/gui/widgets/generator_private.hpp | 4 +- src/gui/widgets/grid.cpp | 8 +- src/gui/widgets/grid.hpp | 6 +- src/gui/widgets/list.cpp | 12 +- src/gui/widgets/listbox.cpp | 22 +- src/gui/widgets/matrix.cpp | 12 +- src/gui/widgets/matrix.hpp | 4 +- src/gui/widgets/minimap.cpp | 10 +- src/gui/widgets/minimap.hpp | 4 +- src/gui/widgets/multi_page.cpp | 10 +- src/gui/widgets/pane.cpp | 8 +- src/gui/widgets/pane.hpp | 4 +- src/gui/widgets/panel.cpp | 2 +- src/gui/widgets/scroll_label.cpp | 2 +- src/gui/widgets/scrollbar.cpp | 8 +- src/gui/widgets/scrollbar_container.cpp | 12 +- src/gui/widgets/scrollbar_panel.cpp | 2 +- src/gui/widgets/settings.cpp | 2 +- src/gui/widgets/stacked_widget.cpp | 6 +- src/gui/widgets/text.cpp | 8 +- src/gui/widgets/toggle_panel.cpp | 2 +- src/gui/widgets/tree_view.cpp | 10 +- src/gui/widgets/tree_view_node.cpp | 22 +- src/gui/widgets/tree_view_node.hpp | 4 +- src/gui/widgets/viewport.cpp | 4 +- src/gui/widgets/widget.cpp | 20 +- src/gui/widgets/widget.hpp | 10 +- src/gui/widgets/window.cpp | 28 +- src/gui/widgets/window.hpp | 2 +- src/halo.cpp | 22 +- src/help/help.cpp | 7 +- src/help/help_browser.cpp | 13 +- src/help/help_button.cpp | 4 +- src/help/help_impl.cpp | 28 +- src/help/help_impl.hpp | 10 +- src/help/help_menu.cpp | 18 +- src/help/help_menu.hpp | 4 +- src/help/help_text_area.cpp | 9 +- src/hotkey/command_executor.cpp | 8 +- src/hotkey/command_executor.hpp | 4 +- src/hotkey/hotkey_preferences_display.cpp | 2 +- src/image.cpp | 30 +- src/image.hpp | 4 +- src/image_modifications.cpp | 104 +++--- src/key.cpp | 2 +- src/language.cpp | 10 +- src/log.cpp | 8 +- src/log.hpp | 4 +- src/log_windows.cpp | 8 +- src/lua_jailbreak_exception.cpp | 5 +- src/lua_jailbreak_exception.hpp | 2 +- src/map/label.cpp | 8 +- src/map/location.hpp | 2 +- src/map/map.cpp | 2 +- src/marked-up_text.cpp | 10 +- src/marked-up_text.hpp | 4 +- src/md5.cpp | 2 +- src/menu_events.cpp | 42 +-- src/minimap.cpp | 28 +- src/minimap.hpp | 4 +- src/mouse_events.cpp | 25 +- src/mouse_handler_base.cpp | 4 +- src/movetype.cpp | 22 +- src/movetype.hpp | 26 +- src/nacl/plugin.cc | 8 +- src/network.cpp | 24 +- src/network_worker.cpp | 28 +- src/pathfind/astarsearch.cpp | 2 +- src/pathfind/pathfind.cpp | 72 ++--- src/pathfind/pathfind.hpp | 8 +- src/persist_context.cpp | 8 +- src/persist_context.hpp | 4 +- src/play_controller.cpp | 58 ++-- src/play_controller.hpp | 2 +- src/playmp_controller.cpp | 2 +- src/playsingle_controller.cpp | 8 +- src/playsingle_controller.hpp | 2 +- src/playturn.cpp | 8 +- src/random_new.cpp | 2 +- src/replay.cpp | 6 +- src/replay_controller.hpp | 2 +- src/replay_helper.cpp | 2 +- src/reports.cpp | 4 +- src/resources.cpp | 36 +-- src/save_blocker.cpp | 8 +- src/save_index.cpp | 2 +- src/save_index.hpp | 4 +- src/savegame.cpp | 6 +- src/savegame.hpp | 2 +- src/scoped_resource.hpp | 10 +- src/scripting/application_lua_kernel.cpp | 2 +- src/scripting/game_lua_kernel.cpp | 66 ++-- src/scripting/lua_api.cpp | 12 +- src/scripting/lua_api.hpp | 2 +- src/scripting/lua_common.cpp | 6 +- src/scripting/lua_cpp_function.cpp | 6 +- src/scripting/lua_fileops.cpp | 2 +- src/scripting/lua_gui2.cpp | 4 +- src/scripting/lua_kernel_base.cpp | 10 +- src/scripting/lua_kernel_base.hpp | 4 +- src/scripting/lua_race.cpp | 2 +- src/scripting/lua_rng.cpp | 4 +- src/scripting/lua_team.cpp | 2 +- src/scripting/mapgen_lua_kernel.cpp | 6 +- src/scripting/plugins/context.cpp | 4 +- src/scripting/plugins/manager.cpp | 2 +- src/sdl/image.cpp | 24 +- src/sdl/image.hpp | 4 +- src/sdl/rect.cpp | 4 +- src/sdl/utils.cpp | 306 +++++++++--------- src/sdl/utils.hpp | 14 +- src/serialization/parser.cpp | 4 +- src/serialization/parser.hpp | 8 +- src/serialization/preprocessor.cpp | 12 +- src/serialization/preprocessor.hpp | 2 +- src/serialization/schema_validator.cpp | 6 +- src/serialization/tokenizer.cpp | 2 +- src/server/ban.cpp | 2 +- src/server/forum_user_handler.cpp | 8 +- src/server/game.cpp | 14 +- src/server/game.hpp | 5 +- src/server/metrics.cpp | 4 +- src/server/player.cpp | 2 +- src/server/player.hpp | 4 +- src/server/room.cpp | 2 +- src/server/room.hpp | 4 +- src/server/room_manager.cpp | 40 +-- src/server/room_manager.hpp | 8 +- src/server/sample_user_handler.cpp | 4 +- src/server/sample_user_handler.hpp | 4 +- src/server/server.cpp | 106 +++--- src/server/simple_wml.cpp | 84 ++--- src/server/simple_wml.hpp | 4 +- src/server/user_handler.cpp | 2 +- src/settings.hpp | 2 +- src/show_dialog.cpp | 32 +- src/show_dialog.hpp | 30 +- src/side_filter.cpp | 2 +- src/sound.cpp | 12 +- src/sound_music_track.cpp | 4 +- src/statistics.hpp | 2 +- src/statistics_dialog.cpp | 6 +- src/storyscreen/controller.cpp | 4 +- src/storyscreen/part.cpp | 2 +- src/storyscreen/render.cpp | 12 +- src/synced_commands.cpp | 2 +- src/synced_context.cpp | 2 +- src/team.cpp | 8 +- src/team.hpp | 2 +- src/teambuilder.cpp | 4 +- src/terrain/builder.cpp | 12 +- src/terrain/builder.hpp | 4 +- src/terrain/filter.cpp | 22 +- src/tests/gui/fire_event.cpp | 2 +- src/tests/gui/iterator.cpp | 2 +- src/tests/gui/test_gui2.cpp | 10 +- src/tests/gui/visitor.cpp | 24 +- src/tests/test_image_modifications.cpp | 136 ++++---- src/tests/test_lua.cpp | 2 +- src/tests/test_mp_connect.cpp | 2 +- src/text.cpp | 18 +- src/theme.cpp | 14 +- src/theme.hpp | 4 +- src/thread.cpp | 10 +- src/thread.hpp | 4 +- src/tod_manager.hpp | 4 +- src/tools/cutter.cpp | 2 +- src/tools/dummy_video.cpp | 4 +- src/tools/exploder_composer.cpp | 4 +- src/tools/exploder_cutter.cpp | 6 +- src/tools/exploder_cutter.hpp | 4 +- src/tools/exploder_utils.cpp | 8 +- src/tools/schema/schema_generator.cpp | 2 +- src/tools/schema/sourceparser.cpp | 2 +- src/tools/schema/tag.cpp | 12 +- src/tools/sdl2/window.cpp | 6 +- src/tooltips.cpp | 8 +- src/tooltips.hpp | 2 +- src/tracer.hpp | 4 +- src/units/abilities.cpp | 6 +- src/units/abilities.hpp | 2 +- src/units/animation.cpp | 6 +- src/units/animation.hpp | 10 +- src/units/animation_component.cpp | 2 +- src/units/animation_component.hpp | 8 +- src/units/attack_type.cpp | 4 +- src/units/attack_type.hpp | 2 +- src/units/drawer.cpp | 28 +- src/units/filter.cpp | 6 +- src/units/filter.hpp | 2 +- src/units/frame.cpp | 4 +- src/units/map.cpp | 4 +- src/units/map.hpp | 20 +- src/units/types.cpp | 32 +- src/units/types.hpp | 4 +- src/units/udisplay.cpp | 10 +- src/units/udisplay.hpp | 10 +- src/units/unit.cpp | 22 +- src/units/unit.hpp | 12 +- src/util.hpp | 6 +- src/utils/iterator.hpp | 2 +- src/utils/shared_object.hpp | 8 +- src/utils/smart_list.hpp | 18 +- src/variable.cpp | 2 +- src/video.cpp | 28 +- src/video.hpp | 4 +- src/wesnoth.cpp | 20 +- src/whiteboard/highlighter.cpp | 2 +- src/whiteboard/manager.cpp | 6 +- src/whiteboard/manager.hpp | 2 +- src/whiteboard/move.cpp | 4 +- src/whiteboard/utility.cpp | 8 +- src/whiteboard/utility.hpp | 12 +- src/widgets/button.cpp | 16 +- src/widgets/combo.cpp | 4 +- src/widgets/menu.cpp | 20 +- src/widgets/menu.hpp | 4 +- src/widgets/menu_style.cpp | 10 +- src/widgets/multimenu.cpp | 2 +- src/widgets/multimenu.hpp | 2 +- src/widgets/scrollbar.cpp | 12 +- src/widgets/scrollpane.cpp | 2 +- src/widgets/slider.cpp | 4 +- src/widgets/slider.hpp | 2 +- src/widgets/textbox.cpp | 22 +- src/widgets/textbox.hpp | 2 +- src/widgets/widget.cpp | 2 +- src/wmi_pager.hpp | 2 +- src/wml_exception.hpp | 4 +- 423 files changed, 2380 insertions(+), 2390 deletions(-) diff --git a/projectfiles/Xcode/Mac Sources/SDLMain.mm b/projectfiles/Xcode/Mac Sources/SDLMain.mm index 618938906e83..0e59c049936c 100644 --- a/projectfiles/Xcode/Mac Sources/SDLMain.mm +++ b/projectfiles/Xcode/Mac Sources/SDLMain.mm @@ -108,7 +108,7 @@ int main (int argc, char **argv) } gArgs.push_back(argv[i]); } - gArgs.push_back(NULL); + gArgs.push_back(nullptr); [SDLApplication sharedApplication]; [NSBundle loadNibNamed:@"SDLMain" owner:NSApp]; diff --git a/src/SDL_SavePNG/savepng.cpp b/src/SDL_SavePNG/savepng.cpp index 1e05aacffb48..fa6736a0313c 100644 --- a/src/SDL_SavePNG/savepng.cpp +++ b/src/SDL_SavePNG/savepng.cpp @@ -73,16 +73,16 @@ int SDL_SavePNG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst) /* Initialize and do basic error checking */ if (!dst) { - SDL_SetError("Argument 2 to SDL_SavePNG_RW can't be NULL, expecting SDL_RWops*\n"); + SDL_SetError("Argument 2 to SDL_SavePNG_RW can't be nullptr, expecting SDL_RWops*\n"); return (SAVEPNG_ERROR); } if (!surface) { - SDL_SetError("Argument 1 to SDL_SavePNG_RW can't be NULL, expecting SDL_Surface*\n"); + SDL_SetError("Argument 1 to SDL_SavePNG_RW can't be nullptr, expecting SDL_Surface*\n"); if (freedst) SDL_RWclose(dst); return (SAVEPNG_ERROR); } - png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, NULL, png_error_SDL, NULL); /* err_ptr, err_fn, warn_fn */ + png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, png_error_SDL, nullptr); /* err_ptr, err_fn, warn_fn */ if (!png_ptr) { SDL_SetError("Unable to png_create_write_struct on %s\n", PNG_LIBPNG_VER_STRING); @@ -93,7 +93,7 @@ int SDL_SavePNG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst) if (!info_ptr) { SDL_SetError("Unable to png_create_info_struct\n"); - png_destroy_write_struct(&png_ptr, NULL); + png_destroy_write_struct(&png_ptr, nullptr); if (freedst) SDL_RWclose(dst); return (SAVEPNG_ERROR); } @@ -105,7 +105,7 @@ int SDL_SavePNG_RW(SDL_Surface *surface, SDL_RWops *dst, int freedst) } /* Setup our RWops writer */ - png_set_write_fn(png_ptr, dst, png_write_SDL, NULL); /* w_ptr, write_fn, flush_fn */ + png_set_write_fn(png_ptr, dst, png_write_SDL, nullptr); /* w_ptr, write_fn, flush_fn */ /* Prepare chunks */ colortype = PNG_COLOR_MASK_COLOR; diff --git a/src/about.cpp b/src/about.cpp index a0eb2919eb49..86def503b649 100644 --- a/src/about.cpp +++ b/src/about.cpp @@ -40,7 +40,6 @@ #include // for max #include // for auto_any_base, etc #include // for scoped_ptr -#include // for NULL #include // for map, map<>::mapped_type #include // for operator<<, basic_ostream, etc @@ -211,7 +210,7 @@ void show_about(CVideo &video, const std::string &campaign) { boost::scoped_ptr cur(new cursor::setter(cursor::WAIT)); surface& screen = video.getSurface(); - if (screen == NULL) return; + if (screen == nullptr) return; // If the title is multi-line, we need to split it accordingly or we // get slight scrolling glitches in the credits screen. @@ -350,14 +349,14 @@ void show_about(CVideo &video, const std::string &campaign) if (redraw_mapimage) { // draw map to screen, thus erasing all text - sdl_blit(map_image_scaled, NULL, screen, NULL); + sdl_blit(map_image_scaled, nullptr, screen, nullptr); update_rect(screen_rect); // redraw the dialog f.draw_background(); f.draw_border(); // cache the dialog background (alpha blending + blurred map) - sdl_blit(screen, &text_rect, text_surf, NULL); + sdl_blit(screen, &text_rect, text_surf, nullptr); redraw_mapimage = false; } else { // redraw the saved part of the dialog where text scrolled @@ -385,7 +384,7 @@ void show_about(CVideo &video, const std::string &campaign) // since the real drawing on screen is clipped, // we do a dummy one to get the height of the not clipped line. // (each time because special format characters may change it) - const int line_height = font::draw_text(NULL, text_rect, def_size, def_color, + const int line_height = font::draw_text(nullptr, text_rect, def_size, def_color, text[line], 0,0).h; if(is_new_line) { diff --git a/src/actions/attack.cpp b/src/actions/attack.cpp index 1eb03322ad25..89277075a13e 100644 --- a/src/actions/attack.cpp +++ b/src/actions/attack.cpp @@ -71,7 +71,7 @@ battle_context_unit_stats::battle_context_unit_stats(const unit &u, const map_location& u_loc, int u_attack_num, bool attacking, const unit &opp, const map_location& opp_loc, const attack_type *opp_weapon, const unit_map& units) : - weapon(NULL), + weapon(nullptr), attack_num(u_attack_num), is_attacker(attacking), is_poisoned(u.get_state(unit::STATE_POISONED)), @@ -323,8 +323,8 @@ battle_context::battle_context(const unit_map& units, const map_location& attacker_loc, const map_location& defender_loc, int attacker_weapon, int defender_weapon, double aggression, const combatant *prev_def, const unit* attacker_ptr) : - attacker_stats_(NULL), defender_stats_(NULL), attacker_combatant_(NULL), - defender_combatant_(NULL) + attacker_stats_(nullptr), defender_stats_(nullptr), attacker_combatant_(nullptr), + defender_combatant_(nullptr) { const unit &attacker = attacker_ptr ? *attacker_ptr : *units.find(attacker_loc); const unit &defender = *units.find(defender_loc); @@ -344,8 +344,8 @@ battle_context::battle_context(const unit_map& units, // If those didn't have to generate statistics, do so now. if (!attacker_stats_) { - const attack_type *adef = NULL; - const attack_type *ddef = NULL; + const attack_type *adef = nullptr; + const attack_type *ddef = nullptr; if (attacker_weapon >= 0) { VALIDATE(attacker_weapon < static_cast(attacker.attacks().size()), _("An invalid attacker weapon got selected.")); @@ -372,14 +372,14 @@ battle_context::battle_context(const battle_context_unit_stats &att, const battle_context_unit_stats &def) : attacker_stats_(new battle_context_unit_stats(att)), defender_stats_(new battle_context_unit_stats(def)), - attacker_combatant_(NULL), - defender_combatant_(NULL) + attacker_combatant_(nullptr), + defender_combatant_(nullptr) { } battle_context::battle_context(const battle_context &other) : - attacker_stats_(NULL), defender_stats_(NULL), attacker_combatant_(NULL), - defender_combatant_(NULL) + attacker_stats_(nullptr), defender_stats_(nullptr), attacker_combatant_(nullptr), + defender_combatant_(nullptr) { *this = other; } @@ -401,8 +401,8 @@ battle_context& battle_context::operator=(const battle_context &other) delete defender_combatant_; attacker_stats_ = new battle_context_unit_stats(*other.attacker_stats_); defender_stats_ = new battle_context_unit_stats(*other.defender_stats_); - attacker_combatant_ = other.attacker_combatant_ ? new combatant(*other.attacker_combatant_, *attacker_stats_) : NULL; - defender_combatant_ = other.defender_combatant_ ? new combatant(*other.defender_combatant_, *defender_stats_) : NULL; + attacker_combatant_ = other.attacker_combatant_ ? new combatant(*other.attacker_combatant_, *attacker_stats_) : nullptr; + defender_combatant_ = other.defender_combatant_ ? new combatant(*other.defender_combatant_, *defender_stats_) : nullptr; } return *this; } @@ -491,12 +491,12 @@ int battle_context::choose_attacker_weapon(const unit &attacker, if (choices.size() == 1) { *defender_weapon = choose_defender_weapon(attacker, defender, choices[0], units, attacker_loc, defender_loc, prev_def); - const attack_type *def_weapon = *defender_weapon >= 0 ? &defender.attacks()[*defender_weapon] : NULL; + const attack_type *def_weapon = *defender_weapon >= 0 ? &defender.attacks()[*defender_weapon] : nullptr; attacker_stats_ = new battle_context_unit_stats(attacker, attacker_loc, choices[0], true, defender, defender_loc, def_weapon, units); if (attacker_stats_->disable) { delete attacker_stats_; - attacker_stats_ = NULL; + attacker_stats_ = nullptr; return -1; } const attack_type &att = attacker.attacks()[choices[0]]; @@ -506,8 +506,8 @@ int battle_context::choose_attacker_weapon(const unit &attacker, } // Multiple options: simulate them, save best. - battle_context_unit_stats *best_att_stats = NULL, *best_def_stats = NULL; - combatant *best_att_comb = NULL, *best_def_comb = NULL; + battle_context_unit_stats *best_att_stats = nullptr, *best_def_stats = nullptr; + combatant *best_att_comb = nullptr, *best_def_comb = nullptr; for (i = 0; i < choices.size(); ++i) { const attack_type &att = attacker.attacks()[choices[i]]; @@ -515,7 +515,7 @@ int battle_context::choose_attacker_weapon(const unit &attacker, attacker_loc, defender_loc, prev_def); // If that didn't simulate, do so now. if (!attacker_combatant_) { - const attack_type *def = NULL; + const attack_type *def = nullptr; if (def_weapon >= 0) { def = &defender.attacks()[def_weapon]; } @@ -523,7 +523,7 @@ int battle_context::choose_attacker_weapon(const unit &attacker, true, defender, defender_loc, def, units); if (attacker_stats_->disable) { delete attacker_stats_; - attacker_stats_ = NULL; + attacker_stats_ = nullptr; continue; } defender_stats_ = new battle_context_unit_stats(defender, defender_loc, def_weapon, false, @@ -548,10 +548,10 @@ int battle_context::choose_attacker_weapon(const unit &attacker, delete attacker_stats_; delete defender_stats_; } - attacker_combatant_ = NULL; - defender_combatant_ = NULL; - attacker_stats_ = NULL; - defender_stats_ = NULL; + attacker_combatant_ = nullptr; + defender_combatant_ = nullptr; + attacker_stats_ = nullptr; + defender_stats_ = nullptr; } attacker_combatant_ = best_att_comb; @@ -792,9 +792,9 @@ namespace { attack::attack(const map_location &attacker, const map_location &defender, int attack_with, int defend_with, bool update_display) : - bc_(NULL), - a_stats_(NULL), - d_stats_(NULL), + bc_(nullptr), + a_stats_(nullptr), + d_stats_(nullptr), abs_n_attack_(0), abs_n_defend_(0), update_att_fog_(false), @@ -821,10 +821,10 @@ namespace { config ev_data; config& a_weapon_cfg = ev_data.add_child("first"); config& d_weapon_cfg = ev_data.add_child("second"); - if(a_stats_->weapon != NULL && a_.valid()) { + if(a_stats_->weapon != nullptr && a_.valid()) { a_stats_->weapon->write(a_weapon_cfg); } - if(d_stats_->weapon != NULL && d_.valid()) { + if(d_stats_->weapon != nullptr && d_.valid()) { d_stats_->weapon->write(d_weapon_cfg); } if(a_weapon_cfg["name"].empty()) { @@ -869,11 +869,11 @@ namespace { // Fix pointer to weapons const_cast(a_stats_)->weapon = a_.valid() && a_.weapon_ >= 0 - ? &a_.get_unit().attacks()[a_.weapon_] : NULL; + ? &a_.get_unit().attacks()[a_.weapon_] : nullptr; const_cast(d_stats_)->weapon = d_.valid() && d_.weapon_ >= 0 - ? &d_.get_unit().attacks()[d_.weapon_] : NULL; + ? &d_.get_unit().attacks()[d_.weapon_] : nullptr; return; } @@ -1119,7 +1119,7 @@ namespace { if (!attacker.valid()) { unit_display::unit_die(defender.loc_, defender.get_unit(), - NULL, defender_stats->weapon); + nullptr, defender_stats->weapon); } else { unit_display::unit_die(defender.loc_, defender.get_unit(), attacker_stats->weapon, defender_stats->weapon, @@ -1310,8 +1310,8 @@ namespace { u.set_experience(u.experience() + d_.xp_); } - unit_display::unit_sheath_weapon(a_.loc_,a_.valid()?&a_.get_unit():NULL,a_stats_->weapon, - d_stats_->weapon,d_.loc_,d_.valid()?&d_.get_unit():NULL); + unit_display::unit_sheath_weapon(a_.loc_,a_.valid()?&a_.get_unit():nullptr,a_stats_->weapon, + d_stats_->weapon,d_.loc_,d_.valid()?&d_.get_unit():nullptr); if (update_display_){ resources::screen->invalidate_unit(); @@ -1427,7 +1427,7 @@ namespace //if ai_advancement_ is the default advancement the following code will //have no effect because get_advancements returns an empty list. - if(ai_advancement_ != NULL) + if(ai_advancement_ != nullptr) { unit_map::iterator u = resources::units->find(loc_); const std::vector& options = u->advances_to(); @@ -1604,7 +1604,7 @@ void advance_unit(map_location loc, const std::string &advance_to, std::vector not_seeing = actions::get_sides_not_seeing(*u); // Create the advanced unit. - bool use_amla = mod_option != NULL; + bool use_amla = mod_option != nullptr; unit_ptr new_unit = use_amla ? get_amla_unit(*u, *mod_option) : get_advanced_unit(*u, advance_to); if ( !use_amla ) diff --git a/src/actions/attack.hpp b/src/actions/attack.hpp index 150263ca9ed3..7010ff7e2aea 100644 --- a/src/actions/attack.hpp +++ b/src/actions/attack.hpp @@ -48,7 +48,7 @@ inline unsigned swarm_blows(unsigned min_blows, unsigned max_blows, unsigned hp, /** Structure describing the statistics of a unit involved in the battle. */ struct battle_context_unit_stats { - const attack_type *weapon; /**< The weapon used by the unit to attack the opponent, or NULL if there is none. */ + const attack_type *weapon; /**< The weapon used by the unit to attack the opponent, or nullptr if there is none. */ int attack_num; /**< Index into unit->attacks() or -1 for none. */ bool is_attacker; /**< True if the unit is the attacker. */ bool is_poisoned; /**< True if the unit is poisoned at the beginning of the battle. */ @@ -109,7 +109,7 @@ struct battle_context_unit_stats battle_context_unit_stats(int dmg, int blows, int hitpoints, int maximum_hp, int hit_chance, bool drain, bool slows, bool slowed, bool berserk, bool first, bool do_swarm) : - weapon(NULL), attack_num(0), is_attacker(true), // These are not used in attack prediction. + weapon(nullptr), attack_num(0), is_attacker(true), // These are not used in attack prediction. is_poisoned(false), is_slowed(slowed), slows(slows), drains(drain), petrifies(false), plagues(false), poisons(false), backstab_pos(false), swarm(do_swarm), firststrike(first), disable(false), @@ -145,8 +145,8 @@ class battle_context battle_context(const unit_map &units, const map_location& attacker_loc, const map_location& defender_loc, int attacker_weapon = -1, int defender_weapon = -1, - double aggression = 0.0, const combatant *prev_def = NULL, - const unit* attacker_ptr=NULL); + double aggression = 0.0, const combatant *prev_def = nullptr, + const unit* attacker_ptr=nullptr); /** Used by the AI which caches battle_context_unit_stats */ battle_context(const battle_context_unit_stats &att, const battle_context_unit_stats &def); @@ -163,8 +163,8 @@ class battle_context const battle_context_unit_stats& get_defender_stats() const { return *defender_stats_; } /** Get the simulation results. */ - const combatant &get_attacker_combatant(const combatant *prev_def = NULL); - const combatant &get_defender_combatant(const combatant *prev_def = NULL); + const combatant &get_attacker_combatant(const combatant *prev_def = nullptr); + const combatant &get_defender_combatant(const combatant *prev_def = nullptr); /** Given this harm_weight, is this attack better than that? */ bool better_attack(class battle_context &that, double harm_weight); @@ -213,7 +213,7 @@ void attack_unit_and_advance(const map_location &attacker, const map_location &d */ struct advance_unit_params { - advance_unit_params(const map_location& loc) : loc_(loc), ai_advancements_(NULL), force_dialog_(false), fire_events_(true), animate_(true) {} + advance_unit_params(const map_location& loc) : loc_(loc), ai_advancements_(nullptr), force_dialog_(false), fire_events_(true), animate_(true) {} advance_unit_params& ai_advancements(const ai::unit_advancements_aspect& value) {ai_advancements_ = &value; return *this;} advance_unit_params& force_dialog(bool value) {force_dialog_ = value; return *this;} advance_unit_params& fire_events(bool value) {fire_events_ = value; return *this;} @@ -245,17 +245,17 @@ unit_ptr get_amla_unit(const unit &u, const config &mod_option); * that we're going to delete, since deletion would invalidate the reference. */ void advance_unit(map_location loc, const std::string &advance_to, - const bool &fire_event = true, const config * mod_option = NULL); + const bool &fire_event = true, const config * mod_option = nullptr); /** * function which tests if the unit at loc is currently affected by leadership. * (i.e. has a higher-level 'leadership' unit next to it). * If it does, then the location of the leader unit will be returned, * Otherwise map_location::null_location() will be returned. - * If 'bonus' is not NULL, the % bonus will be stored in it. + * If 'bonus' is not nullptr, the % bonus will be stored in it. */ map_location under_leadership(const unit_map& units, const map_location& loc, - int* bonus=NULL); + int* bonus=nullptr); /** * Returns the amount that a unit's damage should be multiplied by diff --git a/src/actions/create.cpp b/src/actions/create.cpp index b53c411259e0..aad3e4304462 100644 --- a/src/actions/create.cpp +++ b/src/actions/create.cpp @@ -133,7 +133,7 @@ namespace { // Helpers for get_recalls() */ void add_leader_filtered_recalls(const unit_const_ptr leader, std::vector< unit_const_ptr > & result, - std::set * already_added = NULL) + std::set * already_added = nullptr) { const team& leader_team = (*resources::teams)[leader->side()-1]; const std::string& save_id = leader_team.save_id(); @@ -153,7 +153,7 @@ namespace { // Helpers for get_recalls() if ( ufilt(recall_unit, map_location::null_location()) ) { result.push_back(recall_unit_ptr); - if ( already_added != NULL ) + if ( already_added != nullptr ) already_added->insert(underlying_id); } } @@ -659,7 +659,7 @@ place_recruit_result place_recruit(unit_ptr u, const map_location &recruit_locat } // Make sure the unit appears (if either !show or the animation is suppressed). new_unit_itor->set_hidden(false); - if ( resources::screen != NULL ) { + if ( resources::screen != nullptr ) { resources::screen->invalidate(current_loc); resources::screen->redraw_minimap(); } @@ -720,7 +720,7 @@ void recruit_unit(const unit_type & u_type, int side_num, const map_location & l } // Update the screen. - if ( resources::screen != NULL ) + if ( resources::screen != nullptr ) resources::screen->invalidate_game_status(); // Other updates were done by place_recruit(). } @@ -767,7 +767,7 @@ bool recall_unit(const std::string & id, team & current_team, } // Update the screen. - if ( resources::screen != NULL ) + if ( resources::screen != nullptr ) resources::screen->invalidate_game_status(); // Other updates were done by place_recruit(). diff --git a/src/actions/move.cpp b/src/actions/move.cpp index f47d62419095..78365cba4c49 100644 --- a/src/actions/move.cpp +++ b/src/actions/move.cpp @@ -141,7 +141,7 @@ void move_unit_spectator::set_unit(const unit_map::const_iterator &u) bool get_village(const map_location& loc, int side, bool *action_timebonus, bool fire_event) { std::vector &teams = *resources::teams; - team *t = unsigned(side - 1) < teams.size() ? &teams[side - 1] : NULL; + team *t = unsigned(side - 1) < teams.size() ? &teams[side - 1] : nullptr; if (t && t->owns_village(loc)) { return false; } @@ -174,10 +174,10 @@ bool get_village(const map_location& loc, int side, bool *action_timebonus, bool } if(not_defeated) { - if (resources::screen != NULL) { + if (resources::screen != nullptr) { resources::screen->invalidate(loc); } - return t->get_village(loc, old_owner_side, fire_event ? resources::gamedata : NULL); + return t->get_village(loc, old_owner_side, fire_event ? resources::gamedata : nullptr); } return false; @@ -236,7 +236,7 @@ namespace { // Private helpers for move_unit() const route_iterator & current, const route_iterator & other); /// AI moves are supposed to not change the "goto" order. - bool is_ai_move() const { return spectator_ != NULL; } + bool is_ai_move() const { return spectator_ != nullptr; } /// Checks how far it appears we can move this turn. route_iterator plot_turn(const route_iterator & start, const route_iterator & stop); @@ -534,7 +534,7 @@ namespace { // Private helpers for move_unit() bool new_animation) { // Clear the fog. - if ( clearer_.clear_unit(hex, *move_it_, *current_team_, NULL, + if ( clearer_.clear_unit(hex, *move_it_, *current_team_, nullptr, &enemy_count_, &friend_count_, spectator_, !new_animation) ) { @@ -651,7 +651,7 @@ namespace { // Private helpers for move_unit() } // Update the shroud clearer. - clearer_.cache_units(current_uses_fog_ ? current_team_ : NULL); + clearer_.cache_units(current_uses_fog_ ? current_team_ : nullptr); // Abort for null routes. @@ -1274,14 +1274,14 @@ size_t move_unit_from_replay(const std::vector &steps, bool continued_move,bool skip_ally_sighted, bool show_move) { // Evaluate this move. - unit_mover mover(steps, NULL, continued_move,skip_ally_sighted); + unit_mover mover(steps, nullptr, continued_move,skip_ally_sighted); if ( !mover.check_expected_movement() ) { replay::process_error("found corrupt movement in replay."); return 0; } - return move_unit_internal(undo_stack, show_move, NULL, mover); + return move_unit_internal(undo_stack, show_move, nullptr, mover); } diff --git a/src/actions/move.hpp b/src/actions/move.hpp index 565bb822c66c..cc4ad2cee5e4 100644 --- a/src/actions/move.hpp +++ b/src/actions/move.hpp @@ -97,7 +97,7 @@ class move_unit_spectator { * Returns true if getting the village triggered a mutating event. * side can be 0 to make teh village uncaptured. */ -bool get_village(const map_location& loc, int side, bool *time_bonus = NULL, bool fire_event = true); +bool get_village(const map_location& loc, int side, bool *time_bonus = nullptr, bool fire_event = true); /// Moves a unit across the board. /// And enters the synced context. @@ -105,8 +105,8 @@ size_t move_unit_and_record(const std::vector &steps, undo_list* undo_stack, bool continued_move = false, bool show_move = true, - bool* interrupted = NULL, - move_unit_spectator* move_spectator = NULL); + bool* interrupted = nullptr, + move_unit_spectator* move_spectator = nullptr); /// Moves a unit across the board. /// to be called from replay when we are already in the synced context. diff --git a/src/actions/shroud_clearing_action.cpp b/src/actions/shroud_clearing_action.cpp index b4aea3734400..3473a319459c 100644 --- a/src/actions/shroud_clearing_action.cpp +++ b/src/actions/shroud_clearing_action.cpp @@ -15,7 +15,7 @@ void shroud_clearing_action::return_village() team ¤t_team = resources::controller->current_team(); const map_location back = route.back(); if(resources::gameboard->map().is_village(back)) { - get_village(back, original_village_owner, NULL, false); + get_village(back, original_village_owner, nullptr, false); //MP_COUNTDOWN take away capture bonus if(take_village_timebonus) { current_team.set_action_bonus_count(current_team.action_bonus_count() - 1); @@ -27,7 +27,7 @@ void shroud_clearing_action::take_village() team ¤t_team = resources::controller->current_team(); const map_location back = route.back(); if(resources::gameboard->map().is_village(back)) { - get_village(back, current_team.side(), NULL, false); + get_village(back, current_team.side(), nullptr, false); //MP_COUNTDOWN restore capture bonus if(take_village_timebonus) { current_team.set_action_bonus_count(1 + current_team.action_bonus_count()); diff --git a/src/actions/undo.cpp b/src/actions/undo.cpp index ab98c37ecef9..0beb25327790 100644 --- a/src/actions/undo.cpp +++ b/src/actions/undo.cpp @@ -61,7 +61,6 @@ #include #include // for shared_ptr #include // for assert -#include // for NULL #include // for operator<<, basic_ostream, etc #include // for set @@ -76,12 +75,12 @@ namespace actions { /** * Creates an undo_action based on a config. - * @return a pointer that must be deleted, or NULL if the @a cfg could not be parsed. + * @return a pointer that must be deleted, or nullptr if the @a cfg could not be parsed. */ undo_action_base * undo_list::create_action(const config & cfg) { const std::string str = cfg["type"]; - undo_action_base * res = NULL; + undo_action_base * res = nullptr; // The general division of labor in this function is that the various // constructors will parse the "unit" child config, while this function // parses everything else. @@ -101,13 +100,13 @@ undo_action_base * undo_list::create_action(const config & cfg) // Bad data. ERR_NG << "Invalid recruit found in [undo] or [redo]; unit type '" << child["type"] << "' was not found.\n"; - return NULL; + return nullptr; } - res = new undo::recruit_action(cfg, *u_type, map_location(cfg.child_or_empty("leader"), NULL)); + res = new undo::recruit_action(cfg, *u_type, map_location(cfg.child_or_empty("leader"), nullptr)); } else if ( str == "recall" ) - res = new undo::recall_action(cfg, map_location(cfg.child_or_empty("leader"), NULL)); + res = new undo::recall_action(cfg, map_location(cfg.child_or_empty("leader"), nullptr)); else if ( str == "dismiss" ) res = new undo::dismiss_action(cfg, cfg.child("unit")); @@ -121,7 +120,7 @@ undo_action_base * undo_list::create_action(const config & cfg) { // Unrecognized type. ERR_NG << "Unrecognized undo action type: " << str << "." << std::endl; - return NULL; + return nullptr; } return res; } diff --git a/src/actions/undo_action.hpp b/src/actions/undo_action.hpp index 34e5a10ac71d..8917bd21b8b3 100644 --- a/src/actions/undo_action.hpp +++ b/src/actions/undo_action.hpp @@ -19,7 +19,7 @@ namespace actions { struct undo_action_base : boost::noncopyable { /// Default constructor. - /// This is the only way to get NULL view_info. + /// This is the only way to get nullptr view_info. undo_action_base() { } // Virtual destructor to support derived classes. diff --git a/src/actions/unit_creator.cpp b/src/actions/unit_creator.cpp index eafcaeae940d..0a705a11c193 100644 --- a/src/actions/unit_creator.cpp +++ b/src/actions/unit_creator.cpp @@ -140,7 +140,7 @@ map_location unit_creator::find_location(const config &cfg, const unit* pass_che const bool pass((place == "leader_passable") || (place == "map_passable")); if ( place != "map_overwrite" ) { loc = find_vacant_tile(loc, pathfind::VACANT_ANY, - pass ? pass_check : NULL, NULL, board_); + pass ? pass_check : nullptr, nullptr, board_); } if(loc.valid() && board_->map().on_board(loc)) { return loc; @@ -205,7 +205,7 @@ void unit_creator::post_create(const map_location &loc, const unit &new_unit, bo preferences::encountered_units().insert(new_unit.type_id()); } - bool show = show_ && (resources::screen !=NULL) && !resources::screen->fogged(loc); + bool show = show_ && (resources::screen !=nullptr) && !resources::screen->fogged(loc); bool animate = show && anim; if (get_village_) { @@ -216,11 +216,11 @@ void unit_creator::post_create(const map_location &loc, const unit &new_unit, bo } // Only fire the events if it's safe; it's not if we're in the middle of play_controller::reset_gamestate() - if (resources::lua_kernel != NULL) { + if (resources::lua_kernel != nullptr) { resources::game_events->pump().fire("unit placed", loc); } - if (resources::screen!=NULL) { + if (resources::screen!=nullptr) { if (invalidate_ ) { resources::screen->invalidate(loc); diff --git a/src/actions/unit_creator.hpp b/src/actions/unit_creator.hpp index e2c7e0ee8261..ddcfd84208de 100644 --- a/src/actions/unit_creator.hpp +++ b/src/actions/unit_creator.hpp @@ -31,7 +31,7 @@ class unit; class unit_creator { public: - unit_creator(team &tm, const map_location &start_pos, game_board* board = NULL); + unit_creator(team &tm, const map_location &start_pos, game_board* board = nullptr); unit_creator& allow_show(bool b); unit_creator& allow_get_village(bool b); unit_creator& allow_rename_side(bool b); @@ -44,13 +44,13 @@ class unit_creator * @retval map_location::null_location() if unit is to be put into recall list * @retval valid on-board map location otherwise */ - map_location find_location(const config &cfg, const unit* pass_check=NULL); + map_location find_location(const config &cfg, const unit* pass_check=nullptr); /** * adds a unit on map without firing any events (so, usable during team construction in gamestatus) */ - void add_unit(const config &cfg, const vconfig* vcfg = NULL); + void add_unit(const config &cfg, const vconfig* vcfg = nullptr); private: void post_create(const map_location &loc, const unit &new_unit, bool anim); diff --git a/src/actions/vision.cpp b/src/actions/vision.cpp index b25807b8638d..7842da7c2d81 100644 --- a/src/actions/vision.cpp +++ b/src/actions/vision.cpp @@ -75,15 +75,15 @@ static void create_jamming_map(std::map & jamming, * Determines if @a loc is within @a viewer's visual range. * This is a moderately expensive function (vision is recalculated * with each call), so avoid using it heavily. - * If @a jamming is left as NULL, the jamming map is also calculated + * If @a jamming is left as nullptr, the jamming map is also calculated * with each invocation. */ static bool can_see(const unit & viewer, const map_location & loc, - const std::map * jamming = NULL) + const std::map * jamming = nullptr) { // Make sure we have a "jamming" map. std::map local_jamming; - if ( jamming == NULL ) { + if ( jamming == nullptr ) { create_jamming_map(local_jamming, (*resources::teams)[viewer.side()-1]); jamming = &local_jamming; } @@ -169,7 +169,7 @@ inline void shroud_clearer::record_sighting( /** * Default constructor. */ -shroud_clearer::shroud_clearer() : jamming_(), sightings_(), view_team_(NULL) +shroud_clearer::shroud_clearer() : jamming_(), sightings_(), view_team_(nullptr) {} @@ -189,7 +189,7 @@ shroud_clearer::~shroud_clearer() * Causes this object's "jamming" map to be recalculated. * This gets called as needed, and can also be manually invoked * via cache_units(). - * @param[in] new_team The team whose vision will be used. If NULL, the + * @param[in] new_team The team whose vision will be used. If nullptr, the * jamming map will be cleared. */ void shroud_clearer::calculate_jamming(const team * new_team) @@ -198,7 +198,7 @@ void shroud_clearer::calculate_jamming(const team * new_team) jamming_.clear(); view_team_ = new_team; - if ( view_team_ == NULL ) + if ( view_team_ == nullptr ) return; // Build the map. @@ -345,9 +345,9 @@ bool shroud_clearer::clear_unit(const map_location &view_loc, team &view_team, bool cleared_something = false; // Dummy variables to make some logic simpler. size_t enemies=0, friends=0; - if ( enemy_count == NULL ) + if ( enemy_count == nullptr ) enemy_count = &enemies; - if ( friend_count == NULL ) + if ( friend_count == nullptr ) friend_count = &friends; // Make sure the jamming map is up-to-date. @@ -441,7 +441,7 @@ bool shroud_clearer::clear_unit(const map_location &view_loc, team &view_team, return clear_unit(view_loc, view_team, viewer.underlying_id, viewer.sight_range, viewer.slowed, viewer.costs, - real_loc, NULL, NULL, NULL, NULL, instant); + real_loc, nullptr, nullptr, nullptr, nullptr, instant); } @@ -613,7 +613,7 @@ std::vector get_sides_not_seeing(const unit & target) /** * Fires sighted events for the sides that can see @a target. * If @a cache is supplied, only those sides might get events. - * If @a cache is NULL, all sides might get events. + * If @a cache is nullptr, all sides might get events. * This function is for the sighting *of* units that clear the shroud; it is * the complement of shroud_clearer::fire_events(), which handles sighting *by* * units that clear the shroud. @@ -638,8 +638,8 @@ bool actor_sighted(const unit & target, const std::vector * cache) const map_location & target_loc = target.get_location(); // Determine the teams that (probably) should get events. - std::vector needs_event(teams_size, cache == NULL); - if ( cache != NULL ) { + std::vector needs_event(teams_size, cache == nullptr); + if ( cache != nullptr ) { // Flag just the sides in the cache as needing events. BOOST_FOREACH (int side, *cache) needs_event[side-1] = true; @@ -657,7 +657,7 @@ bool actor_sighted(const unit & target, const std::vector * cache) create_jamming_map(jamming_cache[i], teams[i]); // Look for units that can be used as the second unit in sighted events. - std::vector second_units(teams_size, NULL); + std::vector second_units(teams_size, nullptr); std::vector distances(teams_size, UINT_MAX); BOOST_FOREACH (const unit & viewer, *resources::units) { const size_t index = viewer.side() - 1; @@ -683,7 +683,7 @@ bool actor_sighted(const unit & target, const std::vector * cache) // Raise events for the appropriate teams. const game_events::entity_location target_entity(target); for ( size_t i = 0; i != teams_size; ++i ) - if ( second_units[i] != NULL ) { + if ( second_units[i] != nullptr ) { resources::game_events->pump().raise(sighted_str, target_entity, game_events::entity_location(*second_units[i])); } diff --git a/src/actions/vision.hpp b/src/actions/vision.hpp index 52c0a6319550..1c95b903333d 100644 --- a/src/actions/vision.hpp +++ b/src/actions/vision.hpp @@ -64,9 +64,9 @@ class shroud_clearer : public boost::noncopyable { /// It can also be called if it is desirable to calculate the cache /// in advance of fog clearing. /// @param[in] new_team The team whose vision will be used. If left as - /// NULL, the cache will be just be cleared (to be + /// nullptr, the cache will be just be cleared (to be /// recalculated later as needed). - void cache_units(const team * new_team=NULL) { calculate_jamming(new_team); } + void cache_units(const team * new_team=nullptr) { calculate_jamming(new_team); } // cache_units() is currently a near-synonym for calculate_jamming(). The // reason for the two names is so the private function says what it does, // while the public one says why it might be invoked. @@ -77,22 +77,22 @@ class shroud_clearer : public boost::noncopyable { size_t viewer_id, int sight_range, bool slowed, const movetype::terrain_costs & costs, const map_location & real_loc, - const std::set* known_units = NULL, - size_t * enemy_count = NULL, size_t * friend_count = NULL, - move_unit_spectator * spectator = NULL, bool instant = true); + const std::set* known_units = nullptr, + size_t * enemy_count = nullptr, size_t * friend_count = nullptr, + move_unit_spectator * spectator = nullptr, bool instant = true); /// Clears shroud (and fog) around the provided location for @a view_team /// as if @a viewer was standing there. bool clear_unit(const map_location &view_loc, const unit &viewer, team &view_team, - const std::set* known_units = NULL, - size_t * enemy_count = NULL, size_t * friend_count = NULL, - move_unit_spectator * spectator = NULL, bool instant = true); + const std::set* known_units = nullptr, + size_t * enemy_count = nullptr, size_t * friend_count = nullptr, + move_unit_spectator * spectator = nullptr, bool instant = true); /// Clears shroud (and fog) around the provided location for @a view_team /// as if @a viewer was standing there. Setting @a instant to false /// allows some drawing delays that are used to make movement look better. bool clear_unit(const map_location &view_loc, const unit &viewer, team &view_team, bool instant) - { return clear_unit(view_loc, viewer, view_team, NULL, NULL, NULL, NULL, instant); } + { return clear_unit(view_loc, viewer, view_team, nullptr, nullptr, nullptr, nullptr, instant); } /// Clears shroud (and fog) around the provided location for @a view_team /// as if @a viewer was standing there. bool clear_unit(const map_location &view_loc, team &view_team, @@ -126,7 +126,7 @@ class shroud_clearer : public boost::noncopyable { bool clear_loc(team &tm, const map_location &loc, const map_location &view_loc, const map_location &event_non_loc, size_t viewer_id, bool check_units, size_t &enemy_count, size_t &friend_count, - move_unit_spectator * spectator = NULL); + move_unit_spectator * spectator = nullptr); /// Convenience wrapper for adding sighting data to the sightings_ vector. inline void record_sighting(const unit & seen, const map_location & seen_loc, @@ -143,7 +143,7 @@ class shroud_clearer : public boost::noncopyable { /// Returns the sides that cannot currently see @a target. std::vector get_sides_not_seeing(const unit & target); /// Fires sighted events for the sides that can see @a target. -bool actor_sighted(const unit & target, const std::vector * cache = NULL); +bool actor_sighted(const unit & target, const std::vector * cache = nullptr); /// Function that recalculates the fog of war. diff --git a/src/addon/client.cpp b/src/addon/client.cpp index cac7323f09d8..632d27e7cfba 100644 --- a/src/addon/client.cpp +++ b/src/addon/client.cpp @@ -37,8 +37,8 @@ addons_client::addons_client(CVideo& v, const std::string& address) , addr_(address) , host_() , port_() - , conn_(NULL) - , stat_(NULL) + , conn_(nullptr) + , stat_(nullptr) , last_error_() { const std::vector& address_components = @@ -272,8 +272,8 @@ bool addons_client::update_last_error(config& response_cfg) void addons_client::check_connected() const { - assert(conn_ != NULL); - if(conn_ == NULL) { + assert(conn_ != nullptr); + if(conn_ == nullptr) { ERR_ADDONS << "not connected to server" << std::endl; throw not_connected_to_server(); } diff --git a/src/addon/manager_ui.cpp b/src/addon/manager_ui.cpp index bfbfeabf4834..24a81ec53a38 100644 --- a/src/addon/manager_ui.cpp +++ b/src/addon/manager_ui.cpp @@ -248,7 +248,7 @@ addon_op_result do_resolve_addon_dependencies(CVideo& v, addons_client& client, addon_style.scale_images(font::relative_size(72), font::relative_size(72)); gui::menu* addon_menu = new gui::menu( v, options, false, -1, - gui::dialog::max_menu_width, NULL, &addon_style, false); + gui::dialog::max_menu_width, nullptr, &addon_style, false); dlg.set_menu(addon_menu); cursor_setter.reset(); @@ -431,7 +431,7 @@ class description_display_action : public gui::dialog_button_action virtual gui::dialog_button_action::RESULT button_pressed(int filter_choice) { - assert(filter_ != NULL); + assert(filter_ != nullptr); const int menu_selection = filter_->get_index(filter_choice); if(menu_selection < 0) { return gui::CONTINUE_DIALOG; } @@ -526,7 +526,7 @@ struct addon_pointer_list_sorter {} inline bool operator()(const addons_list::value_type* a, const addons_list::value_type* b) { - assert(a != NULL && b != NULL); + assert(a != nullptr && b != nullptr); if(dir_ == DIRECTION_DESCENDING) { const addons_list::value_type* c = a; diff --git a/src/ai/actions.cpp b/src/ai/actions.cpp index 8b702ce91c72..55fd2a42b459 100644 --- a/src/ai/actions.cpp +++ b/src/ai/actions.cpp @@ -340,16 +340,16 @@ const unit *move_result::get_unit() unit_map::const_iterator un = resources::units->find(from_); if (un==resources::units->end()){ set_error(E_NO_UNIT); - return NULL; + return nullptr; } const unit *u = &*un; if (u->side() != get_side()) { set_error(E_NOT_OWN_UNIT); - return NULL; + return nullptr; } if (u->incapacitated()) { set_error(E_INCAPACITATED_UNIT); - return NULL; + return nullptr; } return u; } @@ -469,10 +469,10 @@ void move_result::do_execute() if (from_ != to_) { size_t num_steps = ::actions::move_unit_and_record( /*std::vector steps*/ route_->steps, - /*::actions::undo_list* undo_stack*/ NULL, + /*::actions::undo_list* undo_stack*/ nullptr, /*bool continue_move*/ true, ///@todo 1.9 set to false after implemeting interrupt awareness /*bool show_move*/ preferences::show_ai_moves(), - /*bool* interrupted*/ NULL, + /*bool* interrupted*/ nullptr, /*::actions::move_unit_spectator* move_spectator*/ &move_spectator); if ( num_steps > 0 ) { @@ -688,7 +688,7 @@ const unit_type *recruit_result::get_unit_type_known(const std::string &recruit) const unit_type *type = unit_types.find(recruit); if (!type) { set_error(E_UNKNOWN_OR_DUMMY_UNIT_TYPE); - return NULL; + return nullptr; } return type; } @@ -791,7 +791,7 @@ void recruit_result::do_execute() // Assert that recruit_location_ has been validated. // This should be implied by is_success() once check_before() has been // called, so this is a guard against future breakage. - assert(location_checked_ && u != NULL); + assert(location_checked_ && u != nullptr); if(resources::simulation_){ bool gamestate_changed = simulated_recruit(get_side(), u, recruit_location_); @@ -831,16 +831,16 @@ const unit *stopunit_result::get_unit() unit_map::const_iterator un = resources::units->find(unit_location_); if (un==resources::units->end()){ set_error(E_NO_UNIT); - return NULL; + return nullptr; } const unit *u = &*un; if (u->side() != get_side()) { set_error(E_NOT_OWN_UNIT); - return NULL; + return nullptr; } if (u->incapacitated()) { set_error(E_INCAPACITATED_UNIT); - return NULL; + return nullptr; } return u; } diff --git a/src/ai/composite/aspect.hpp b/src/ai/composite/aspect.hpp index aca078dae0c6..c811f5184070 100644 --- a/src/ai/composite/aspect.hpp +++ b/src/ai/composite/aspect.hpp @@ -469,7 +469,7 @@ class aspect_factory{ static factory_map& get_list() { static factory_map *aspect_factories; - if (aspect_factories==NULL) { + if (aspect_factories==nullptr) { aspect_factories = new factory_map; } return *aspect_factories; @@ -515,7 +515,7 @@ class lua_aspect_factory{ static factory_map& get_list() { static factory_map *aspect_factories; - if (aspect_factories==NULL) { + if (aspect_factories==nullptr) { aspect_factories = new factory_map; } return *aspect_factories; diff --git a/src/ai/composite/component.cpp b/src/ai/composite/component.cpp index 95695c7c967f..52eda4a40164 100644 --- a/src/ai/composite/component.cpp +++ b/src/ai/composite/component.cpp @@ -76,7 +76,7 @@ component* component::get_child(const path_element &child) if (i!=property_handlers_.end()) { return i->second->handle_get(child); } - return NULL; + return nullptr; } @@ -138,8 +138,8 @@ property_handler_map& component::property_handlers() static component *find_component(component *root, const std::string &path, path_element &tail) { - if (root==NULL) { - return NULL; + if (root==nullptr) { + return nullptr; } //match path elements in [modify_ai] tag @@ -170,15 +170,15 @@ static component *find_component(component *root, const std::string &path, path_ elements.push_back(pe); } if (elements.size()<1) { - return NULL; + return nullptr; } std::vector< path_element >::iterator k_max = elements.end()-1; for (std::vector< path_element >::iterator k = elements.begin(); k!=k_max; ++k) { //not last c = c->get_child(*k); - if (c==NULL) { - return NULL; + if (c==nullptr) { + return nullptr; } } @@ -192,7 +192,7 @@ bool component_manager::add_component(component *root, const std::string &path, { path_element tail; component *c = find_component(root,path,tail); - if (c==NULL) { + if (c==nullptr) { return false; } const config &ch = cfg.child(tail.property); @@ -207,7 +207,7 @@ bool component_manager::change_component(component *root, const std::string &pat { path_element tail; component *c = find_component(root,path,tail); - if (c==NULL) { + if (c==nullptr) { return false; } const config &ch = cfg.child(tail.property); @@ -221,7 +221,7 @@ bool component_manager::delete_component(component *root, const std::string &pat { path_element tail; component *c = find_component(root,path,tail); - if (c==NULL) { + if (c==nullptr) { return false; } return c->delete_child(tail); @@ -254,7 +254,7 @@ std::string component_manager::print_component_tree(component *root, const std:: component *c; if (!path.empty()) { c = find_component(root,path,tail); - if (c==NULL) { + if (c==nullptr) { ERR_AI_COMPONENT << "unable to find component" <second; } - return NULL; + return nullptr; } bool handle_change(const path_element &child, config cfg) diff --git a/src/ai/composite/rca.hpp b/src/ai/composite/rca.hpp index 892328b9e2ef..3911afa5e066 100644 --- a/src/ai/composite/rca.hpp +++ b/src/ai/composite/rca.hpp @@ -158,7 +158,7 @@ class candidate_action_factory{ static factory_map& get_list() { static factory_map *candidate_action_factories; - if (candidate_action_factories==NULL) { + if (candidate_action_factories==nullptr) { candidate_action_factories = new factory_map; } return *candidate_action_factories; diff --git a/src/ai/composite/stage.hpp b/src/ai/composite/stage.hpp index d88b9270a4aa..4ba7c850ebf3 100644 --- a/src/ai/composite/stage.hpp +++ b/src/ai/composite/stage.hpp @@ -107,7 +107,7 @@ class stage_factory{ static factory_map& get_list() { static factory_map *stage_factories; - if (stage_factories==NULL) { + if (stage_factories==nullptr) { stage_factories = new factory_map; } return *stage_factories; diff --git a/src/ai/contexts.cpp b/src/ai/contexts.cpp index fdc403dacc0e..94ec86969cd0 100644 --- a/src/ai/contexts.cpp +++ b/src/ai/contexts.cpp @@ -62,7 +62,7 @@ #include // for intrusive_ptr #include // for dynamic_pointer_cast, etc #include // for sqrt -#include // for NULL, abs +#include // for abs #include // for time #include // for back_inserter #include // for operator<<, basic_ostream, etc @@ -346,7 +346,7 @@ const team& readonly_context_impl::current_team() const void readonly_context_impl::log_message(const std::string& msg) { if(game_config::debug) { - resources::screen->get_chat_manager().add_chat_message(time(NULL), "ai", get_side(), msg, + resources::screen->get_chat_manager().add_chat_message(time(nullptr), "ai", get_side(), msg, events::chat_handler::MESSAGE_PUBLIC, false); } } @@ -415,7 +415,7 @@ void readonly_context_impl::calculate_moves(const unit_map& units, std::mapto_config() == only_not_tag) { - remove_destinations = NULL; + remove_destinations = nullptr; } for(std::map::iterator m = res.begin(); m != res.end(); ++m) { @@ -424,7 +424,7 @@ void readonly_context_impl::calculate_moves(const unit_map& units, std::mapfirst; const map_location& dst = dest.curr; - if(remove_destinations != NULL && remove_destinations->match(dst)) { + if(remove_destinations != nullptr && remove_destinations->match(dst)) { continue; } @@ -956,7 +956,7 @@ const std::set& readonly_context_impl::keeps() const keeps_cache::keeps_cache() - : map_(NULL) + : map_(nullptr) , keeps_() { ai::manager::add_turn_started_observer(this); @@ -1040,14 +1040,14 @@ const map_location& readonly_context_impl::nearest_keep(const map_location& loc) return dummy; } - const map_location* res = NULL; + const map_location* res = nullptr; int closest = -1; for(std::set::const_iterator i = keeps.begin(); i != keeps.end(); ++i) { if (avoided_locations.find(*i)!=avoided_locations.end()) { continue; } const int distance = distance_between(*i,loc); - if(res == NULL || distance < closest) { + if(res == nullptr || distance < closest) { closest = distance; res = &*i; } diff --git a/src/ai/contexts.hpp b/src/ai/contexts.hpp index b614052b6a40..0aa14225a867 100644 --- a/src/ai/contexts.hpp +++ b/src/ai/contexts.hpp @@ -199,11 +199,11 @@ class readonly_context : public virtual side_context { virtual void calculate_possible_moves(std::map& possible_moves, move_map& srcdst, move_map& dstsrc, bool enemy, bool assume_full_movement=false, - const terrain_filter* remove_destinations=NULL) const = 0; + const terrain_filter* remove_destinations=nullptr) const = 0; virtual void calculate_moves(const unit_map& units, std::map& possible_moves, move_map& srcdst, move_map& dstsrc, bool enemy, bool assume_full_movement=false, - const terrain_filter* remove_destinations=NULL, + const terrain_filter* remove_destinations=nullptr, bool see_all=false) const = 0; virtual const game_info& get_info() const = 0; @@ -465,7 +465,7 @@ class readwrite_context : public virtual readonly_context { class side_context_proxy : public virtual side_context { public: side_context_proxy() - : target_(NULL) + : target_(nullptr) { } @@ -512,7 +512,7 @@ class side_context_proxy : public virtual side_context { class readonly_context_proxy : public virtual readonly_context, public virtual side_context_proxy { public: readonly_context_proxy() - : target_(NULL) + : target_(nullptr) { } @@ -588,7 +588,7 @@ class readonly_context_proxy : public virtual readonly_context, public virtual s virtual void calculate_possible_moves(std::map& possible_moves, move_map& srcdst, move_map& dstsrc, bool enemy, bool assume_full_movement=false, - const terrain_filter* remove_destinations=NULL) const + const terrain_filter* remove_destinations=nullptr) const { target_->calculate_possible_moves(possible_moves, srcdst, dstsrc, enemy, assume_full_movement, remove_destinations); } @@ -596,7 +596,7 @@ class readonly_context_proxy : public virtual readonly_context, public virtual s virtual void calculate_moves(const unit_map& units, std::map& possible_moves, move_map& srcdst, move_map& dstsrc, bool enemy, bool assume_full_movement=false, - const terrain_filter* remove_destinations=NULL, + const terrain_filter* remove_destinations=nullptr, bool see_all=false) const { target_->calculate_moves(units, possible_moves, srcdst, dstsrc, enemy, assume_full_movement, remove_destinations, see_all); @@ -1006,7 +1006,7 @@ class readonly_context_proxy : public virtual readonly_context, public virtual s class readwrite_context_proxy : public virtual readwrite_context, public virtual readonly_context_proxy { public: readwrite_context_proxy() - : target_(NULL) + : target_(nullptr) { } @@ -1280,7 +1280,7 @@ class readonly_context_impl : public virtual side_context_proxy, public readonly void calculate_possible_moves(std::map& possible_moves, move_map& srcdst, move_map& dstsrc, bool enemy, bool assume_full_movement=false, - const terrain_filter* remove_destinations=NULL) const; + const terrain_filter* remove_destinations=nullptr) const; /** * A more fundamental version of calculate_possible_moves which allows the @@ -1292,7 +1292,7 @@ class readonly_context_impl : public virtual side_context_proxy, public readonly void calculate_moves(const unit_map& units, std::map& possible_moves, move_map& srcdst, move_map& dstsrc, bool enemy, bool assume_full_movement=false, - const terrain_filter* remove_destinations=NULL, + const terrain_filter* remove_destinations=nullptr, bool see_all=false) const; diff --git a/src/ai/default/attack.cpp b/src/ai/default/attack.cpp index d7b4b46ee7f8..644dcac863e3 100644 --- a/src/ai/default/attack.cpp +++ b/src/ai/default/attack.cpp @@ -93,8 +93,8 @@ void attack_analysis::analyze(const gamemap& map, unit_map& units, assert(!movements.empty()); std::vector >::const_iterator m; - battle_context *prev_bc = NULL; - const combatant *prev_def = NULL; + battle_context *prev_bc = nullptr; + const combatant *prev_def = nullptr; for (m = movements.begin(); m != movements.end(); ++m) { // We fix up units map to reflect what this would look like. @@ -340,7 +340,7 @@ variant attack_analysis::get_value(const std::string& key) const } else if(key == "movements") { std::vector res; for(size_t n = 0; n != movements.size(); ++n) { - map_formula_callable* item = new map_formula_callable(NULL); + map_formula_callable* item = new map_formula_callable(nullptr); item->add("src", variant(new location_callable(movements[n].first))); item->add("dst", variant(new location_callable(movements[n].second))); res.push_back(variant(item)); diff --git a/src/ai/default/ca.cpp b/src/ai/default/ca.cpp index 2ef74dea9072..d4a51dce2560 100644 --- a/src/ai/default/ca.cpp +++ b/src/ai/default/ca.cpp @@ -386,7 +386,7 @@ double move_leader_to_keep_phase::evaluate() } // 2. + 3. - const unit* best_leader = NULL; + const unit* best_leader = nullptr; map_location best_keep; int shortest_distance = 99999; @@ -422,7 +422,7 @@ double move_leader_to_keep_phase::evaluate() } } - if (best_leader == NULL) { + if (best_leader == nullptr) { return BAD_SCORE; } diff --git a/src/ai/default/contexts.hpp b/src/ai/default/contexts.hpp index 1ecda91396a0..ffe3caa03814 100644 --- a/src/ai/default/contexts.hpp +++ b/src/ai/default/contexts.hpp @@ -195,7 +195,7 @@ class default_ai_context_proxy : public virtual default_ai_context, public virtu default_ai_context_proxy() - : target_(NULL) + : target_(nullptr) { } diff --git a/src/ai/default/recruitment.cpp b/src/ai/default/recruitment.cpp index 0a8781e8442c..4c5e5c92ce68 100644 --- a/src/ai/default/recruitment.cpp +++ b/src/ai/default/recruitment.cpp @@ -331,7 +331,7 @@ void recruitment::execute() { */ action_result_ptr action_result; - config* job = NULL; + config* job = nullptr; do { // Recruitment loop recruit_situation_change_observer_.reset_gamestate_changed(); @@ -471,7 +471,7 @@ action_result_ptr recruitment::execute_recruit(const std::string& type, data& le */ const std::string* recruitment::get_appropriate_recall(const std::string& type, const data& leader_data) const { - const std::string* best_recall_id = NULL; + const std::string* best_recall_id = nullptr; double best_recall_value = -1; BOOST_FOREACH(const unit_const_ptr & recall_unit, current_team().recall_list()) { if (type != recall_unit->type_id()) { @@ -533,7 +533,7 @@ data* recruitment::get_best_leader_from_ratio_scores(std::vector& leader_d std::random_shuffle(leader_data.begin(), leader_data.end()); // Find which leader should recruit according to ratio_scores. - data* best_leader_data = NULL; + data* best_leader_data = nullptr; double biggest_difference = -99999.; BOOST_FOREACH(data& data, leader_data) { if (!leader_matches_job(data, job)) { @@ -1024,12 +1024,12 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { /** * For Combat Analysis. * Returns the cached combat value for two unit types - * or NULL if there is none or terrain defenses are not within range. + * or nullptr if there is none or terrain defenses are not within range. */ const double* recruitment::get_cached_combat_value(const std::string& a, const std::string& b, double a_defense, double b_defense) { double best_distance = 999; - const double* best_value = NULL; + const double* best_value = nullptr; const std::set& cache = combat_cache_[a][b]; BOOST_FOREACH(const cached_combat_value& entry, cache) { double distance_a = std::abs(entry.a_defense - a_defense); @@ -1117,7 +1117,7 @@ void recruitment::simulate_attack( double attacker_defense, double defender_defense, double* damage_to_attacker, double* damage_to_defender) const { if(!attacker || !defender || !damage_to_attacker || !damage_to_defender) { - ERR_AI_RECRUITMENT << "NULL pointer in simulate_attack()" << std::endl; + ERR_AI_RECRUITMENT << "nullptr pointer in simulate_attack()" << std::endl; return; } const std::vector attacker_weapons = attacker->attacks(); @@ -1147,7 +1147,7 @@ void recruitment::simulate_attack( best_def_response.reset(new attack_simulation( attacker, defender, attacker_defense, defender_defense, - &att_weapon, NULL, average_lawful_bonus_)); + &att_weapon, nullptr, average_lawful_bonus_)); } if (!best_att_attack || best_def_response->better_result(best_att_attack.get(), false)) { best_att_attack = best_def_response; @@ -1167,7 +1167,7 @@ void recruitment::simulate_attack( * We call a [recruit] tag a "job". */ config* recruitment::get_most_important_job() { - config* most_important_job = NULL; + config* most_important_job = nullptr; int most_important_importance = -1; int biggest_number = -1; BOOST_FOREACH(config& job, recruitment_instructions_.child_range("recruit")) { diff --git a/src/ai/formula/ai.cpp b/src/ai/formula/ai.cpp index 1bcf1d9a95a9..61d7c2866e34 100644 --- a/src/ai/formula/ai.cpp +++ b/src/ai/formula/ai.cpp @@ -60,7 +60,7 @@ #include // for lexical_cast #include // for shared_ptr #include // for assert -#include // for NULL, time +#include // for time #include // for multimap<>::const_iterator, etc #include // for operator<<, basic_ostream, etc #include // for stack @@ -91,7 +91,7 @@ formula_ai::formula_ai(readonly_context &context, const config &cfg) : readonly_context_proxy(), game_logic::formula_callable(), - ai_ptr_(NULL), + ai_ptr_(nullptr), cfg_(cfg), recursion_counter_(context.get_recursion_count()), keeps_cache_(), @@ -126,7 +126,7 @@ void formula_ai::handle_exception(game_logic::formula_error& e, const std::strin void formula_ai::display_message(const std::string& msg) const { - resources::screen->get_chat_manager().add_chat_message(time(NULL), "wfl", get_side(), msg, + resources::screen->get_chat_manager().add_chat_message(time(nullptr), "wfl", get_side(), msg, events::chat_handler::MESSAGE_PUBLIC, false); } @@ -158,7 +158,7 @@ std::string formula_ai::evaluate(const std::string& formula_str) callable.add_ref(); //formula_debugger fdb; - const variant v = f.evaluate(callable,NULL); + const variant v = f.evaluate(callable,nullptr); if (ai_ptr_) { variant var = execute_variant(v, *ai_ptr_, true ); @@ -495,7 +495,7 @@ variant formula_ai::execute_variant(const variant& var, ai_context &ai_, bool co ERR_AI << "ERROR #" << 5001 << " while executing 'continue' formula keyword" << std::endl; if( safe_call ) - error = variant(new safe_call_result(NULL, 5001)); + error = variant(new safe_call_result(nullptr, 5001)); } } else if( action.is_string() && (action.as_string() == "end_turn" || action.as_string() == "end" ) ) { return variant(); @@ -553,7 +553,7 @@ void formula_ai::add_formula_function(const std::string& name, const_formula_ptr namespace { template variant villages_from_set(const Container& villages, - const std::set* exclude=NULL) { + const std::set* exclude=nullptr) { std::vector vars; BOOST_FOREACH(const map_location& loc, villages) { if(exclude && exclude->count(loc)) { diff --git a/src/ai/formula/callable_objects.cpp b/src/ai/formula/callable_objects.cpp index 15a031153a17..2e78d09283c5 100644 --- a/src/ai/formula/callable_objects.cpp +++ b/src/ai/formula/callable_objects.cpp @@ -50,7 +50,7 @@ void move_map_callable::get_inputs(std::vector* input int move_callable::do_compare(const formula_callable* callable) const { const move_callable* mv_callable = dynamic_cast(callable); - if(mv_callable == NULL) { + if(mv_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -67,7 +67,7 @@ int move_callable::do_compare(const formula_callable* callable) const int move_partial_callable::do_compare(const formula_callable* callable) const { const move_partial_callable* mv_callable = dynamic_cast(callable); - if(mv_callable == NULL) { + if(mv_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -115,7 +115,7 @@ void outcome_callable::get_inputs(std::vector* inputs attack_callable::attack_callable(const map_location& move_from, const map_location& src, const map_location& dst, int weapon) : move_from_(move_from), src_(src), dst_(dst), - bc_(*resources::units, src, dst, weapon, -1, 1.0, NULL, + bc_(*resources::units, src, dst, weapon, -1, 1.0, nullptr, &*resources::units->find(move_from)) { type_ = ATTACK_C; @@ -143,7 +143,7 @@ void attack_callable::get_inputs(std::vector* inputs) int attack_callable::do_compare(const game_logic::formula_callable* callable) const { const attack_callable* a_callable = dynamic_cast(callable); - if(a_callable == NULL) { + if(a_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -305,7 +305,7 @@ variant safe_call_result::get_value(const std::string& key) const { return variant(status_); if(key == "object") { - if( failed_callable_ != NULL) + if( failed_callable_ != nullptr) return variant(failed_callable_); else return variant(); diff --git a/src/ai/formula/candidates.cpp b/src/ai/formula/candidates.cpp index 996073b4a644..e79073a7416a 100644 --- a/src/ai/formula/candidates.cpp +++ b/src/ai/formula/candidates.cpp @@ -258,7 +258,7 @@ void attack_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units) for(variant_iterator i = filtered_my_units.begin() ; i != filtered_my_units.end() ; ++i) { const unit_callable* u_callable = dynamic_cast( (*i).as_callable() ); - if(u_callable == NULL) { + if(u_callable == nullptr) { ERR_AI << "ERROR in "<< get_name() << "Candidate Action: Filter formula returned table that does not contain units" << std::endl; return; } @@ -267,7 +267,7 @@ void attack_candidate_action::evaluate(ai::formula_ai* ai, unit_map& units) for(variant_iterator i = filtered_enemy_units.begin() ; i != filtered_enemy_units.end() ; ++i) { const unit_callable* u_callable = dynamic_cast( (*i).as_callable() ); - if(u_callable == NULL) { + if(u_callable == nullptr) { ERR_AI << "ERROR in "<< get_name() << "Candidate Action: Filter formula returned table that does not contain units" << std::endl; return; } diff --git a/src/ai/formula/engine_fai.cpp b/src/ai/formula/engine_fai.cpp index f36b66a301fd..ab2ba89eaa22 100644 --- a/src/ai/formula/engine_fai.cpp +++ b/src/ai/formula/engine_fai.cpp @@ -131,7 +131,7 @@ std::string engine_fai::evaluate(const std::string &str) void engine_fai::set_ai_context(ai_context *context) { - if (context!=NULL) { + if (context!=nullptr) { DBG_AI_ENGINE_FAI << "fai engine: ai_context is set" << std::endl; } else { DBG_AI_ENGINE_FAI << "fai engine: ai_context is cleared" << std::endl; diff --git a/src/ai/formula/function_table.cpp b/src/ai/formula/function_table.cpp index fef3bd3badad..1f81bfaec6c7 100644 --- a/src/ai/formula/function_table.cpp +++ b/src/ai/formula/function_table.cpp @@ -65,7 +65,7 @@ class unit_adapter { } int damage_from(const attack_type& attack) const { - if(unit_type_ != NULL) { + if(unit_type_ != nullptr) { return unit_type_->movement_type().resistance_against(attack); } else { return unit_->damage_from(attack, false, map_location()); @@ -75,7 +75,7 @@ class unit_adapter { // FIXME: we return a vector by value because unit_type and unit APIs // disagree as to what should be returned by their attacks() method std::vector attacks() const { - if(unit_type_ != NULL) { + if(unit_type_ != nullptr) { return unit_type_->attacks(); } else { return unit_->attacks(); @@ -83,7 +83,7 @@ class unit_adapter { } int movement_cost(const t_translation::t_terrain & terrain) const { - if(unit_type_ != NULL) { + if(unit_type_ != nullptr) { return unit_type_->movement_type().movement_cost(terrain); } else { return unit_->movement_cost(terrain); @@ -581,19 +581,19 @@ class timeofday_modifier_function : public function_expression { const unit_callable* u_call = try_convert_variant(u); - if (u_call == NULL) { + if (u_call == nullptr) { return variant(); } const unit& un = u_call->get_unit(); - map_location const* loc = NULL; + map_location const* loc = nullptr; if(args().size()==2) { loc = &convert_variant(args()[1]->evaluate(variables,add_debug_info(fdb,1,"timeofday_modifier:location")))->loc(); } - if (loc == NULL) { + if (loc == nullptr) { loc = &u_call->get_location(); } @@ -760,7 +760,7 @@ class calculate_outcome_function : public function_expression { } battle_context bc(units, convert_variant(args()[1]->evaluate(variables,add_debug_info(fdb,1,"calculate_outcome:attacker_attack_location")))->loc(), - defender_location, weapon, -1, 1.0, NULL, &*units.find(attacker_location)); + defender_location, weapon, -1, 1.0, nullptr, &*units.find(attacker_location)); std::vector hp_dist = bc.get_attacker_combatant().hp_dist; std::vector::iterator it = hp_dist.begin(); int i = 0; diff --git a/src/ai/lua/aspect_advancements.cpp b/src/ai/lua/aspect_advancements.cpp index 561625350e62..30719b09d794 100644 --- a/src/ai/lua/aspect_advancements.cpp +++ b/src/ai/lua/aspect_advancements.cpp @@ -23,7 +23,6 @@ #include "units/unit.hpp" #include "units/map.hpp" // for unit_map::const_iterator, etc -#include // for NULL #include // for operator<<, basic_ostream, etc #include // for string, char_traits, etc #include // for vector @@ -82,7 +81,7 @@ const std::vector unit_advancements_aspect::get_advancements(const LOG_LUA << "Entering unit_advancements_aspect::get_advancements() in instance " << this << " with unit " << unit_id << " on (x,y) = (" << unit_x << ", " << unit_y << ")\n"; - if(L_ == NULL || ref_ == LUA_REFNIL) + if(L_ == nullptr || ref_ == LUA_REFNIL) { //If we end up here, most likely the aspect don't use the lua-engine. //Just to make sure: diff --git a/src/ai/lua/core.cpp b/src/ai/lua/core.cpp index 5d327356510d..2380ce1430ac 100644 --- a/src/ai/lua/core.cpp +++ b/src/ai/lua/core.cpp @@ -165,7 +165,7 @@ static int cfun_ai_get_suitable_keep(lua_State *L) int index = 1; ai::readonly_context &context = get_readonly_context(L); - unit* leader = NULL; + unit* leader = nullptr; if (lua_isuserdata(L, index)) { leader = luaW_tounit(L, index); @@ -820,7 +820,7 @@ static int impl_ai_aspect_get(lua_State* L) (void) aspect; } else if(typesafe_aspect* aspect = try_aspect_as(iter->second)) { const unit_advancements_aspect& val = aspect->get(); - int my_side = luaW_getglobal(L, "ai", "side", NULL) - 1; + int my_side = luaW_getglobal(L, "ai", "side", nullptr) - 1; lua_newtable(L); for (unit_map::const_iterator u = resources::units->begin(); u != resources::units->end(); ++u) { if (!u.valid() || u->side() != my_side) { @@ -911,7 +911,7 @@ static int impl_ai_get(lua_State* L) { "check_recruit", &cfun_ai_check_recruit }, //{ "",}, //{ "",}, - { NULL, NULL } }; + { nullptr, nullptr } }; for (const luaL_Reg* p = callbacks; p->name; ++p) { if(m == p->name) { lua_pushlightuserdata(L, &engine); // [-1: engine ...] @@ -940,7 +940,7 @@ static int impl_ai_get(lua_State* L) { "stopunit_attacks", &cfun_ai_execute_stopunit_attacks }, { "stopunit_moves", &cfun_ai_execute_stopunit_moves }, { "synced_command", &cfun_ai_execute_synced_command }, - { NULL, NULL } }; + { nullptr, nullptr } }; for (const luaL_Reg* p = mutating_callbacks; p->name; ++p) { if(m == p->name) { lua_pushlightuserdata(L, &engine); @@ -985,7 +985,7 @@ lua_ai_context* lua_ai_context::create(lua_State *L, char const *code, ai::engin char const *m = lua_tostring(L, -1); ERR_LUA << "error while initializing ai: " <set_persistent_data(data); lua_ai_context_->set_arguments(args); lua_ai_context_->update_state(); diff --git a/src/ai/lua/lua_object.cpp b/src/ai/lua/lua_object.cpp index f2014b2d9a29..554c63d9db7f 100644 --- a/src/ai/lua/lua_object.cpp +++ b/src/ai/lua/lua_object.cpp @@ -42,7 +42,7 @@ namespace ai { boost::shared_ptr lua_object::to_type(lua_State *L, int n) { boost::shared_ptr att(new aspect_attacks_lua_filter); - att->lua = NULL; + att->lua = nullptr; att->ref_own_ = att->ref_enemy_ = -1; if(!lua_istable(L, n)) { return att; diff --git a/src/ai/manager.cpp b/src/ai/manager.cpp index 4260fca224f8..111a012b4a63 100644 --- a/src/ai/manager.cpp +++ b/src/ai/manager.cpp @@ -47,7 +47,6 @@ #include // for min #include // for auto_any_base, etc #include // for assert -#include // for NULL #include // for reverse_iterator, etc #include // for _Rb_tree_iterator, etc #include // for operator<<, basic_ostream, etc @@ -79,7 +78,7 @@ static lg::log_domain log_ai_mod("ai/mod"); #define ERR_AI_MOD LOG_STREAM(err, log_ai_mod) holder::holder( side_number side, const config &cfg ) - : ai_(), side_context_(NULL), readonly_context_(NULL), readwrite_context_(NULL), default_ai_context_(NULL), side_(side), cfg_(cfg) + : ai_(), side_context_(nullptr), readonly_context_(nullptr), readwrite_context_(nullptr), default_ai_context_(nullptr), side_(side), cfg_(cfg) { DBG_AI_MANAGER << describe_ai() << "Preparing new AI holder" << std::endl; } @@ -87,19 +86,19 @@ holder::holder( side_number side, const config &cfg ) void holder::init( side_number side ) { - if (side_context_ == NULL) { + if (side_context_ == nullptr) { side_context_ = new side_context_impl(side,cfg_); } else { side_context_->set_side(side); } - if (readonly_context_ == NULL){ + if (readonly_context_ == nullptr){ readonly_context_ = new readonly_context_impl(*side_context_,cfg_); readonly_context_->on_readonly_context_create(); } - if (readwrite_context_ == NULL){ + if (readwrite_context_ == nullptr){ readwrite_context_ = new readwrite_context_impl(*readonly_context_,cfg_); } - if (default_ai_context_ == NULL){ + if (default_ai_context_ == nullptr){ default_ai_context_ = new default_ai_context_impl(*readwrite_context_,cfg_); } if (!this->ai_){ @@ -163,7 +162,7 @@ void holder::modify_side_ai_config(config cfg) DBG_AI_MANAGER << "after transforming [modify_side][ai] into new syntax, config contains:"<< std::endl << cfg << std::endl; // TODO: Also add [goal] tags. And what about [stage] or [engine] tags? (Maybe they're not important.) - if (this->readonly_context_ == NULL) { + if (this->readonly_context_ == nullptr) { // if not initialized, append that config to the bottom of base cfg // then, merge aspects with the same id cfg_.merge_with(cfg); @@ -221,16 +220,16 @@ config holder::to_config() const } else { config cfg = ai_->to_config(); cfg["version"] = "10703"; - if (this->side_context_!=NULL) { + if (this->side_context_!=nullptr) { cfg.merge_with(this->side_context_->to_side_context_config()); } - if (this->readonly_context_!=NULL) { + if (this->readonly_context_!=nullptr) { cfg.merge_with(this->readonly_context_->to_readonly_context_config()); } - if (this->readwrite_context_!=NULL) { + if (this->readwrite_context_!=nullptr) { cfg.merge_with(this->readwrite_context_->to_readwrite_context_config()); } - if (this->default_ai_context_!=NULL) { + if (this->default_ai_context_!=nullptr) { cfg.merge_with(this->default_ai_context_->to_default_ai_context_config()); } @@ -244,7 +243,7 @@ const std::string holder::describe_ai() { std::string sidestr = std::to_string(this->side_); - if (this->ai_!=NULL) { + if (this->ai_!=nullptr) { return this->ai_->describe_self()+std::string(" for side ")+sidestr+std::string(" : "); } else { return std::string("not initialized ai with id=[")+cfg_["id"]+std::string("] for side ")+sidestr+std::string(" : "); @@ -304,10 +303,10 @@ const std::string holder::get_ai_identifier() const component* holder::get_component(component *root, const std::string &path) { if (!game_config::debug) // Debug guard { - return NULL; + return nullptr; } - if (root == NULL) // Return root component(ai_) + if (root == nullptr) // Return root component(ai_) { if (!this->ai_) { this->init(this->side_); @@ -340,7 +339,7 @@ int manager::num_interact_ = 0; void manager::set_ai_info(const game_info& i) { - if (ai_info_!=NULL){ + if (ai_info_!=nullptr){ clear_ai_info(); } ai_info_ = new game_info(i); @@ -350,7 +349,7 @@ void manager::set_ai_info(const game_info& i) void manager::clear_ai_info(){ delete ai_info_; - ai_info_ = NULL; + ai_info_ = nullptr; } @@ -723,7 +722,7 @@ void manager::modify_active_ai_config_old_for_side ( side_number side, const con void manager::modify_active_ai_for_side ( side_number side, const config &cfg ) { - if (ai_info_==NULL) { + if (ai_info_==nullptr) { //replay ? return; } diff --git a/src/ai/simulated_actions.cpp b/src/ai/simulated_actions.cpp index e725c2f11f9a..327bf73f89a9 100644 --- a/src/ai/simulated_actions.cpp +++ b/src/ai/simulated_actions.cpp @@ -179,7 +179,7 @@ bool simulated_synced_command(){ // Helper functions. void helper_check_village(const map_location& loc, int side){ std::vector &teams = *resources::teams; - team *t = unsigned(side - 1) < teams.size() ? &teams[side - 1] : NULL; + team *t = unsigned(side - 1) < teams.size() ? &teams[side - 1] : nullptr; if(t && t->owns_village(loc)){ return; } @@ -203,7 +203,7 @@ void helper_check_village(const map_location& loc, int side){ if (!t) return; if(has_leader){ - t->get_village(loc, old_owner_side, NULL); + t->get_village(loc, old_owner_side, nullptr); DBG_AI_SIM_ACTIONS << "side " << side << " gets village at " << loc << std::endl; } } diff --git a/src/attack_prediction.cpp b/src/attack_prediction.cpp index c0f24d822e12..4fd84dce40de 100644 --- a/src/attack_prediction.cpp +++ b/src/attack_prediction.cpp @@ -155,7 +155,7 @@ class prob_matrix std::vector & col_sums) const; /// Returns true if the specified plane might have data in it. - bool plane_used(unsigned p) const { return p < NUM_PLANES && plane_[p] != NULL; } + bool plane_used(unsigned p) const { return p < NUM_PLANES && plane_[p] != nullptr; } unsigned int num_rows() const { return rows_; } unsigned int num_cols() const { return cols_; } @@ -253,9 +253,9 @@ prob_matrix::prob_matrix(unsigned int a_max, unsigned int b_max, // Allocate the needed planes. plane_[NEITHER_SLOWED] = new_plane(); - plane_[A_SLOWED] = !need_a_slowed ? NULL : new_plane(); - plane_[B_SLOWED] = !need_b_slowed ? NULL : new_plane(); - plane_[BOTH_SLOWED] = !(need_a_slowed && need_b_slowed) ? NULL : new_plane(); + plane_[A_SLOWED] = !need_a_slowed ? nullptr : new_plane(); + plane_[B_SLOWED] = !need_b_slowed ? nullptr : new_plane(); + plane_[BOTH_SLOWED] = !(need_a_slowed && need_b_slowed) ? nullptr : new_plane(); // Initialize the probability distribution. initialize_plane(NEITHER_SLOWED, a_cur, b_cur, a_initial[0], b_initial[0]); @@ -1799,7 +1799,7 @@ static void run(unsigned specific_battle) list_combatant(*stats[i], i+1); } - gettimeofday(&start, NULL); + gettimeofday(&start, nullptr); // Go through all fights with two attackers (j and k attacking i). for (i = 0; i < NUM_UNITS; ++i) { for (j = 0; j < NUM_UNITS; ++j) { @@ -1825,7 +1825,7 @@ static void run(unsigned specific_battle) } } } - gettimeofday(&end, NULL); + gettimeofday(&end, nullptr); timer_sub(&end, &start, &total); @@ -1924,7 +1924,7 @@ int main(int argc, char *argv[]) att_stats[i] = parse_unit(&argv); att[i] = new combatant(*att_stats[i]); } - att[i] = NULL; + att[i] = nullptr; for (i = 0; att[i]; ++i) { debug(("Fighting next attacker\n")); diff --git a/src/attack_prediction.hpp b/src/attack_prediction.hpp index ef657900be92..6561103ab99c 100644 --- a/src/attack_prediction.hpp +++ b/src/attack_prediction.hpp @@ -30,7 +30,7 @@ struct battle_context_unit_stats; struct combatant { /** Construct a combatant. */ - combatant(const battle_context_unit_stats &u, const combatant *prev = NULL); + combatant(const battle_context_unit_stats &u, const combatant *prev = nullptr); /** Copy constructor */ combatant(const combatant &that, const battle_context_unit_stats &u); diff --git a/src/attack_prediction_display.cpp b/src/attack_prediction_display.cpp index 391a3fb453ff..5174c475f365 100644 --- a/src/attack_prediction_display.cpp +++ b/src/attack_prediction_display.cpp @@ -151,7 +151,7 @@ void battle_prediction_pane::get_unit_strings(const battle_context_unit_stats& s char str_buf[10]; // With a weapon. - if(stats.weapon != NULL) { + if(stats.weapon != nullptr) { // Set specials context (for safety, it should not have changed normally). const attack_type *weapon = stats.weapon; @@ -162,7 +162,7 @@ void battle_prediction_pane::get_unit_strings(const battle_context_unit_stats& s unit_abilities::effect dmg_effect(dmg_specials, weapon->damage(), stats.backstab_pos); // Get the SET damage modifier, if any. - const unit_abilities::individual_effect *set_dmg_effect = NULL; + const unit_abilities::individual_effect *set_dmg_effect = nullptr; unit_abilities::effect::const_iterator i; for(i = dmg_effect.begin(); i != dmg_effect.end(); ++i) { if(i->type == unit_abilities::SET) { @@ -172,7 +172,7 @@ void battle_prediction_pane::get_unit_strings(const battle_context_unit_stats& s } // Either user the SET modifier or the base weapon damage. - if(set_dmg_effect == NULL) { + if(set_dmg_effect == nullptr) { left_strings.push_back(weapon->name()); str.str(""); str << weapon->damage(); @@ -534,7 +534,7 @@ attack_prediction_displayer::RESULT attack_prediction_displayer::button_pressed( std::vector preview_panes; preview_panes.push_back(&battle_pane); - gui::show_dialog(resources::screen->video(), NULL, _("Damage Calculations"), "", gui::OK_ONLY, NULL, &preview_panes); + gui::show_dialog(resources::screen->video(), nullptr, _("Damage Calculations"), "", gui::OK_ONLY, nullptr, &preview_panes); } return gui::CONTINUE_DIALOG; diff --git a/src/build_info.cpp b/src/build_info.cpp index 4adc9b5ab52d..01a929837d1b 100644 --- a/src/build_info.cpp +++ b/src/build_info.cpp @@ -71,7 +71,7 @@ version_table_manager::version_table_manager() , features() { SDL_version sdl_version; - const SDL_version* sdl_rt_version = NULL; + const SDL_version* sdl_rt_version = nullptr; // @@ -172,7 +172,7 @@ version_table_manager::version_table_manager() #ifdef HAVE_LIBPNG compiled[LIB_PNG] = PNG_LIBPNG_VER_STRING; - linked[LIB_PNG] = png_get_libpng_ver(NULL); + linked[LIB_PNG] = png_get_libpng_ver(nullptr); names[LIB_PNG] = "libpng"; #endif diff --git a/src/campaign_server/campaign_server.cpp b/src/campaign_server/campaign_server.cpp index 3fdb6d096f2a..e9e2913acff6 100644 --- a/src/campaign_server/campaign_server.cpp +++ b/src/campaign_server/campaign_server.cpp @@ -101,7 +101,7 @@ time_t monotonic_clock() return ts.tv_sec; #else #warning monotonic_clock() is not truly monotonic! - return time(NULL); + return time(nullptr); #endif } @@ -297,7 +297,7 @@ void server::fire(const std::string& hook, const std::string& addon) // We are the child process. Execute the script. We run as a // separate thread sharing stdout/stderr, which will make the // log look ugly. - execlp(script.c_str(), script.c_str(), addon.c_str(), static_cast(NULL)); + execlp(script.c_str(), script.c_str(), addon.c_str(), static_cast(nullptr)); // exec() and family never return; if they do, we have a problem std::cerr << "ERROR: exec failed with errno " << errno << " for addon " << addon @@ -447,7 +447,7 @@ void server::run() network::connection err_sock = 0; network::connection const * err_connection = boost::get_error_info(e); - if(err_connection != NULL) { + if(err_connection != nullptr) { err_sock = *err_connection; } @@ -489,7 +489,7 @@ void server::handle_request_campaign_list(const server::request& req) { LOG_CS << "sending campaign list to " << req.addr << " using gzip"; - time_t epoch = time(NULL); + time_t epoch = time(nullptr); config campaign_list; campaign_list["timestamp"] = epoch; @@ -627,7 +627,7 @@ void server::handle_upload(const server::request& req) config data = upload.child("data"); const std::string& name = upload["name"]; - config *campaign = NULL; + config *campaign = nullptr; bool passed_name_utf8_check = false; @@ -698,7 +698,7 @@ void server::handle_upload(const server::request& req) LOG_CS << "Upload aborted - incorrect passphrase.\n"; send_error("Add-on rejected: The add-on already exists, and your passphrase was incorrect.", req.sock); } else { - const time_t upload_ts = time(NULL); + const time_t upload_ts = time(nullptr); LOG_CS << "Upload is owner upload.\n"; @@ -721,11 +721,11 @@ void server::handle_upload(const server::request& req) return; } - const bool existing_upload = campaign != NULL; + const bool existing_upload = campaign != nullptr; std::string message = "Add-on accepted."; - if(campaign == NULL) { + if(campaign == nullptr) { campaign = &campaigns().add_child("campaign"); (*campaign)["original_timestamp"] = upload_ts; } diff --git a/src/carryover.cpp b/src/carryover.cpp index f1bc1915eb55..1296727b6a1d 100644 --- a/src/carryover.cpp +++ b/src/carryover.cpp @@ -261,7 +261,7 @@ carryover* carryover_info::get_side(std::string save_id){ return &side; } } - return NULL; + return nullptr; } diff --git a/src/config.cpp b/src/config.cpp index 9f346bf75b64..d4a086a5b08b 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -349,7 +349,7 @@ t_string config::attribute_value::t_str() const */ bool config::attribute_value::blank() const { - return boost::get(&value_) != NULL; + return boost::get(&value_) != nullptr; } /** @@ -881,7 +881,7 @@ const config::attribute_value *config::get(const std::string &key) const { check_valid(); attribute_map::const_iterator i = values.find(key); - return i != values.end() ? &i->second : NULL; + return i != values.end() ? &i->second : nullptr; } config::attribute_value &config::operator[](const std::string &key) @@ -985,7 +985,7 @@ namespace { struct config_clear_state { config_clear_state() - : c(NULL) + : c(nullptr) , mi() , vi(0) { @@ -1090,14 +1090,14 @@ void config::get_diff(const config& c, config& res) const check_valid(c); check_valid(res); - config* inserts = NULL; + config* inserts = nullptr; attribute_map::const_iterator i; for(i = values.begin(); i != values.end(); ++i) { if(i->second.blank()) continue; const attribute_map::const_iterator j = c.values.find(i->first); if(j == c.values.end() || (i->second != j->second && !i->second.blank() )) { - if(inserts == NULL) { + if(inserts == nullptr) { inserts = &res.add_child("insert"); } @@ -1105,13 +1105,13 @@ void config::get_diff(const config& c, config& res) const } } - config* deletes = NULL; + config* deletes = nullptr; for(i = c.values.begin(); i != c.values.end(); ++i) { if(i->second.blank()) continue; const attribute_map::const_iterator itor = values.find(i->first); if(itor == values.end() || itor->second.blank()) { - if(deletes == NULL) { + if(deletes == nullptr) { deletes = &res.add_child("delete"); } diff --git a/src/config.hpp b/src/config.hpp index 7f214d3749d6..fceeccfd1bdd 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -480,7 +480,7 @@ class config /** * Returns a pointer to the attribute with the given @a key - * or NULL if it does not exist. + * or nullptr if it does not exist. */ const attribute_value *get(const std::string &key) const; diff --git a/src/construct_dialog.cpp b/src/construct_dialog.cpp index ec57217fc1f0..373b0ce28d20 100644 --- a/src/construct_dialog.cpp +++ b/src/construct_dialog.cpp @@ -48,13 +48,13 @@ const int dialog::message_font_size = font::SIZE_PLUS; const int dialog::caption_font_size = font::SIZE_LARGE; const size_t dialog::left_padding = font::relative_size(10); const size_t dialog::right_padding = font::relative_size(10); -const size_t dialog::image_h_pad = font::relative_size(/*image_ == NULL ? 0 :*/ 10); +const size_t dialog::image_h_pad = font::relative_size(/*image_ == nullptr ? 0 :*/ 10); const size_t dialog::top_padding = font::relative_size(10); const size_t dialog::bottom_padding = font::relative_size(10); const int dialog::max_menu_width = -1; -menu * dialog::empty_menu = NULL; +menu * dialog::empty_menu = nullptr; } namespace { @@ -97,11 +97,11 @@ dialog::dimension_measurements::dimension_measurements() : dialog::dialog(CVideo& video, const std::string& title, const std::string& message, const DIALOG_TYPE type, const style& dialog_style) : video_(video), - image_(NULL), + image_(nullptr), title_(title), style_(dialog_style), - title_widget_(NULL), - message_(NULL), + title_widget_(nullptr), + message_(nullptr), type_(type), menu_(get_empty_menu(video)), preview_panes_(), @@ -111,9 +111,9 @@ dialog::dialog(CVideo& video, const std::string& title, const std::string& messa top_buttons_(), frame_buttons_(), topic_(), - help_button_(NULL), - text_widget_(NULL), - frame_(NULL), + help_button_(nullptr), + text_widget_(nullptr), + frame_(nullptr), dim_(), result_(CONTINUE_DIALOG) { @@ -270,8 +270,8 @@ void dialog::set_menu_items(const std::vector &menu_items, bool kee */ menu * dialog::get_empty_menu(CVideo& video) { - if ( empty_menu == NULL ) { - empty_menu = new gui::menu(video, empty_string_vector, false, -1, -1, NULL, &menu::simple_style); + if ( empty_menu == nullptr ) { + empty_menu = new gui::menu(video, empty_string_vector, false, -1, -1, nullptr, &menu::simple_style); empty_menu->leave(); } return empty_menu; @@ -369,7 +369,7 @@ void dialog::draw_contents() dialog_frame& dialog::get_frame() { - if(frame_ == NULL) { + if(frame_ == nullptr) { frame_buttons_.clear(); for(button_iterator b = standard_buttons_.begin(); b != standard_buttons_.end(); ++b) { @@ -382,7 +382,7 @@ dialog_frame& dialog::get_frame() void dialog::clear_background() { delete frame_; - frame_ = NULL; + frame_ = nullptr; } void dialog::draw_frame() @@ -411,7 +411,7 @@ void dialog::update_widget_positions() if(get_menu().height() > 0) { menu_->leave(); menu_->join(); - menu_->set_numeric_keypress_selection(text_widget_ == NULL); + menu_->set_numeric_keypress_selection(text_widget_ == nullptr); menu_->set_width( dim_.menu_width ); menu_->set_max_width( dim_.menu_width ); //lock the menu width if(dim_.menu_height >= 0) { @@ -471,7 +471,7 @@ dialog::dimension_measurements dialog::layout(int xloc, int yloc) dim.x = xloc; dim.y = yloc; - const bool use_textbox = (text_widget_ != NULL); + const bool use_textbox = (text_widget_ != nullptr); int text_widget_width = 0; int text_widget_height = 0; if(use_textbox) { @@ -479,7 +479,7 @@ dialog::dimension_measurements dialog::layout(int xloc, int yloc) dim.textbox.w = std::min(screen.getx()/2,std::max(area.w,text_widget_->width())); dim.textbox.h = std::min(screen.gety()/2,std::max(area.h,text_widget_->height())); text_widget_width = dim.textbox.w; - text_widget_width += (text_widget_->get_label() == NULL) ? 0 : text_widget_->get_label()->width(); + text_widget_width += (text_widget_->get_label() == nullptr) ? 0 : text_widget_->get_label()->width(); text_widget_height = dim.textbox.h + message_font_size; } @@ -490,7 +490,7 @@ dialog::dimension_measurements dialog::layout(int xloc, int yloc) } unsigned int caption_width = 0; unsigned int caption_height = 0; - if (image_ != NULL && image_->caption() != NULL) { + if (image_ != nullptr && image_->caption() != nullptr) { caption_width = image_->caption()->width(); caption_height = image_->caption()->height(); } @@ -547,11 +547,11 @@ dialog::dimension_measurements dialog::layout(int xloc, int yloc) } const int menu_hpadding = font::relative_size((dim.message.h > 0 && use_menu) ? 10 : 0); - const size_t image_h_padding = (image_ == NULL)? 0 : image_h_pad; + const size_t image_h_padding = (image_ == nullptr)? 0 : image_h_pad; const size_t padding_width = left_padding + right_padding + image_h_padding; const size_t padding_height = top_padding + bottom_padding + menu_hpadding; - const size_t image_width = (image_ == NULL) ? 0 : image_->width(); - const size_t image_height = (image_ == NULL) ? 0 : image_->height(); + const size_t image_width = (image_ == nullptr) ? 0 : image_->width(); + const size_t image_height = (image_ == nullptr) ? 0 : image_->height(); const size_t total_text_height = dim.message.h + caption_height; size_t text_width = dim.message.w; @@ -702,7 +702,7 @@ dialog::dimension_measurements dialog::layout(int xloc, int yloc) dim.message.x = dim.x + left_padding; dim.message.y = dim.y + top_padding + caption_height; - if(image_ != NULL) { + if(image_ != nullptr) { const int x = dim.x + left_padding; const int y = dim.y + top_padding; dim.message.x += image_width + image_h_padding; @@ -764,7 +764,7 @@ int dialog::process(dialog_process_info &info) info.key[SDLK_ESCAPE] || info.key[SDLK_KP_ENTER]; info.double_clicked = menu_->double_clicked(); const bool use_menu = (menu_ != empty_menu); - const bool use_text_input = (text_widget_!=NULL); + const bool use_text_input = (text_widget_!=nullptr); const bool has_input = (use_menu||use_text_input);//input of any sort has to be made if((((!info.key_down && (info.key[SDLK_RETURN] || info.key[SDLK_KP_ENTER])) || info.double_clicked) && @@ -851,7 +851,7 @@ int dialog::process(dialog_process_info &info) } int dialog_button::action(dialog_process_info &info) { - if(handler_ != NULL) { + if(handler_ != nullptr) { menu &menu_ref = parent_->get_menu(); dialog_button_action::RESULT res = handler_->button_pressed(menu_ref.selection()); @@ -903,7 +903,7 @@ int standard_dialog_button::action(dialog_process_info &/*info*/) { void dialog::set_image(surface surf, const std::string &caption) { - label *label_ptr = NULL; + label *label_ptr = nullptr; if(!caption.empty()) { label_ptr = new label(video_, caption, caption_font_size, font::NORMAL_COLOR, false); } diff --git a/src/construct_dialog.hpp b/src/construct_dialog.hpp index bd2249e000f5..2339682821e0 100644 --- a/src/construct_dialog.hpp +++ b/src/construct_dialog.hpp @@ -151,9 +151,9 @@ class filter_textbox : public gui::dialog_textbox { class dialog_button : public button { public: dialog_button(CVideo& video, const std::string& label, TYPE type=TYPE_PRESS, - int simple_result=CONTINUE_DIALOG, dialog_button_action *handler=NULL) + int simple_result=CONTINUE_DIALOG, dialog_button_action *handler=nullptr) : button(video,label,type,"",DEFAULT_SPACE,false), simple_result_(simple_result), - parent_(NULL), handler_(handler) + parent_(nullptr), handler_(handler) {} void set_parent(class dialog *parent) { parent_ = parent; @@ -237,8 +237,8 @@ class dialog { void set_image(dialog_image *const img) { delete image_; image_ = img; } void set_image(surface surf, const std::string &caption=""); void set_menu(menu *const m) { if ( menu_ != empty_menu ) delete menu_; - menu_ = m == NULL ? empty_menu : m; } - void set_menu(const std::vector & menu_items, menu::sorter* sorter=NULL); + menu_ = m == nullptr ? empty_menu : m; } + void set_menu(const std::vector & menu_items, menu::sorter* sorter=nullptr); void set_menu_items(const std::vector &menu_items, bool keep_selection=false); //add_pane - preview panes are not currently memory managed @@ -283,7 +283,7 @@ class dialog { /// Must not be called if any instances of this class exist. /// Should be called if the display goes out of scope. /// (Currently called by ~game_launcher.) - static void delete_empty_menu() { delete empty_menu; empty_menu = NULL; } + static void delete_empty_menu() { delete empty_menu; empty_menu = nullptr; } protected: void set_result(const int result) { result_ = result; } @@ -304,7 +304,7 @@ class dialog { //process - execute a single dialog processing loop and return the result int process(dialog_process_info &info); - /// A pointer to this empty menu is used instead of NULL (for menu_). + /// A pointer to this empty menu is used instead of nullptr (for menu_). static menu * empty_menu; /// Provides create-on-use semantics for empty_menu. static menu * get_empty_menu(CVideo& video); @@ -316,7 +316,7 @@ class dialog { const style& style_; label *title_widget_, *message_; DIALOG_TYPE type_; - gui::menu *menu_; // Never NULL; it equals empty_menu if there is currently no menu. + gui::menu *menu_; // Never nullptr; it equals empty_menu if there is currently no menu. std::vector preview_panes_; std::vector< std::pair > button_pool_; std::vector standard_buttons_; diff --git a/src/controller_base.cpp b/src/controller_base.cpp index 47bea00e7991..ec0b8fcb1b0a 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -211,14 +211,14 @@ void controller_base::play_slice(bool is_delay_enabled) } const theme::menu* const m = get_display().menu_pressed(); - if(m != NULL) { + if(m != nullptr) { const SDL_Rect& menu_loc = m->location(get_display().screen_area()); show_menu(m->items(),menu_loc.x+1,menu_loc.y + menu_loc.h + 1,false, get_display()); return; } const theme::action* const a = get_display().action_pressed(); - if(a != NULL) { + if(a != nullptr) { const SDL_Rect& action_loc = a->location(get_display().screen_area()); execute_action(a->items(), action_loc.x+1, action_loc.y + action_loc.h + 1,false); diff --git a/src/controller_base.hpp b/src/controller_base.hpp index 22727988e34b..87df5cfe8a03 100644 --- a/src/controller_base.hpp +++ b/src/controller_base.hpp @@ -79,17 +79,17 @@ class controller_base : public video2::draw_layering /** * Get (optionally) a soundsources manager a derived class uses */ - virtual soundsource::manager * get_soundsource_man() { return NULL; } + virtual soundsource::manager * get_soundsource_man() { return nullptr; } /** * Get (optionally) a plugins context a derived class uses */ - virtual plugins_context * get_plugins_context() { return NULL; } + virtual plugins_context * get_plugins_context() { return nullptr; } /** * Get (optionally) a command executor to handle context menu events */ - virtual hotkey::command_executor * get_hotkey_command_executor() { return NULL; } + virtual hotkey::command_executor * get_hotkey_command_executor() { return nullptr; } /** * Derived classes should override this to return false when arrow keys diff --git a/src/cursor.cpp b/src/cursor.cpp index 90621ec2b81c..a34939667382 100644 --- a/src/cursor.cpp +++ b/src/cursor.cpp @@ -37,8 +37,8 @@ static bool use_color_cursors() static SDL_Cursor* create_cursor(surface surf) { const surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { - return NULL; + if(nsurf == nullptr) { + return nullptr; } // The width must be a multiple of 8 (SDL requirement) @@ -82,7 +82,7 @@ static SDL_Cursor* create_cursor(surface surf) namespace { -SDL_Cursor* cache[cursor::NUM_CURSORS] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; +SDL_Cursor* cache[cursor::NUM_CURSORS] = { nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr}; tribool cache_color[cursor::NUM_CURSORS] = { indeterminate, indeterminate, indeterminate, indeterminate, indeterminate, indeterminate, indeterminate, indeterminate, @@ -112,7 +112,7 @@ bool have_focus = true; static SDL_Cursor* get_cursor(cursor::CURSOR_TYPE type) { bool is_color = use_color_cursors(); - if(cache[type] == NULL || indeterminate(cache_color[type]) || cache_color[type] != is_color) { + if(cache[type] == nullptr || indeterminate(cache_color[type]) || cache_color[type] != is_color) { const std::string prefix = is_color ? "cursors/" : "cursors-bw/"; const surface surf(image::get_image(prefix + (is_color ? color_images : bw_images)[type])); if (is_color) { @@ -129,9 +129,9 @@ static SDL_Cursor* get_cursor(cursor::CURSOR_TYPE type) static void clear_cache() { for(size_t n = 0; n != cursor::NUM_CURSORS; ++n) { - if(cache[n] != NULL) { + if(cache[n] != nullptr) { SDL_FreeCursor(cache[n]); - cache[n] = NULL; + cache[n] = nullptr; } } } @@ -165,7 +165,7 @@ void set(CURSOR_TYPE type) SDL_Cursor * cursor_image = get_cursor(current_cursor); // Causes problem on Mac: - //if (cursor_image != NULL && cursor_image != SDL_GetCursor()) + //if (cursor_image != nullptr && cursor_image != SDL_GetCursor()) SDL_SetCursor(cursor_image); SDL_ShowCursor(SDL_ENABLE); diff --git a/src/desktop/dbus_notification.cpp b/src/desktop/dbus_notification.cpp index aeb20ea14d60..8f7bc1564be9 100644 --- a/src/desktop/dbus_notification.cpp +++ b/src/desktop/dbus_notification.cpp @@ -88,7 +88,7 @@ DBusHandlerResult filter_dbus_signal(DBusConnection *, DBusMessage *buf, void *) } uint32_t id; - dbus_message_get_args(buf, NULL, + dbus_message_get_args(buf, nullptr, DBUS_TYPE_UINT32, &id, DBUS_TYPE_INVALID); @@ -101,7 +101,7 @@ DBusHandlerResult filter_dbus_signal(DBusConnection *, DBusMessage *buf, void *) DBusConnection *get_dbus_connection() { static bool initted = false; - static DBusConnection *connection = NULL; + static DBusConnection *connection = nullptr; if (!initted) { @@ -116,9 +116,9 @@ DBusConnection *get_dbus_connection() if (!connection) { ERR_DU << "Failed to open DBus session: " << err.message << '\n'; dbus_error_free(&err); - return NULL; + return nullptr; } - dbus_connection_add_filter(connection, filter_dbus_signal, NULL, NULL); + dbus_connection_add_filter(connection, filter_dbus_signal, nullptr, nullptr); } if (connection) { dbus_connection_read_write(connection, 0); @@ -159,7 +159,7 @@ uint32_t send_dbus_notification(DBusConnection *connection, uint32_t replaces_id const char *app_icon = app_icon_.c_str(); const char *summary = owner.c_str(); const char *body = message.c_str(); - const char **actions = NULL; + const char **actions = nullptr; dbus_message_append_args(buf, DBUS_TYPE_STRING, &app_icon, DBUS_TYPE_STRING, &summary, @@ -189,7 +189,7 @@ uint32_t send_dbus_notification(DBusConnection *connection, uint32_t replaces_id return 0; } uint32_t id; - dbus_message_get_args(ret, NULL, + dbus_message_get_args(ret, nullptr, DBUS_TYPE_UINT32, &id, DBUS_TYPE_INVALID); dbus_message_unref(ret); diff --git a/src/desktop/open.cpp b/src/desktop/open.cpp index 30bcd63c9ac2..985fe2ec5d4a 100644 --- a/src/desktop/open.cpp +++ b/src/desktop/open.cpp @@ -71,7 +71,7 @@ bool open_object(const std::string& path_or_url) ERR_DU << "open_object(): fork() failed" << std::endl; return false; } else if(child == 0) { - execlp(launcher, launcher, path_or_url.c_str(), reinterpret_cast(NULL)); + execlp(launcher, launcher, path_or_url.c_str(), nullptr); _exit(1); // This shouldn't happen. } else if(waitpid(child, &child_status, 0) == -1) { ERR_DU << "open_object(): waitpid() failed" << std::endl; @@ -97,7 +97,7 @@ bool open_object(const std::string& path_or_url) std::wstring u16path = unicode_cast(path_or_url); - const ptrdiff_t res = reinterpret_cast(ShellExecute(NULL, L"open", u16path.c_str(), NULL, NULL, SW_SHOW)); + const ptrdiff_t res = reinterpret_cast(ShellExecute(nullptr, L"open", u16path.c_str(), nullptr, nullptr, SW_SHOW)); if(res <= 32) { ERR_DU << "open_object(): ShellExecute() failed (" << res << ")" << std::endl; return false; diff --git a/src/desktop/version.cpp b/src/desktop/version.cpp index 4556136c04b7..7e296cada9fb 100644 --- a/src/desktop/version.cpp +++ b/src/desktop/version.cpp @@ -67,7 +67,7 @@ bool on_wine() return false; } - return GetProcAddress(ntdll, "wine_get_version") != NULL; + return GetProcAddress(ntdll, "wine_get_version") != nullptr; } #endif @@ -77,7 +77,7 @@ bool on_wine() */ struct posix_pipe_release_policy { - void operator()(std::FILE* f) const { if(f != NULL) { pclose(f); } } + void operator()(std::FILE* f) const { if(f != nullptr) { pclose(f); } } }; /** diff --git a/src/desktop/windows_tray_notification.cpp b/src/desktop/windows_tray_notification.cpp index e646581db27a..323c9dcab2c6 100644 --- a/src/desktop/windows_tray_notification.cpp +++ b/src/desktop/windows_tray_notification.cpp @@ -22,19 +22,19 @@ #include "video.hpp" // CVideo class holds the twindow -> SDL_Window object which contains the handle of the main window -NOTIFYICONDATA* windows_tray_notification::nid = NULL; +NOTIFYICONDATA* windows_tray_notification::nid = nullptr; bool windows_tray_notification::message_reset = false; void windows_tray_notification::destroy_tray_icon() { - if (nid == NULL) { + if (nid == nullptr) { return; } if (!message_reset){ Shell_NotifyIcon(NIM_DELETE, nid); delete nid; - nid = NULL; + nid = nullptr; } else { message_reset = false; } @@ -72,23 +72,23 @@ void windows_tray_notification::handle_system_event(const SDL_Event& event) bool windows_tray_notification::create_tray_icon() { // getting handle to a 32x32 icon, contained in "WESNOTH_ICON" icon group of wesnoth.exe resources - const HMODULE wesnoth_exe = GetModuleHandle(NULL); - if (wesnoth_exe == NULL) { + const HMODULE wesnoth_exe = GetModuleHandle(nullptr); + if (wesnoth_exe == nullptr) { return false; } const HRSRC group_icon_info = FindResource(wesnoth_exe, TEXT("WESNOTH_ICON"), RT_GROUP_ICON); - if (group_icon_info == NULL) { + if (group_icon_info == nullptr) { return false; } HGLOBAL hGlobal = LoadResource(wesnoth_exe, group_icon_info); - if (hGlobal == NULL) { + if (hGlobal == nullptr) { return false; } const PBYTE group_icon_res = static_cast(LockResource(hGlobal)); - if (group_icon_res == NULL) { + if (group_icon_res == nullptr) { return false; } @@ -98,27 +98,27 @@ bool windows_tray_notification::create_tray_icon() } const HRSRC icon_info = FindResource(wesnoth_exe, MAKEINTRESOURCE(nID), MAKEINTRESOURCE(3)); - if (icon_info == NULL) { + if (icon_info == nullptr) { return false; } hGlobal = LoadResource(wesnoth_exe, icon_info); - if (hGlobal == NULL) { + if (hGlobal == nullptr) { return false; } const PBYTE icon_res = static_cast(LockResource(hGlobal)); - if (icon_res == NULL) { + if (icon_res == nullptr) { return false; } const HICON icon = CreateIconFromResource(icon_res, SizeofResource(wesnoth_exe, icon_info), TRUE, 0x00030000); - if (icon == NULL) { + if (icon == nullptr) { return false; } const HWND window = get_window_handle(); - if (window == NULL) { + if (window == nullptr) { return false; } @@ -177,7 +177,7 @@ HWND windows_tray_notification::get_window_handle() sdl::twindow* window = CVideo::get_singleton().get_window(); // SDL 1.2 keeps track of window handles internally whereas SDL 2.0 allows the caller control over which window to use if (!window || SDL_GetWindowWMInfo (static_cast (*window), &wmInfo) != SDL_TRUE) { - return NULL; + return nullptr; } return wmInfo.info.win.window; @@ -186,7 +186,7 @@ HWND windows_tray_notification::get_window_handle() void windows_tray_notification::switch_to_wesnoth_window() { const HWND window = get_window_handle(); - if (window == NULL) { + if (window == nullptr) { return; } @@ -212,11 +212,11 @@ bool windows_tray_notification::show(std::string title, std::string message) { adjust_length(title, message); - const bool tray_icon_exist = nid != NULL; + const bool tray_icon_exist = nid != nullptr; if (!tray_icon_exist) { const bool tray_icon_created = create_tray_icon(); if (!tray_icon_created) { - const bool memory_allocated = nid != NULL; + const bool memory_allocated = nid != nullptr; if (memory_allocated) { destroy_tray_icon(); } diff --git a/src/dialogs.cpp b/src/dialogs.cpp index 96d0a1874494..eafabec9817e 100644 --- a/src/dialogs.cpp +++ b/src/dialogs.cpp @@ -433,7 +433,7 @@ void show_objectives(const std::string &scenarioname, const std::string &objecti int recruit_dialog(display& disp, std::vector< const unit_type* >& units, const std::vector< std::string >& items, int side, const std::string& title_suffix) { dialogs::unit_types_preview_pane unit_preview( - units, NULL, side); + units, nullptr, side); std::vector preview_panes; preview_panes.push_back(&unit_preview); @@ -843,7 +843,7 @@ void unit_preview_pane::draw_contents() SDL_Rect image_rect = sdl::create_rect(area.x, area.y, 0, 0); - if(unit_image != NULL) { + if(unit_image != nullptr) { SDL_Rect rect = sdl::create_rect( right_align ? area.x @@ -852,7 +852,7 @@ void unit_preview_pane::draw_contents() , unit_image->w , unit_image->h); - sdl_blit(unit_image,NULL,screen,&rect); + sdl_blit(unit_image,nullptr,screen,&rect); image_rect = rect; if(!det.overlays.empty()) { @@ -867,7 +867,7 @@ void unit_preview_pane::draw_contents() os = scale_surface(os, rect.w, rect.h, false); } - sdl_blit(os, NULL, screen, &rect); + sdl_blit(os, nullptr, screen, &rect); } } } @@ -980,7 +980,7 @@ void unit_preview_pane::draw_contents() units_list_preview_pane::units_list_preview_pane(unit_const_ptr u, TYPE type, bool on_left_side) : - unit_preview_pane(NULL, type, on_left_side), + unit_preview_pane(nullptr, type, on_left_side), units_(boost::make_shared >(1, u)) { } @@ -1073,7 +1073,7 @@ unit_types_preview_pane::unit_types_preview_pane( size_t unit_types_preview_pane::size() const { - return (unit_types_!=NULL) ? unit_types_->size() : 0; + return (unit_types_!=nullptr) ? unit_types_->size() : 0; } const unit_types_preview_pane::details unit_types_preview_pane::get_details() const @@ -1081,7 +1081,7 @@ const unit_types_preview_pane::details unit_types_preview_pane::get_details() co const unit_type* t = (*unit_types_)[index_]; details det; - if (t==NULL) + if (t==nullptr) return det; // Make sure the unit type is built with enough data for our needs. @@ -1148,7 +1148,7 @@ void unit_types_preview_pane::process_event() assert(resources::screen); if (details_button_.pressed() && index_ >= 0 && index_ < int(size())) { const unit_type* type = (*unit_types_)[index_]; - if (type != NULL) + if (type != nullptr) help::show_unit_description(resources::screen->video(), *type); } } diff --git a/src/dialogs.hpp b/src/dialogs.hpp index 7c1a31dd5804..51e5c81a7112 100644 --- a/src/dialogs.hpp +++ b/src/dialogs.hpp @@ -79,7 +79,7 @@ class unit_preview_pane : public gui::preview_pane std::vector overlays; }; - unit_preview_pane(const gui::filter_textbox *filter = NULL, + unit_preview_pane(const gui::filter_textbox *filter = nullptr, TYPE type = SHOW_ALL, bool left_side = true); bool show_above() const; @@ -109,7 +109,7 @@ class units_list_preview_pane : public dialogs::unit_preview_pane public: units_list_preview_pane(unit_const_ptr u, TYPE type = SHOW_ALL, bool left_side = true); units_list_preview_pane(const boost::shared_ptr > & units, - const gui::filter_textbox *filter = NULL, + const gui::filter_textbox *filter = nullptr, TYPE type = SHOW_ALL, bool left_side = true); private: @@ -125,7 +125,7 @@ class unit_types_preview_pane : public dialogs::unit_preview_pane { public: unit_types_preview_pane( - std::vector& unit_types, const gui::filter_textbox* filterbox=NULL, + std::vector& unit_types, const gui::filter_textbox* filterbox=nullptr, int side = 1, TYPE type=SHOW_ALL, bool left_side=true); private: diff --git a/src/display.cpp b/src/display.cpp index d4395270c773..4b4082e6a12a 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -163,7 +163,7 @@ display::display(const display_context * dc, CVideo& video, boost::weak_ptrmap(), theme_.border().tile_image)), - minimap_(NULL), + minimap_(nullptr), minimap_location_(sdl::empty_rect), redrawMinimap_(false), redraw_background_(true), @@ -191,9 +191,9 @@ display::display(const display_context * dc, CVideo& video, boost::weak_ptrteams().size()); assert(n < flags_.size()); @@ -340,7 +340,7 @@ void display::init_flags_for_side_internal(size_t n, const std::string& side_col sdl::timage display::get_flag(const map_location& loc) { if(!get_map().is_village(loc)) { - return surface(NULL); + return surface(nullptr); } for(size_t i = 0; i != dc_->teams().size(); ++i) { @@ -360,7 +360,7 @@ sdl::timage display::get_flag(const map_location& loc) surface display::get_flag(const map_location& loc) { if(!get_map().is_village(loc)) { - return surface(NULL); + return surface(nullptr); } for(size_t i = 0; i != dc_->teams().size(); ++i) { @@ -374,7 +374,7 @@ surface display::get_flag(const map_location& loc) } } - return surface(NULL); + return surface(nullptr); } #endif @@ -389,7 +389,7 @@ void display::set_team(size_t teamindex, bool show_everything) } else { - labels().set_team(NULL); + labels().set_team(nullptr); dont_show_all_ = false; } labels().recalculate_labels(); @@ -777,7 +777,7 @@ bool display::screenshot(const std::string& filename, bool map_screenshot) SDL_Rect area = max_map_area(); map_screenshot_surf_ = create_compatible_surface(screen_.getSurface(), area.w, area.h); - if (map_screenshot_surf_ == NULL) { + if (map_screenshot_surf_ == nullptr) { // Memory problem ? ERR_DP << "Could not create screenshot surface, try zooming out.\n"; return false; @@ -805,13 +805,13 @@ bool display::screenshot(const std::string& filename, bool map_screenshot) if (!res) { // Need to do this ASAP or spurious messages result due to // redraw_everything calling SDL too (e.g. "SDL_UpperBlit: passed - // a NULL surface") + // a nullptr surface") ERR_DP << "Map screenshot failed: " << SDL_GetError() << '\n'; } #endif //NOTE: need to be sure that we free this huge surface (is it enough?) - map_screenshot_surf_ = NULL; + map_screenshot_surf_ = nullptr; // restore normal rendering map_screenshot_= false; @@ -832,7 +832,7 @@ gui::button* display::find_action_button(const std::string& id) return &action_buttons_[i]; } } - return NULL; + return nullptr; } gui::button* display::find_menu_button(const std::string& id) @@ -842,7 +842,7 @@ gui::button* display::find_menu_button(const std::string& id) return &menu_buttons_[i]; } } - return NULL; + return nullptr; } gui::zoom_slider* display::find_slider(const std::string& id) @@ -852,7 +852,7 @@ gui::zoom_slider* display::find_slider(const std::string& id) return &sliders_[i]; } } - return NULL; + return nullptr; } void display::layout_buttons() @@ -1166,7 +1166,7 @@ std::vector display::get_terrain_images(const map_location &loc, } } - if(terrains != NULL) { + if(terrains != nullptr) { // Cache the offmap name. // Since it is themeable it can change, // so don't make it static. @@ -1371,7 +1371,7 @@ void display::drawing_buffer_commit() SDL_Rect dstrect = sdl::create_rect(blit.x(), blit.y(), 0, 0); SDL_Rect srcrect = blit.clip(); SDL_Rect *srcrectArg = (srcrect.x | srcrect.y | srcrect.w | srcrect.h) - ? &srcrect : NULL; + ? &srcrect : nullptr; sdl_blit(surf, srcrectArg, screen, &dstrect); //NOTE: the screen part should already be marked as 'to update' } @@ -1507,7 +1507,7 @@ static void draw_panel(CVideo &video, const theme::panel& panel, std::vectorx, clip->y, clip->w, clip->h); video().draw_texture(panel_image_, 0, 0); - if (clip != NULL) + if (clip != nullptr) GPU_UnsetClip(get_render_target()); } #endif @@ -1652,7 +1652,7 @@ static void draw_background(surface screen, const SDL_Rect& area, const std::str for(unsigned int w = 0, w_off = area.x; w < w_count; ++w, w_off += width) { for(unsigned int h = 0, h_off = area.y; h < h_count; ++h, h_off += height) { SDL_Rect clip = sdl::create_rect(w_off, h_off, 0, 0); - sdl_blit(background, NULL, screen, &clip); + sdl_blit(background, nullptr, screen, &clip); } } } @@ -1719,7 +1719,7 @@ void display::render_image(int x, int y, const display::tdrawing_layer drawing_l bool hreverse, bool greyscale, fixed_t alpha, Uint32 blendto, double blend_ratio, double submerged, bool vreverse) { - if (image==NULL) + if (image==nullptr) return; SDL_Rect image_rect = sdl::create_rect(x, y, image->w, image->h); @@ -1751,7 +1751,7 @@ void display::render_image(int x, int y, const display::tdrawing_layer drawing_l surf = adjust_surface_alpha(surf, alpha, false); } - if(surf == NULL) { + if(surf == nullptr) { ERR_DP << "surface lost..." << std::endl; return; } @@ -1897,13 +1897,13 @@ const theme::action* display::action_pressed() const size_t index = i - action_buttons_.begin(); if(index >= theme_.actions().size()) { assert(false); - return NULL; + return nullptr; } return &theme_.actions()[index]; } } - return NULL; + return nullptr; } const theme::menu* display::menu_pressed() @@ -1913,13 +1913,13 @@ const theme::menu* display::menu_pressed() const size_t index = i - menu_buttons_.begin(); if(index >= theme_.menus().size()) { assert(false); - return NULL; + return nullptr; } return theme_.get_menu_item(i->id()); } } - return NULL; + return nullptr; } void display::enable_menu(const std::string& item, bool enable) @@ -2087,13 +2087,13 @@ void display::draw_minimap() } #ifdef SDL_GPU - minimap_location_ = image::draw_minimap(screen_, area, get_map(), &dc_->teams()[currentTeam_], NULL); + minimap_location_ = image::draw_minimap(screen_, area, get_map(), &dc_->teams()[currentTeam_], nullptr); draw_minimap_units(); #else - if(minimap_ == NULL || minimap_->w > area.w || minimap_->h > area.h) { - minimap_ = image::getMinimap(area.w, area.h, get_map(), &dc_->teams()[currentTeam_], (selectedHex_.valid() && !is_blindfolded()) ? &reach_map_ : NULL); - if(minimap_ == NULL) { + if(minimap_ == nullptr || minimap_->w > area.w || minimap_->h > area.h) { + minimap_ = image::getMinimap(area.w, area.h, get_map(), &dc_->teams()[currentTeam_], (selectedHex_.valid() && !is_blindfolded()) ? &reach_map_ : nullptr); + if(minimap_ == nullptr) { return; } } @@ -2916,7 +2916,7 @@ void display::draw_hex(const map_location& loc) { image::get_texture(tod_hex_mask,image::SCALED_TO_HEX)); } #else - if(tod_hex_mask1 != NULL || tod_hex_mask2 != NULL) { + if(tod_hex_mask1 != nullptr || tod_hex_mask2 != nullptr) { drawing_buffer_add(LAYER_TERRAIN_FG, loc, xpos, ypos, tod_hex_mask1); drawing_buffer_add(LAYER_TERRAIN_FG, loc, xpos, ypos, tod_hex_mask2); } else if(!tod_hex_mask.empty()) { @@ -2930,7 +2930,7 @@ void display::draw_hex(const map_location& loc) { #ifdef SDL_GPU && !mouseover_hex_overlay_.null()) { #else - && mouseover_hex_overlay_ != NULL) { + && mouseover_hex_overlay_ != nullptr) { #endif drawing_buffer_add(LAYER_MOUSEOVER_OVERLAY, loc, xpos, ypos, mouseover_hex_overlay_); } @@ -3078,7 +3078,7 @@ void display::draw_image_for_report(surface& img, SDL_Rect& rect) img.assign(scale_surface(img,rect.w,rect.h)); } - sdl_blit(img,NULL,screen_.getSurface(),&target); + sdl_blit(img,nullptr,screen_.getSurface(),&target); } } #endif @@ -3108,7 +3108,7 @@ void display::refresh_report(std::string const &report_name, const config * new_ reports::context temp_context = reports::context(*dc_, *this, *resources::tod_manager, wb_.lock(), mhb); const config generated_cfg = new_cfg ? config() : reports_object_->generate_report(report_name, temp_context); - if ( new_cfg == NULL ) + if ( new_cfg == nullptr ) new_cfg = &generated_cfg; SDL_Rect &rect = reportRects_[report_name]; @@ -3141,7 +3141,7 @@ void display::refresh_report(std::string const &report_name, const config * new_ // TODO: handle this somehow for SDL_gpu /*if (rect.w > 0 && rect.h > 0) { img.assign(get_surface_portion(screen_.getSurface(), rect)); - if (reportSurfaces_[report_name] == NULL) { + if (reportSurfaces_[report_name] == nullptr) { ERR_DP << "Could not backup background for report!" << std::endl; } } @@ -3304,7 +3304,7 @@ void display::refresh_report(std::string const &report_name, const config * new_ #else const theme::status_item *item = theme_.get_status_item(report_name); if (!item) { - reportSurfaces_[report_name].assign(NULL); + reportSurfaces_[report_name].assign(nullptr); return; } @@ -3319,7 +3319,7 @@ void display::refresh_report(std::string const &report_name, const config * new_ reports::context temp_context = reports::context(*dc_, *this, *resources::tod_manager, wb_.lock(), mhb); const config generated_cfg = new_cfg ? config() : reports_object_->generate_report(report_name, temp_context); - if ( new_cfg == NULL ) + if ( new_cfg == nullptr ) new_cfg = &generated_cfg; SDL_Rect &rect = reportRects_[report_name]; @@ -3336,14 +3336,14 @@ void display::refresh_report(std::string const &report_name, const config * new_ report = *new_cfg; if (surf) { - sdl_blit(surf, NULL, screen_.getSurface(), &rect); + sdl_blit(surf, nullptr, screen_.getSurface(), &rect); update_rect(rect); } // If the rectangle has just changed, assign the surface to it if (!surf || new_rect != rect) { - surf.assign(NULL); + surf.assign(nullptr); rect = new_rect; // If the rectangle is present, and we are blitting text, @@ -3352,7 +3352,7 @@ void display::refresh_report(std::string const &report_name, const config * new_ // unless they are transparent, but that is done later). if (rect.w > 0 && rect.h > 0) { surf.assign(get_surface_portion(screen_.getSurface(), rect)); - if (reportSurfaces_[report_name] == NULL) { + if (reportSurfaces_[report_name] == nullptr) { ERR_DP << "Could not backup background for report!" << std::endl; } } @@ -3791,5 +3791,5 @@ void display::handle_event(const SDL_Event& event) { } } -display *display::singleton_ = NULL; +display *display::singleton_ = nullptr; diff --git a/src/display.hpp b/src/display.hpp index cf51bbbcab58..e52bf4883aee 100644 --- a/src/display.hpp +++ b/src/display.hpp @@ -81,7 +81,7 @@ class display : public filter_context, public video2::draw_layering reports & reports_object, const config& theme_cfg, const config& level, bool auto_join=true); virtual ~display(); - /// Returns the display object if a display object exists. Otherwise it returns NULL. + /// Returns the display object if a display object exists. Otherwise it returns nullptr. /// the display object represents the game gui which handles themewml and drawing the map. /// A display object only exists during a game or while the mapeditor is running. static display* get_singleton() { return singleton_ ;} @@ -165,8 +165,8 @@ class display : public filter_context, public video2::draw_layering void change_display_context(const display_context * dc); const display_context & get_disp_context() const { return *dc_; } virtual const tod_manager & get_tod_man() const; //!< This is implemented properly in game_display. The display:: impl could be pure virtual here but we decide not to. - virtual const game_data * get_game_data() const { return NULL; } - virtual game_lua_kernel * get_lua_kernel() const { return NULL; } //!< TODO: display should not work as a filter context, this was only done for expedience so that the unit animation code can have a convenient and correct filter context readily available. a more correct solution is most likely to pass it a filter context from unit_animator when it needs to be matched. (it's not possible to store filter contexts with animations, because animations are cached across scenarios.) Note that after these lines which return NULL, unit filters used in animations will not be able to make use of wml variables or lua scripting (but the latter was a bad idea anyways because it would be slow to constantly recompile the script.) + virtual const game_data * get_game_data() const { return nullptr; } + virtual game_lua_kernel * get_lua_kernel() const { return nullptr; } //!< TODO: display should not work as a filter context, this was only done for expedience so that the unit animation code can have a convenient and correct filter context readily available. a more correct solution is most likely to pass it a filter context from unit_animator when it needs to be matched. (it's not possible to store filter contexts with animations, because animations are cached across scenarios.) Note that after these lines which return nullptr, unit filters used in animations will not be able to make use of wml variables or lua scripting (but the latter was a bad idea anyways because it would be slow to constantly recompile the script.) void reset_halo_manager(); void reset_halo_manager(halo::manager & hm); @@ -386,7 +386,7 @@ class display : public filter_context, public video2::draw_layering /** * Retrieves a pointer to a theme UI button. * - * @note The returned pointer may either be NULL, meaning the button + * @note The returned pointer may either be nullptr, meaning the button * isn't defined by the current theme, or point to a valid * gui::button object. However, the objects retrieved will be * destroyed and recreated by draw() method calls. Do *NOT* store @@ -406,7 +406,7 @@ class display : public filter_context, public video2::draw_layering void invalidate_theme() { panelsDrawn_ = false; } - void refresh_report(std::string const &report_name, const config * new_cfg=NULL); + void refresh_report(std::string const &report_name, const config * new_cfg=nullptr); void draw_minimap_units(); @@ -458,7 +458,7 @@ class display : public filter_context, public video2::draw_layering { mouseover_hex_overlay_ = image; } void clear_mouseover_hex_overlay() - { mouseover_hex_overlay_ = NULL; } + { mouseover_hex_overlay_ = nullptr; } #endif /** @@ -619,7 +619,7 @@ class display : public filter_context, public video2::draw_layering * Schedule the minimap for recalculation. * Useful if any terrain in the map has changed. */ - void recalculate_minimap() {minimap_ = NULL; redrawMinimap_ = true; } + void recalculate_minimap() {minimap_ = nullptr; redrawMinimap_ = true; } /** * Schedule the minimap to be redrawn. @@ -1097,7 +1097,7 @@ class display : public filter_context, public video2::draw_layering void draw_all_panels(); #ifdef SDL_GPU - void draw_panel_image(SDL_Rect *clip = NULL); + void draw_panel_image(SDL_Rect *clip = nullptr); #endif /** diff --git a/src/display_context.cpp b/src/display_context.cpp index a84cb8fdc386..f4f99550f74e 100644 --- a/src/display_context.cpp +++ b/src/display_context.cpp @@ -54,10 +54,10 @@ bool display_context::would_be_discovered(const map_location & loc, int side_num const unit * display_context::get_visible_unit(const map_location & loc, const team ¤t_team, bool see_all) const { - if (!map().on_board(loc)) return NULL; + if (!map().on_board(loc)) return nullptr; const unit_map::const_iterator u = units().find(loc); if (!u.valid() || !u->is_visible_to_team(current_team, map(), see_all)) { - return NULL; + return nullptr; } return &*u; } diff --git a/src/editor/action/action.cpp b/src/editor/action/action.cpp index d353fbfbd82a..fdb9dfe977dd 100644 --- a/src/editor/action/action.cpp +++ b/src/editor/action/action.cpp @@ -136,7 +136,7 @@ editor_action* editor_action_chain::pop_first_action() { editor_action_chain* editor_action_chain::perform(map_context& mc) const { util::unique_ptr undo(new editor_action_chain()); BOOST_FOREACH(editor_action* a, actions_) { - if (a != NULL) { + if (a != nullptr) { undo->append_action(a->perform(mc)); } } @@ -146,7 +146,7 @@ editor_action_chain* editor_action_chain::perform(map_context& mc) const { void editor_action_chain::perform_without_undo(map_context& mc) const { BOOST_FOREACH(editor_action* a, actions_) { - if (a != NULL) { + if (a != nullptr) { a->perform_without_undo(mc); } } diff --git a/src/editor/action/action_item.cpp b/src/editor/action/action_item.cpp index fdf162f69023..c3aa0df9bccb 100644 --- a/src/editor/action/action_item.cpp +++ b/src/editor/action/action_item.cpp @@ -66,7 +66,7 @@ editor_action* editor_action_item_delete::perform(map_context& /*mc*/) const // perform_without_undo(mc); // return undo.release(); // } - return NULL; + return nullptr; } void editor_action_item_delete::perform_without_undo(map_context& /*mc*/) const diff --git a/src/editor/action/action_label.cpp b/src/editor/action/action_label.cpp index c3fd96bfd76f..1c958141c7d8 100644 --- a/src/editor/action/action_label.cpp +++ b/src/editor/action/action_label.cpp @@ -63,7 +63,7 @@ editor_action* editor_action_label_delete::perform(map_context& mc) const const terrain_label* deleted = mc.get_labels().get_label(loc_); - if (!deleted) return NULL; + if (!deleted) return nullptr; undo.reset(new editor_action_label(loc_, deleted->text(), deleted->team_name() , deleted->color(), deleted->visible_in_fog(), deleted->visible_in_shroud(), deleted->immutable(), deleted->category())); diff --git a/src/editor/action/action_unit.cpp b/src/editor/action/action_unit.cpp index 558786a306a4..f78cfbd3fbd6 100644 --- a/src/editor/action/action_unit.cpp +++ b/src/editor/action/action_unit.cpp @@ -67,7 +67,7 @@ editor_action* editor_action_unit_delete::perform(map_context& mc) const perform_without_undo(mc); return undo.release(); } - return NULL; + return nullptr; } void editor_action_unit_delete::perform_without_undo(map_context& mc) const diff --git a/src/editor/action/action_village.cpp b/src/editor/action/action_village.cpp index 2f69d18f7d7e..a5ff8d9e9cde 100644 --- a/src/editor/action/action_village.cpp +++ b/src/editor/action/action_village.cpp @@ -33,10 +33,10 @@ editor_action* editor_action_village::perform(map_context& mc) const { std::unique_ptr undo; - if(!mc.get_map().is_village(loc_)) return NULL; + if(!mc.get_map().is_village(loc_)) return nullptr; std::vector& teams = mc.get_teams(); - team *t = unsigned(side_number_) < teams.size() ? &teams[side_number_] : NULL; - if (t && t->owns_village(loc_)) return NULL; + team *t = unsigned(side_number_) < teams.size() ? &teams[side_number_] : nullptr; + if (t && t->owns_village(loc_)) return nullptr; undo.reset(new editor_action_village_delete(loc_)); @@ -58,7 +58,7 @@ void editor_action_village::perform_without_undo(map_context& mc) const } //TODO 0 is a bad argument - teams[side_number_].get_village(loc_, 0, NULL); + teams[side_number_].get_village(loc_, 0, nullptr); } diff --git a/src/editor/action/mouse/mouse_action.cpp b/src/editor/action/mouse/mouse_action.cpp index e08015d0451f..9dd4562a0905 100644 --- a/src/editor/action/mouse/mouse_action.cpp +++ b/src/editor/action/mouse/mouse_action.cpp @@ -53,37 +53,37 @@ std::set mouse_action::affected_hexes( editor_action* mouse_action::drag_left(editor_display& /*disp*/, int /*x*/, int /*y*/, bool& /*partial*/, editor_action* /*last_undo*/) { - return NULL; + return nullptr; } editor_action* mouse_action::drag_right(editor_display& /*disp*/, int /*x*/, int /*y*/, bool& /*partial*/, editor_action* /*last_undo*/) { - return NULL; + return nullptr; } editor_action* mouse_action::drag_end_left( editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } editor_action* mouse_action::drag_end_right( editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } editor_action* mouse_action::up_right( editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } editor_action* mouse_action::up_left( editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } editor_action* mouse_action::key_event( @@ -97,12 +97,12 @@ editor_action* mouse_action::key_event( disp.scroll_to_tile(pos, display::WARP); } } - return NULL; + return nullptr; } if (!disp.map().on_board(previous_move_hex_) || event.type != SDL_KEYUP) { - return NULL; + return nullptr; } - editor_action* a = NULL; + editor_action* a = nullptr; if ((has_alt_modifier() && (event.key.keysym.sym >= '1' && event.key.keysym.sym <= '9')) || event.key.keysym.sym == SDLK_DELETE) { int res = event.key.keysym.sym - '0'; @@ -119,7 +119,7 @@ editor_action* mouse_action::key_event( void mouse_action::set_mouse_overlay(editor_display& disp) { - disp.set_mouseover_hex_overlay(NULL); + disp.set_mouseover_hex_overlay(nullptr); } bool mouse_action::has_alt_modifier() const @@ -147,9 +147,9 @@ void mouse_action::set_terrain_mouse_overlay(editor_display& disp, const t_trans surface image_fg(image::get_image(disp.get_map().get_terrain_info(fg).editor_image())); surface image_bg(image::get_image(disp.get_map().get_terrain_info(bg).editor_image())); - if (image_fg == NULL || image_bg == NULL) { + if (image_fg == nullptr || image_bg == nullptr) { ERR_ED << "Missing terrain icon" << std::endl; - disp.set_mouseover_hex_overlay(NULL); + disp.set_mouseover_hex_overlay(nullptr); return; } @@ -172,12 +172,12 @@ void mouse_action::set_terrain_mouse_overlay(editor_display& disp, const t_trans // Blit left side image_fg = scale_surface(image_fg, new_size, new_size); SDL_Rect rcDestLeft = sdl::create_rect(offset, quarter_size, 0, 0); - blit_surface ( image_fg, NULL, image, &rcDestLeft ); + blit_surface ( image_fg, nullptr, image, &rcDestLeft ); // Blit right side image_bg = scale_surface(image_bg, new_size, new_size); SDL_Rect rcDestRight = sdl::create_rect(half_size, quarter_size, 0, 0); - blit_surface ( image_bg, NULL, image, &rcDestRight ); + blit_surface ( image_bg, nullptr, image, &rcDestRight ); //apply mask so the overlay is contained within the mouseover hex image = mask_surface(image, image::get_hexmask()); @@ -230,7 +230,7 @@ editor_action* brush_drag_mouse_action::drag_right(editor_display& disp, editor_action* brush_drag_mouse_action::drag_end( editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } template &)> @@ -246,7 +246,7 @@ editor_action* brush_drag_mouse_action::drag_generic(editor_display& disp, int x previous_drag_hex_ = hex; return a; } else { - return NULL; + return nullptr; } } @@ -263,7 +263,7 @@ editor_action* mouse_action_paint::click_left(editor_display& disp, int x, int y if (has_ctrl_modifier()) { map_location hex = disp.hex_clicked_on(x, y); terrain_palette_.select_fg_item(disp.map().get_terrain(hex)); - return NULL; + return nullptr; } else { return brush_drag_mouse_action::click_left(disp, x, y); } @@ -274,7 +274,7 @@ editor_action* mouse_action_paint::click_right(editor_display& disp, int x, int if (has_ctrl_modifier()) { map_location hex = disp.hex_clicked_on(x, y); terrain_palette_.select_bg_item(disp.map().get_terrain(hex)); - return NULL; + return nullptr; } else { return brush_drag_mouse_action::click_right(disp, x, y); } @@ -283,7 +283,7 @@ editor_action* mouse_action_paint::click_right(editor_display& disp, int x, int editor_action* mouse_action_paint::click_perform_left( editor_display& /*disp*/, const std::set& hexes) { - if (has_ctrl_modifier()) return NULL; + if (has_ctrl_modifier()) return nullptr; return new editor_action_chain(new editor_action_paint_area( hexes, terrain_palette_.selected_fg_item(), has_shift_modifier())); } @@ -291,7 +291,7 @@ editor_action* mouse_action_paint::click_perform_left( editor_action* mouse_action_paint::click_perform_right( editor_display& /*disp*/, const std::set& hexes) { - if (has_ctrl_modifier()) return NULL; + if (has_ctrl_modifier()) return nullptr; return new editor_action_chain(new editor_action_paint_area( hexes, terrain_palette_.selected_bg_item(), has_shift_modifier())); } @@ -326,7 +326,7 @@ editor_action* mouse_action_paste::click_left(editor_display& disp, int x, int y editor_action* mouse_action_paste::click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } void mouse_action_paste::set_mouse_overlay(editor_display& disp) @@ -337,7 +337,7 @@ void mouse_action_paste::set_mouse_overlay(editor_display& disp) surface image = create_neutral_surface(72,72); SDL_Rect r = sdl::create_rect(6, 6, 0, 0); - blit_surface(image60, NULL, image, &r); + blit_surface(image60, nullptr, image, &r); Uint8 alpha = 196; int size = image->w; @@ -359,7 +359,7 @@ editor_action* mouse_action_fill::click_left(editor_display& disp, int x, int y) map_location hex = disp.hex_clicked_on(x, y); if (has_ctrl_modifier()) { terrain_palette_.select_fg_item(disp.map().get_terrain(hex)); - return NULL; + return nullptr; } else { /** @todo only take the base terrain into account when searching for contiguous terrain when painting base only */ //or use a different key modifier for that @@ -374,7 +374,7 @@ editor_action* mouse_action_fill::click_right(editor_display& disp, int x, int y map_location hex = disp.hex_clicked_on(x, y); if (has_ctrl_modifier()) { terrain_palette_.select_bg_item(disp.map().get_terrain(hex)); - return NULL; + return nullptr; } else { /** @todo only take the base terrain into account when searching for contiguous terrain when painting base only */ //or use a different key modifier for that @@ -392,11 +392,11 @@ void mouse_action_fill::set_mouse_overlay(editor_display& disp) editor_action* mouse_action_starting_position::up_left(editor_display& disp, int x, int y) { - if (!click_) return NULL; + if (!click_) return nullptr; click_ = false; map_location hex = disp.hex_clicked_on(x, y); if (!disp.map().on_board(hex)) { - return NULL; + return nullptr; } const unsigned player_starting_at_hex = disp.map().is_starting_position(hex); @@ -412,7 +412,7 @@ editor_action* mouse_action_starting_position::up_left(editor_display& disp, int dlg.show(disp.video()); unsigned new_player_at_hex = dlg.result(); // 1st player = 1 - editor_action* a = NULL; + editor_action* a = nullptr; if(new_player_at_hex != player_starting_at_hex) { if(!new_player_at_hex) { @@ -432,7 +432,7 @@ editor_action* mouse_action_starting_position::up_left(editor_display& disp, int editor_action* mouse_action_starting_position::click_left(editor_display& /*disp*/, int /*x*/, int /*y*/) { click_ = true; - return NULL; + return nullptr; } editor_action* mouse_action_starting_position::up_right(editor_display& disp, int x, int y) @@ -442,13 +442,13 @@ editor_action* mouse_action_starting_position::up_right(editor_display& disp, in if (player_starting_at_hex != -1) { return new editor_action_starting_position(map_location(), player_starting_at_hex); } else { - return NULL; + return nullptr; } } editor_action* mouse_action_starting_position::click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } void mouse_action_starting_position::set_mouse_overlay(editor_display& disp) @@ -459,7 +459,7 @@ void mouse_action_starting_position::set_mouse_overlay(editor_display& disp) surface image = create_neutral_surface(72,72); SDL_Rect r = sdl::create_rect(6, 6, 0, 0); - blit_surface(image60, NULL, image, &r); + blit_surface(image60, nullptr, image, &r); Uint8 alpha = 196; int size = image->w; diff --git a/src/editor/action/mouse/mouse_action.hpp b/src/editor/action/mouse/mouse_action.hpp index d075487aebc7..4ba240deb46a 100644 --- a/src/editor/action/mouse/mouse_action.hpp +++ b/src/editor/action/mouse/mouse_action.hpp @@ -41,7 +41,7 @@ class mouse_action mouse_action(common_palette& palette, const CKey& key) : previous_move_hex_() , key_(key) - , toolbar_button_(NULL) + , toolbar_button_(nullptr) , palette_(palette) { } @@ -105,12 +105,12 @@ class mouse_action /** * Helper variable setter - pointer to a toolbar menu/button used for highlighting - * the current action. Should always be NULL or point to a valid menu. + * the current action. Should always be nullptr or point to a valid menu. */ void set_toolbar_button(const theme::menu* value) { toolbar_button_ = value; } /** - * Getter for the (possibly NULL) associated menu/button. + * Getter for the (possibly nullptr) associated menu/button. */ const theme::menu* toolbar_button() const { return toolbar_button_; } @@ -374,7 +374,7 @@ class mouse_action_starting_position : public mouse_action /** * Left click displays a player-number-selector dialog and then creates an action - * or returns NULL if cancel was pressed or there would be no change. + * or returns nullptr if cancel was pressed or there would be no change. * Do this on mouse up to avoid drag issue. */ editor_action* up_left(editor_display& disp, int x, int y); diff --git a/src/editor/action/mouse/mouse_action_item.cpp b/src/editor/action/mouse/mouse_action_item.cpp index 3127761ae494..5af192f0879e 100644 --- a/src/editor/action/mouse/mouse_action_item.cpp +++ b/src/editor/action/mouse/mouse_action_item.cpp @@ -47,7 +47,7 @@ void mouse_action_item::move(editor_display& disp, const map_location& hex) // const item_map::const_item_iterator item_it = items.find(hex); // if (item_it != items.end()) { // -// disp.set_mouseover_hex_overlay(NULL); +// disp.set_mouseover_hex_overlay(nullptr); // // SDL_Rect rect; // rect.x = disp.get_location_x(hex); @@ -71,7 +71,7 @@ editor_action* mouse_action_item::click_left(editor_display& disp, int x, int y) { start_hex_ = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(start_hex_)) { - return NULL; + return nullptr; } const overlay& item = item_palette_.selected_fg_item(); @@ -84,23 +84,23 @@ editor_action* mouse_action_item::click_left(editor_display& disp, int x, int y) // set_item_mouse_overlay(disp, item_it->type()); click_ = true; - return NULL; + return nullptr; } editor_action* mouse_action_item::drag_left(editor_display& disp, int x, int y, bool& /*partial*/, editor_action* /*last_undo*/) { map_location hex = disp.hex_clicked_on(x, y); click_ = (hex == start_hex_); - return NULL; + return nullptr; } editor_action* mouse_action_item::up_left(editor_display& disp, int x, int y) { - if (!click_) return NULL; + if (!click_) return nullptr; click_ = false; map_location hex = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(hex)) { - return NULL; + return nullptr; } // item_type type = item_palette_.selected_fg_item(); @@ -113,7 +113,7 @@ editor_action* mouse_action_item::up_left(editor_display& disp, int x, int y) // if (!new_item_type) { // //TODO rewrite the error message. // ERR_ED << "create item dialog returned inexistent or unusable item_type id '" << type_id << "'" << std::endl; -// return NULL; +// return nullptr; // } // // const item_type &ut = *new_item_type; @@ -123,22 +123,22 @@ editor_action* mouse_action_item::up_left(editor_display& disp, int x, int y) // editor_action* action = new editor_action_item(hex, new_item); // return action; - return NULL; + return nullptr; } editor_action* mouse_action_item::drag_end_left(editor_display& disp, int x, int y) { - if (click_) return NULL; - editor_action* action = NULL; + if (click_) return nullptr; + editor_action* action = nullptr; map_location hex = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(hex)) - return NULL; + return nullptr; // const item_map& items = disp.get_items(); // const item_map::const_item_iterator item_it = items.find(start_hex_); // if (item_it == items.end()) -// return NULL; +// return nullptr; action = new editor_action_item_replace(start_hex_, hex); return action; @@ -159,7 +159,7 @@ editor_action* mouse_action_item::click_right(editor_display& disp, int x, int y } click_ = true; - return NULL; + return nullptr; } */ @@ -167,7 +167,7 @@ editor_action* mouse_action_item::click_right(editor_display& disp, int x, int y //{ // map_location hex = disp.hex_clicked_on(x, y); // if (previous_move_hex_ == hex) -// return NULL; +// return nullptr; // // click_ = (start_hex_ == hex); // previous_move_hex_ = hex; @@ -185,12 +185,12 @@ editor_action* mouse_action_item::click_right(editor_display& disp, int x, int y // } // } // -// return NULL; +// return nullptr; //} //editor_action* mouse_action_item::up_right(editor_display& disp, int /*x*/, int /*y*/) //{ -// if (!click_) return NULL; +// if (!click_) return nullptr; // click_ = false; // // const item_map& items = disp.get_items(); @@ -199,16 +199,16 @@ editor_action* mouse_action_item::click_right(editor_display& disp, int x, int y // return new editor_action_item_delete(start_hex_); // } // -// return NULL; +// return nullptr; //} //editor_action* mouse_action_item::drag_end_right(editor_display& disp, int x, int y) //{ -// if (click_) return NULL; +// if (click_) return nullptr; // // map_location hex = disp.hex_clicked_on(x, y); // if (!disp.get_map().on_board(hex)) -// return NULL; +// return nullptr; // // if(new_direction_ != old_direction_) { // @@ -219,7 +219,7 @@ editor_action* mouse_action_item::click_right(editor_display& disp, int x, int y // } // } // -// return NULL; +// return nullptr; //} diff --git a/src/editor/action/mouse/mouse_action_item.hpp b/src/editor/action/mouse/mouse_action_item.hpp index 1053281d3c1b..555f0cf6a2bb 100644 --- a/src/editor/action/mouse/mouse_action_item.hpp +++ b/src/editor/action/mouse/mouse_action_item.hpp @@ -61,7 +61,7 @@ class mouse_action_item : public mouse_action editor_action* drag_end_left(editor_display& disp, int x, int y); editor_action* click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } virtual void set_mouse_overlay(editor_display& disp); diff --git a/src/editor/action/mouse/mouse_action_map_label.cpp b/src/editor/action/mouse/mouse_action_map_label.cpp index dd3f4d024429..292a07846d18 100644 --- a/src/editor/action/mouse/mouse_action_map_label.cpp +++ b/src/editor/action/mouse/mouse_action_map_label.cpp @@ -41,10 +41,10 @@ editor_action* mouse_action_map_label::drag_left(editor_display& disp, int x, in /* Cursor is still on old hex field */ if (hex == last_draged_) - return NULL; + return nullptr; click_ = false; - editor_action_chain* chain = NULL; + editor_action_chain* chain = nullptr; const terrain_label* label = get_current_labels()->get_label(last_draged_); @@ -61,12 +61,12 @@ editor_action* mouse_action_map_label::drag_left(editor_display& disp, int x, in editor_action* mouse_action_map_label::up_left(editor_display& disp, int x, int y) { - if (!click_) return NULL; + if (!click_) return nullptr; click_ = false; const map_location hex = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(hex)) { - return NULL; + return nullptr; } const terrain_label* old_label = editor::get_current_labels()->get_label(hex); @@ -80,7 +80,7 @@ editor_action* mouse_action_map_label::up_left(editor_display& disp, int x, int gui2::teditor_edit_label d(label, immutable, visible_fog, visible_shroud, color, category); - editor_action* a = NULL; + editor_action* a = nullptr; if(d.show(disp.video())) { a = new editor_action_label(hex, label, team_name, color , visible_fog, visible_shroud, immutable, category); @@ -91,7 +91,7 @@ editor_action* mouse_action_map_label::up_left(editor_display& disp, int x, int editor_action* mouse_action_map_label::click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } editor_action* mouse_action_map_label::up_right(editor_display& disp, int x, int y) @@ -101,7 +101,7 @@ editor_action* mouse_action_map_label::up_right(editor_display& disp, int x, int //TODO // const terrain_label* clicked_label = disp.map().get_map_labels().get_label(hex); //if (!clicked_label) - // return NULL; + // return nullptr; return new editor_action_label_delete(hex); } @@ -114,7 +114,7 @@ void mouse_action_map_label::set_mouse_overlay(editor_display& disp) surface image = create_neutral_surface(72,72); SDL_Rect r = sdl::create_rect(6, 6, 0, 0); - blit_surface(image60, NULL, image, &r); + blit_surface(image60, nullptr, image, &r); Uint8 alpha = 196; int size = image->w; diff --git a/src/editor/action/mouse/mouse_action_select.cpp b/src/editor/action/mouse/mouse_action_select.cpp index 265376185bb0..595d28c770f1 100644 --- a/src/editor/action/mouse/mouse_action_select.cpp +++ b/src/editor/action/mouse/mouse_action_select.cpp @@ -49,12 +49,12 @@ editor_action* mouse_action_select::click_perform_left( editor_action* mouse_action_select::click_perform_right( editor_display& /*disp*/, const std::set& /*hexes*/) { - return NULL; + return nullptr; } editor_action* mouse_action_select::click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } void mouse_action_select::set_mouse_overlay(editor_display& disp) diff --git a/src/editor/action/mouse/mouse_action_unit.cpp b/src/editor/action/mouse/mouse_action_unit.cpp index da733f50d2f5..244f5c342c34 100644 --- a/src/editor/action/mouse/mouse_action_unit.cpp +++ b/src/editor/action/mouse/mouse_action_unit.cpp @@ -50,7 +50,7 @@ void mouse_action_unit::move(editor_display& disp, const map_location& hex) const unit_map::const_unit_iterator unit_it = units.find(hex); if (unit_it != units.end()) { - disp.set_mouseover_hex_overlay(NULL); + disp.set_mouseover_hex_overlay(nullptr); SDL_Rect rect; rect.x = disp.get_location_x(hex); @@ -77,7 +77,7 @@ editor_action* mouse_action_unit::click_left(editor_display& disp, int x, int y) { start_hex_ = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(start_hex_)) { - return NULL; + return nullptr; } const unit_map& units = disp.get_units(); @@ -86,23 +86,23 @@ editor_action* mouse_action_unit::click_left(editor_display& disp, int x, int y) set_unit_mouse_overlay(disp, unit_it->type()); click_ = true; - return NULL; + return nullptr; } editor_action* mouse_action_unit::drag_left(editor_display& disp, int x, int y, bool& /*partial*/, editor_action* /*last_undo*/) { map_location hex = disp.hex_clicked_on(x, y); click_ = (hex == start_hex_); - return NULL; + return nullptr; } editor_action* mouse_action_unit::up_left(editor_display& disp, int x, int y) { - if (!click_) return NULL; + if (!click_) return nullptr; click_ = false; map_location hex = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(hex)) { - return NULL; + return nullptr; } unit_type type = unit_palette_.selected_fg_item(); @@ -115,7 +115,7 @@ editor_action* mouse_action_unit::up_left(editor_display& disp, int x, int y) if (!new_unit_type) { //TODO rewrite the error message. ERR_ED << "create unit dialog returned inexistent or unusable unit_type id '" << type_id << "'" << std::endl; - return NULL; + return nullptr; } const unit_type &ut = *new_unit_type; @@ -128,17 +128,17 @@ editor_action* mouse_action_unit::up_left(editor_display& disp, int x, int y) editor_action* mouse_action_unit::drag_end_left(editor_display& disp, int x, int y) { - if (click_) return NULL; - editor_action* action = NULL; + if (click_) return nullptr; + editor_action* action = nullptr; map_location hex = disp.hex_clicked_on(x, y); if (!disp.get_map().on_board(hex)) - return NULL; + return nullptr; const unit_map& units = disp.get_units(); const unit_map::const_unit_iterator unit_it = units.find(start_hex_); if (unit_it == units.end()) - return NULL; + return nullptr; action = new editor_action_unit_replace(start_hex_, hex); return action; @@ -159,7 +159,7 @@ editor_action* mouse_action_unit::click_right(editor_display& disp, int x, int y } click_ = true; - return NULL; + return nullptr; } */ @@ -167,7 +167,7 @@ editor_action* mouse_action_unit::click_right(editor_display& disp, int x, int y //{ // map_location hex = disp.hex_clicked_on(x, y); // if (previous_move_hex_ == hex) -// return NULL; +// return nullptr; // // click_ = (start_hex_ == hex); // previous_move_hex_ = hex; @@ -185,12 +185,12 @@ editor_action* mouse_action_unit::click_right(editor_display& disp, int x, int y // } // } // -// return NULL; +// return nullptr; //} //editor_action* mouse_action_unit::up_right(editor_display& disp, int /*x*/, int /*y*/) //{ -// if (!click_) return NULL; +// if (!click_) return nullptr; // click_ = false; // // const unit_map& units = disp.get_units(); @@ -199,16 +199,16 @@ editor_action* mouse_action_unit::click_right(editor_display& disp, int x, int y // return new editor_action_unit_delete(start_hex_); // } // -// return NULL; +// return nullptr; //} //editor_action* mouse_action_unit::drag_end_right(editor_display& disp, int x, int y) //{ -// if (click_) return NULL; +// if (click_) return nullptr; // // map_location hex = disp.hex_clicked_on(x, y); // if (!disp.get_map().on_board(hex)) -// return NULL; +// return nullptr; // // if(new_direction_ != old_direction_) { // @@ -219,7 +219,7 @@ editor_action* mouse_action_unit::click_right(editor_display& disp, int x, int y // } // } // -// return NULL; +// return nullptr; //} diff --git a/src/editor/action/mouse/mouse_action_unit.hpp b/src/editor/action/mouse/mouse_action_unit.hpp index badb491b3bfb..7a7fc872ae25 100644 --- a/src/editor/action/mouse/mouse_action_unit.hpp +++ b/src/editor/action/mouse/mouse_action_unit.hpp @@ -61,7 +61,7 @@ class mouse_action_unit : public mouse_action editor_action* drag_end_left(editor_display& disp, int x, int y); editor_action* click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) { - return NULL; + return nullptr; } virtual void set_mouse_overlay(editor_display& disp); diff --git a/src/editor/action/mouse/mouse_action_village.cpp b/src/editor/action/mouse/mouse_action_village.cpp index 55c5816bc0d6..97361a0cf75b 100644 --- a/src/editor/action/mouse/mouse_action_village.cpp +++ b/src/editor/action/mouse/mouse_action_village.cpp @@ -22,8 +22,8 @@ namespace editor { editor_action* mouse_action_village::up_left(editor_display& disp, int x, int y) { map_location hex = disp.hex_clicked_on(x, y); - if (!disp.get_map().on_board(hex)) return NULL; - if (!disp.get_map().is_village(hex)) return NULL; + if (!disp.get_map().on_board(hex)) return nullptr; + if (!disp.get_map().is_village(hex)) return nullptr; return new editor_action_village(hex, disp.playing_team()); } @@ -31,8 +31,8 @@ editor_action* mouse_action_village::up_left(editor_display& disp, int x, int y) editor_action* mouse_action_village::up_right(editor_display& disp, int x, int y) { map_location hex = disp.hex_clicked_on(x, y); - if (!disp.get_map().on_board(hex)) return NULL; - if (!disp.get_map().is_village(hex)) return NULL; + if (!disp.get_map().on_board(hex)) return nullptr; + if (!disp.get_map().is_village(hex)) return nullptr; return new editor_action_village_delete(hex); } @@ -45,7 +45,7 @@ void mouse_action_village::set_mouse_overlay(editor_display& disp) surface image = create_neutral_surface(72,72); SDL_Rect r = sdl::create_rect(6, 6, 0, 0); - blit_surface(image60, NULL, image, &r); + blit_surface(image60, nullptr, image, &r); Uint8 alpha = 196; int size = image->w; diff --git a/src/editor/action/mouse/mouse_action_village.hpp b/src/editor/action/mouse/mouse_action_village.hpp index 597ba53078b2..cb1d073a1af2 100644 --- a/src/editor/action/mouse/mouse_action_village.hpp +++ b/src/editor/action/mouse/mouse_action_village.hpp @@ -37,7 +37,7 @@ class mouse_action_village : public mouse_action /** * No action. */ - editor_action* click_left(editor_display& /*disp*/, int /*x*/, int /*y*/) {return NULL;} + editor_action* click_left(editor_display& /*disp*/, int /*x*/, int /*y*/) {return nullptr;} /** * If clicked on a village hex field, assigns the ownership of it to the current side. @@ -47,7 +47,7 @@ class mouse_action_village : public mouse_action /** * No action. */ - editor_action* click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) {return NULL;} + editor_action* click_right(editor_display& /*disp*/, int /*x*/, int /*y*/) {return nullptr;} /** * If clicked on a village hex field, unassigns it's ownership. diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index b104388312db..674a943f84c2 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -71,10 +71,10 @@ editor_controller::editor_controller(const config &game_config, CVideo& video) , gui_(new editor_display(editor::get_dummy_display_context(), video, *reports_, controller_base::get_theme(game_config, "editor"), config())) , tods_() , context_manager_(new context_manager(*gui_.get(), game_config_)) - , toolkit_(NULL) + , toolkit_(nullptr) , tooltip_manager_(video) - , floating_label_manager_(NULL) - , help_manager_(NULL) + , floating_label_manager_(nullptr) + , help_manager_(nullptr) , do_quit_(false) , quit_mode_(EXIT_ERROR) , music_tracks_() @@ -163,12 +163,12 @@ void editor_controller::init_music(const config& game_config) editor_controller::~editor_controller() { - resources::units = NULL; - resources::tod_manager = NULL; - resources::teams = NULL; + resources::units = nullptr; + resources::tod_manager = nullptr; + resources::teams = nullptr; - resources::classification = NULL; - resources::mp_settings = NULL; + resources::classification = nullptr; + resources::mp_settings = nullptr; } EXIT_STATUS editor_controller::main_loop() @@ -738,7 +738,7 @@ bool editor_controller::execute_command(const hotkey::hotkey_command& cmd, int i toolkit_->get_palette_manager()->active_palette().swap(); return true; case HOTKEY_EDITOR_PARTIAL_UNDO: - if (dynamic_cast(context_manager_->get_map_context().last_undo_action()) != NULL) { + if (dynamic_cast(context_manager_->get_map_context().last_undo_action()) != nullptr) { context_manager_->get_map_context().partial_undo(); context_manager_->refresh_after_action(); } else { @@ -1228,20 +1228,20 @@ void editor_controller::mouse_motion(int x, int y, const bool /*browse*/, if (mouse_handler_base::mouse_motion_default(x, y, update)) return; map_location hex_clicked = gui().hex_clicked_on(x, y); if (context_manager_->get_map().on_board_with_border(drag_from_hex_) && is_dragging()) { - editor_action* a = NULL; + editor_action* a = nullptr; bool partial = false; editor_action* last_undo = context_manager_->get_map_context().last_undo_action(); - if (dragging_left_ && (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(1)) != 0) { + if (dragging_left_ && (SDL_GetMouseState(nullptr, nullptr) & SDL_BUTTON(1)) != 0) { if (!context_manager_->get_map().on_board_with_border(hex_clicked)) return; a = toolkit_->get_mouse_action()->drag_left(*gui_, x, y, partial, last_undo); - } else if (dragging_right_ && (SDL_GetMouseState(NULL, NULL) & SDL_BUTTON(3)) != 0) { + } else if (dragging_right_ && (SDL_GetMouseState(nullptr, nullptr) & SDL_BUTTON(3)) != 0) { if (!context_manager_->get_map().on_board_with_border(hex_clicked)) return; a = toolkit_->get_mouse_action()->drag_right(*gui_, x, y, partial, last_undo); } //Partial means that the mouse action has modified the //last undo action and the controller shouldn't add //anything to the undo stack (hence a different perform_ call) - if (a != NULL) { + if (a != nullptr) { boost::scoped_ptr aa(a); if (partial) { context_manager_->get_map_context().perform_partial_action(*a); diff --git a/src/editor/controller/editor_controller.hpp b/src/editor/controller/editor_controller.hpp index af684cd7e0d2..ab4cce2a4a7c 100644 --- a/src/editor/controller/editor_controller.hpp +++ b/src/editor/controller/editor_controller.hpp @@ -171,13 +171,13 @@ class editor_controller : public controller_base, /** * Perform an action, then delete the action object. - * The pointer can be NULL, in which case nothing will happen. + * The pointer can be nullptr, in which case nothing will happen. */ void perform_delete(editor_action* action); /** * Peform an action on the current map_context, then refresh the display - * and delete the pointer. The pointer can be NULL, in which case nothing will happen. + * and delete the pointer. The pointer can be nullptr, in which case nothing will happen. */ void perform_refresh_delete(editor_action* action, bool drag_part = false); diff --git a/src/editor/map/context_manager.cpp b/src/editor/map/context_manager.cpp index 0dedc4f1ac57..4f9eb376ba3c 100644 --- a/src/editor/map/context_manager.cpp +++ b/src/editor/map/context_manager.cpp @@ -140,7 +140,7 @@ context_manager::context_manager(editor_display& gui, const config& game_config) , game_config_(game_config) , default_dir_(preferences::editor::default_dir()) , map_generators_() - , last_map_generator_(NULL) + , last_map_generator_(nullptr) , current_context_index_(0) , auto_update_transitions_(preferences::editor::auto_update_transitions()) , map_contexts_() @@ -415,7 +415,7 @@ void context_manager::expand_time_menu(std::vector& items) tod_manager* tod_m = get_map_context().get_time_manager(); - assert(tod_m != NULL); + assert(tod_m != nullptr); BOOST_FOREACH(const time_of_day& time, tod_m->times()) { diff --git a/src/editor/map/map_context.cpp b/src/editor/map/map_context.cpp index e31d472dadb4..ed000ea5923f 100644 --- a/src/editor/map/map_context.cpp +++ b/src/editor/map/map_context.cpp @@ -64,7 +64,7 @@ map_context::map_context(const editor_map& map, const display& disp, bool pure_m , victory_defeated_(true) , random_time_(false) , active_area_(-1) - , labels_(disp, NULL) + , labels_(disp, nullptr) , units_() , teams_() , tod_manager_(new tod_manager(schedule)) @@ -96,7 +96,7 @@ map_context::map_context(const config& game_config, const std::string& filename, , victory_defeated_(true) , random_time_(false) , active_area_(-1) - , labels_(disp, NULL) + , labels_(disp, nullptr) , units_() , teams_() , tod_manager_(new tod_manager(game_config.find_child("editor_times", "id", "default"))) @@ -314,7 +314,7 @@ void map_context::load_scenario(const config& game_config) teams_.push_back(t); BOOST_FOREACH(config &a_unit, side.child_range("unit")) { - map_location loc(a_unit, NULL); + map_location loc(a_unit, nullptr); a_unit["side"] = i; units_.add(loc, unit(a_unit, true) ); } @@ -603,7 +603,7 @@ void map_context::perform_partial_action(const editor_action& action) throw editor_logic_exception("Empty undo stack in perform_partial_action()"); } editor_action_chain* undo_chain = dynamic_cast(last_undo_action()); - if (undo_chain == NULL) { + if (undo_chain == nullptr) { throw editor_logic_exception("Last undo action not a chain in perform_partial_action()"); } editor_action* undo = action.perform(*this); @@ -639,22 +639,22 @@ bool map_context::can_redo() const editor_action* map_context::last_undo_action() { - return undo_stack_.empty() ? NULL : undo_stack_.back(); + return undo_stack_.empty() ? nullptr : undo_stack_.back(); } editor_action* map_context::last_redo_action() { - return redo_stack_.empty() ? NULL : redo_stack_.back(); + return redo_stack_.empty() ? nullptr : redo_stack_.back(); } const editor_action* map_context::last_undo_action() const { - return undo_stack_.empty() ? NULL : undo_stack_.back(); + return undo_stack_.empty() ? nullptr : undo_stack_.back(); } const editor_action* map_context::last_redo_action() const { - return redo_stack_.empty() ? NULL : redo_stack_.back(); + return redo_stack_.empty() ? nullptr : redo_stack_.back(); } void map_context::undo() @@ -688,7 +688,7 @@ void map_context::partial_undo() throw editor_logic_exception("Empty undo stack in partial_undo()"); } editor_action_chain* undo_chain = dynamic_cast(last_undo_action()); - if (undo_chain == NULL) { + if (undo_chain == nullptr) { throw editor_logic_exception("Last undo action not a chain in partial undo"); } //a partial undo performs the first action form the current action's action_chain that would be normally performed diff --git a/src/editor/map/map_context.hpp b/src/editor/map/map_context.hpp index 672881ba73fb..ada5c2b554f4 100644 --- a/src/editor/map/map_context.hpp +++ b/src/editor/map/map_context.hpp @@ -341,10 +341,10 @@ class map_context : public display_context, private boost::noncopyable /** @return true when redo can be performed, false otherwise */ bool can_redo() const; - /** @return a pointer to the last undo action or NULL if the undo stack is empty */ + /** @return a pointer to the last undo action or nullptr if the undo stack is empty */ editor_action* last_undo_action(); - /** @return a pointer to the last redo action or NULL if the undo stack is empty */ + /** @return a pointer to the last redo action or nullptr if the undo stack is empty */ editor_action* last_redo_action(); /** const version of last_undo_action */ diff --git a/src/editor/palette/editor_palettes.cpp b/src/editor/palette/editor_palettes.cpp index 9483aaeb421e..82ed90f9dab4 100644 --- a/src/editor/palette/editor_palettes.cpp +++ b/src/editor/palette/editor_palettes.cpp @@ -375,7 +375,7 @@ void editor_palette::draw_contents() //typedef std::map item_map_wurscht; typename item_map::iterator item = item_map_.find(item_id); - surface item_image(NULL); + surface item_image(nullptr); std::stringstream tooltip_text; draw_item((*item).second, item_image, tooltip_text); diff --git a/src/editor/palette/empty_palette.hpp b/src/editor/palette/empty_palette.hpp index aa5b357e99d7..dc7c2571b9ae 100644 --- a/src/editor/palette/empty_palette.hpp +++ b/src/editor/palette/empty_palette.hpp @@ -66,7 +66,7 @@ class empty_palette : public common_palette { } } - std::vector* get_widgets() { return NULL; } + std::vector* get_widgets() { return nullptr; } //group virtual void set_group(size_t /*index*/) {} diff --git a/src/editor/palette/item_palette.cpp b/src/editor/palette/item_palette.cpp index 5e3f6461d571..c49f9186036a 100644 --- a/src/editor/palette/item_palette.cpp +++ b/src/editor/palette/item_palette.cpp @@ -68,11 +68,11 @@ void item_palette::draw_item(const overlay& item, surface& image, std::stringstr filename << item.halo; image = image::get_image(filename.str()); - if(image == NULL) { + if(image == nullptr) { tooltip_text << "IMAGE NOT FOUND\n"; ERR_ED << "image for item type: '" << filename.str() << "' not found" << std::endl; image = image::get_image(game_config::images::missing); - if (image == NULL) { + if (image == nullptr) { ERR_ED << "Placeholder image not found" << std::endl; return; } diff --git a/src/editor/palette/terrain_palettes.cpp b/src/editor/palette/terrain_palettes.cpp index e83a248ae1a5..387ec8d96eb5 100644 --- a/src/editor/palette/terrain_palettes.cpp +++ b/src/editor/palette/terrain_palettes.cpp @@ -166,11 +166,11 @@ void terrain_palette::draw_item(const t_translation::t_terrain& terrain, const std::string base_filename = map().get_terrain_info(base_terrain).editor_image(); surface base_image(image::get_image(base_filename)); - if(base_image == NULL) { + if(base_image == nullptr) { tooltip_text << "BASE IMAGE NOT FOUND\n"; ERR_ED << "image for terrain : '" << base_filename << "' not found" << std::endl; base_image = image::get_image(game_config::images::missing); - if (base_image == NULL) { + if (base_image == nullptr) { ERR_ED << "Placeholder image not found" << std::endl; return; } @@ -184,11 +184,11 @@ void terrain_palette::draw_item(const t_translation::t_terrain& terrain, const std::string filename = map().get_terrain_info(terrain).editor_image(); image = image::get_image(filename); - if(image == NULL) { + if(image == nullptr) { tooltip_text << "IMAGE NOT FOUND\n"; ERR_ED << "image for terrain: '" << filename << "' not found" << std::endl; image = image::get_image(game_config::images::missing); - if (image == NULL) { + if (image == nullptr) { ERR_ED << "Placeholder image not found" << std::endl; return; } diff --git a/src/editor/palette/tristate_button.cpp b/src/editor/palette/tristate_button.cpp index 06d60165616b..269c2a09df26 100644 --- a/src/editor/palette/tristate_button.cpp +++ b/src/editor/palette/tristate_button.cpp @@ -42,11 +42,11 @@ tristate_button::tristate_button(CVideo& video, std::string button_image_name, const bool auto_join) : widget(video, auto_join), - baseImage_(NULL), touchedBaseImage_(NULL), activeBaseImage_(NULL), - itemImage_(NULL), - pressedDownImage_(NULL), pressedUpImage_(NULL), pressedBothImage_(NULL), - pressedBothActiveImage_(NULL), pressedDownActiveImage_(NULL), pressedUpActiveImage_(NULL), - touchedDownImage_(NULL), touchedUpImage_(NULL), touchedBothImage_(NULL), + baseImage_(nullptr), touchedBaseImage_(nullptr), activeBaseImage_(nullptr), + itemImage_(nullptr), + pressedDownImage_(nullptr), pressedUpImage_(nullptr), pressedBothImage_(nullptr), + pressedBothActiveImage_(nullptr), pressedDownActiveImage_(nullptr), pressedUpActiveImage_(nullptr), + touchedDownImage_(nullptr), touchedUpImage_(nullptr), touchedBothImage_(nullptr), textRect_(), state_(NORMAL), pressed_(false), base_height_(0), base_width_(0), @@ -164,9 +164,9 @@ void tristate_button::enable(bool new_val) { void tristate_button::draw_contents() { - surface image(NULL); + surface image(nullptr); - surface overlay(NULL); + surface overlay(nullptr); surface base = baseImage_; int offset = 0; @@ -244,11 +244,11 @@ void tristate_button::draw_contents() { //TODO avoid magic numbers SDL_Rect r = sdl::create_rect(1, 1, 0, 0); - blit_surface(nitem, NULL, nbase, &r); + blit_surface(nitem, nullptr, nbase, &r); if (!overlay.null()) { surface noverlay = make_neutral_surface(overlay); - blit_surface(noverlay, NULL, nbase, NULL); + blit_surface(noverlay, nullptr, nbase, nullptr); } // TODO for later reference diff --git a/src/editor/palette/unit_palette.cpp b/src/editor/palette/unit_palette.cpp index 271296d534bc..7a427c25cfaf 100644 --- a/src/editor/palette/unit_palette.cpp +++ b/src/editor/palette/unit_palette.cpp @@ -86,11 +86,11 @@ void unit_palette::draw_item(const unit_type& u, surface& image, std::stringstre << team::get_side_color_index(gui_.viewing_side()) << ')'; image = image::get_image(filename.str()); - if(image == NULL) { + if(image == nullptr) { tooltip_text << "IMAGE NOT FOUND\n"; ERR_ED << "image for unit type: '" << filename.str() << "' not found" << std::endl; image = image::get_image(game_config::images::missing); - if (image == NULL) { + if (image == nullptr) { ERR_ED << "Placeholder image not found" << std::endl; return; } diff --git a/src/editor/toolkit/editor_toolkit.cpp b/src/editor/toolkit/editor_toolkit.cpp index 8c46d03c8998..33a3304ab26c 100644 --- a/src/editor/toolkit/editor_toolkit.cpp +++ b/src/editor/toolkit/editor_toolkit.cpp @@ -31,9 +31,9 @@ editor_toolkit::editor_toolkit(editor_display& gui, const CKey& key, : gui_(gui) , key_(key) , palette_manager_() - , mouse_action_(NULL) + , mouse_action_(nullptr) , mouse_actions_() - , brush_(NULL) + , brush_(nullptr) , brushes_() { init_brushes(game_config); diff --git a/src/events.hpp b/src/events.hpp index 7c101902c79b..b6b08f81b7c2 100644 --- a/src/events.hpp +++ b/src/events.hpp @@ -49,7 +49,7 @@ class sdl_handler virtual void volatile_draw() {} virtual void volatile_undraw() {} - virtual bool requires_event_focus(const SDL_Event * = NULL) const { return false; } + virtual bool requires_event_focus(const SDL_Event * = nullptr) const { return false; } virtual void process_help_string(int /*mousex*/, int /*mousey*/) {} virtual void process_tooltip_string(int /*mousex*/, int /*mousey*/) {} @@ -102,7 +102,7 @@ void peek_for_resize(); struct pump_info { pump_info() : resize_dimensions(), ticks_(0) {} std::pair resize_dimensions; - int ticks(unsigned *refresh_counter=NULL, unsigned refresh_rate=1); + int ticks(unsigned *refresh_counter=nullptr, unsigned refresh_rate=1); private: int ticks_; //0 if not calculated }; diff --git a/src/fake_unit_ptr.cpp b/src/fake_unit_ptr.cpp index 50ffe3ad99bc..139f3838affd 100644 --- a/src/fake_unit_ptr.cpp +++ b/src/fake_unit_ptr.cpp @@ -20,13 +20,13 @@ #include -fake_unit_ptr::fake_unit_ptr() : unit_(), my_manager_(NULL) {} -fake_unit_ptr::fake_unit_ptr(const internal_ptr & u) : unit_(u), my_manager_(NULL) {} -fake_unit_ptr::fake_unit_ptr(const internal_ptr & u, fake_unit_manager * mgr) : unit_(u), my_manager_(NULL) +fake_unit_ptr::fake_unit_ptr() : unit_(), my_manager_(nullptr) {} +fake_unit_ptr::fake_unit_ptr(const internal_ptr & u) : unit_(u), my_manager_(nullptr) {} +fake_unit_ptr::fake_unit_ptr(const internal_ptr & u, fake_unit_manager * mgr) : unit_(u), my_manager_(nullptr) { place_on_fake_unit_manager(mgr); } -fake_unit_ptr::fake_unit_ptr(const fake_unit_ptr & ptr) : unit_(ptr.unit_), my_manager_(NULL) {} +fake_unit_ptr::fake_unit_ptr(const fake_unit_ptr & ptr) : unit_(ptr.unit_), my_manager_(nullptr) {} void fake_unit_ptr::swap (fake_unit_ptr & o) { boost::swap(unit_, o.unit_); @@ -60,7 +60,7 @@ fake_unit_ptr & fake_unit_ptr::operator=(fake_unit_ptr other) { this->~fake_unit(); new (this) fake_unit(a); // Restore our old manager. - if ( mgr != NULL ) + if ( mgr != nullptr ) place_on_fake_unit_manager(mgr); } return *this; @@ -113,7 +113,7 @@ fake_unit_ptr::~fake_unit_ptr() * Duplicate additions are not allowed. */ void fake_unit_ptr::place_on_fake_unit_manager(fake_unit_manager * manager){ - assert(my_manager_ == NULL); //Can only be placed on 1 fake_unit_manager + assert(my_manager_ == nullptr); //Can only be placed on 1 fake_unit_manager my_manager_=manager; my_manager_->place_temporary_unit(unit_.get()); } @@ -125,9 +125,9 @@ void fake_unit_ptr::place_on_fake_unit_manager(fake_unit_manager * manager){ */ int fake_unit_ptr::remove_from_fake_unit_manager(){ int ret(0); - if(my_manager_ != NULL){ + if(my_manager_ != nullptr){ ret = my_manager_->remove_temporary_unit(unit_.get()); - my_manager_=NULL; + my_manager_=nullptr; } return ret; } diff --git a/src/filechooser.cpp b/src/filechooser.cpp index 3a6fcaf75d21..6434c949838c 100644 --- a/src/filechooser.cpp +++ b/src/filechooser.cpp @@ -63,7 +63,7 @@ file_dialog::file_dialog(CVideo& video, const std::string& file_path, bool show_directory_buttons) : gui::dialog(video, title, file_path, gui::OK_CANCEL), show_directory_buttons_(show_directory_buttons), - files_list_(NULL), + files_list_(nullptr), last_selection_(-1), last_textbox_text_(), chosen_file_(".."), diff --git a/src/filesystem.hpp b/src/filesystem.hpp index 269a798bc1b4..8808bbdfd4fa 100644 --- a/src/filesystem.hpp +++ b/src/filesystem.hpp @@ -51,7 +51,7 @@ enum file_reorder_option { DONT_REORDER, DO_REORDER }; /** * Populates 'files' with all the files and * 'dirs' with all the directories in dir. - * If files or dirs are NULL they will not be used. + * If files or dirs are nullptr they will not be used. * * mode: determines whether the entire path or just the filename is retrieved. * filter: determines if we skip images and sounds directories @@ -60,11 +60,11 @@ enum file_reorder_option { DONT_REORDER, DO_REORDER }; */ void get_files_in_dir(const std::string &dir, std::vector* files, - std::vector* dirs=NULL, + std::vector* dirs=nullptr, file_name_option mode = FILE_NAME_ONLY, file_filter_option filter = NO_FILTER, file_reorder_option reorder = DONT_REORDER, - file_tree_checksum* checksum = NULL); + file_tree_checksum* checksum = nullptr); std::string get_dir(const std::string &dir); diff --git a/src/filesystem_boost.cpp b/src/filesystem_boost.cpp index eb1bd29ced97..39eb2242a36d 100644 --- a/src/filesystem_boost.cpp +++ b/src/filesystem_boost.cpp @@ -199,7 +199,7 @@ namespace { namespace filesystem { static void push_if_exists(std::vector *vec, const path &file, bool full) { - if (vec != NULL) { + if (vec != nullptr) { if (full) vec->push_back(file.generic_string()); else @@ -353,7 +353,7 @@ void get_files_in_dir(const std::string &dir, } push_if_exists(files, di->path(), mode == ENTIRE_FILE_PATH); - if (checksum != NULL) { + if (checksum != nullptr) { std::time_t mtime = bfs::last_write_time(di->path(), ec); if (ec) { LOG_FS << "Failed to read modification time of " << di->path().string() << ": " << ec.message() << '\n'; @@ -391,13 +391,13 @@ void get_files_in_dir(const std::string &dir, } } - if (files != NULL) + if (files != nullptr) std::sort(files->begin(),files->end()); - if (dirs != NULL) + if (dirs != nullptr) std::sort(dirs->begin(),dirs->end()); - if (files != NULL && reorder == DO_REORDER) { + if (files != nullptr && reorder == DO_REORDER) { // move finalcfg_filename, if present, to the end of the vector for (unsigned int i = 0; i < files->size(); i++) { if (ends_with((*files)[i], "/" + finalcfg_filename)) { @@ -523,8 +523,8 @@ void set_user_data_dir(std::string newprefdir) wchar_t docs_path[MAX_PATH]; - HRESULT res = SHGetFolderPathW(NULL, - CSIDL_PERSONAL | CSIDL_FLAG_CREATE, NULL, + HRESULT res = SHGetFolderPathW(nullptr, + CSIDL_PERSONAL | CSIDL_FLAG_CREATE, nullptr, SHGFP_TYPE_CURRENT, docs_path); if(res != S_OK) { @@ -675,7 +675,7 @@ std::string get_exe_dir() #ifdef _WIN32 wchar_t process_path[MAX_PATH]; SetLastError(ERROR_SUCCESS); - GetModuleFileNameW(NULL, process_path, MAX_PATH); + GetModuleFileNameW(nullptr, process_path, MAX_PATH); if (GetLastError() != ERROR_SUCCESS) { return get_cwd(); } diff --git a/src/filesystem_common.cpp b/src/filesystem_common.cpp index d6def85106c7..7f973a985891 100644 --- a/src/filesystem_common.cpp +++ b/src/filesystem_common.cpp @@ -176,7 +176,7 @@ static void get_file_tree_checksum_internal(const std::string& path, file_tree_c { std::vector dirs; - get_files_in_dir(path,NULL,&dirs, ENTIRE_FILE_PATH, SKIP_MEDIA_DIR, DONT_REORDER, &res); + get_files_in_dir(path,nullptr,&dirs, ENTIRE_FILE_PATH, SKIP_MEDIA_DIR, DONT_REORDER, &res); for(std::vector::const_iterator j = dirs.begin(); j != dirs.end(); ++j) { get_file_tree_checksum_internal(*j,res); @@ -218,8 +218,8 @@ SDL_RWops* load_RWops(const std::string &path) { std::istream *ifs = istream_file(path); if(!ifs) { - ERR_FS << "load_RWops: istream_file returned NULL on " << path << '\n'; - return NULL; + ERR_FS << "load_RWops: istream_file returned nullptr on " << path << '\n'; + return nullptr; } rw->hidden.unknown.data1 = ifs; diff --git a/src/floating_label.cpp b/src/floating_label.cpp index eae51f452c9b..89bcee5ad0f9 100644 --- a/src/floating_label.cpp +++ b/src/floating_label.cpp @@ -46,7 +46,7 @@ floating_label::floating_label(const std::string& text, const surface& surf) #if 0 : img_(), #else - : surf_(surf), buf_(NULL), + : surf_(surf), buf_(nullptr), #endif text_(text), font_size_(SIZE_NORMAL), @@ -96,7 +96,7 @@ sdl::timage floating_label::create_image() surface foreground = text.render(); - if(foreground == NULL) { + if(foreground == nullptr) { ERR_FT << "could not create floating label's text" << std::endl; return sdl::timage(); } @@ -106,14 +106,14 @@ sdl::timage floating_label::create_image() // background is a dark tooltip box surface background = create_neutral_surface(foreground->w + border_*2, foreground->h + border_*2); - if (background == NULL) { + if (background == nullptr) { ERR_FT << "could not create tooltip box" << std::endl; img_ = sdl::timage(foreground); return img_; } Uint32 color = SDL_MapRGBA(foreground->format, bgcolor_.r,bgcolor_.g, bgcolor_.b, bgalpha_); - sdl::fill_rect(background,NULL, color); + sdl::fill_rect(background,nullptr, color); // we make the text less transparent, because the blitting on the // dark background will darken the anti-aliased part. @@ -123,7 +123,7 @@ sdl::timage floating_label::create_image() SDL_Rect r = sdl::create_rect( border_, border_, 0, 0); SDL_SetAlpha(foreground,SDL_SRCALPHA,SDL_ALPHA_OPAQUE); - blit_surface(foreground, NULL, background, &r); + blit_surface(foreground, nullptr, background, &r); img_ = sdl::timage(background); } @@ -131,18 +131,18 @@ sdl::timage floating_label::create_image() // background is blurred shadow of the text surface background = create_neutral_surface (foreground->w + 4, foreground->h + 4); - sdl::fill_rect(background, NULL, 0); + sdl::fill_rect(background, nullptr, 0); SDL_Rect r = { 2, 2, 0, 0 }; - blit_surface(foreground, NULL, background, &r); + blit_surface(foreground, nullptr, background, &r); background = shadow_image(background, false); - if (background == NULL) { + if (background == nullptr) { ERR_FT << "could not create floating label's shadow" << std::endl; img_ = sdl::timage(foreground); return img_; } SDL_SetAlpha(foreground,SDL_SRCALPHA,SDL_ALPHA_OPAQUE); - blit_surface(foreground, NULL, background, &r); + blit_surface(foreground, nullptr, background, &r); img_ = sdl::timage(background); } } @@ -169,9 +169,9 @@ surface floating_label::create_surface() surface foreground = text.render(); - if(foreground == NULL) { + if(foreground == nullptr) { ERR_FT << "could not create floating label's text" << std::endl; - return NULL; + return nullptr; } // combine foreground text with its background @@ -179,14 +179,14 @@ surface floating_label::create_surface() // background is a dark tooltip box surface background = create_neutral_surface(foreground->w + border_*2, foreground->h + border_*2); - if (background == NULL) { + if (background == nullptr) { ERR_FT << "could not create tooltip box" << std::endl; surf_ = create_optimized_surface(foreground); return surf_; } Uint32 color = SDL_MapRGBA(foreground->format, bgcolor_.r,bgcolor_.g, bgcolor_.b, bgalpha_); - sdl::fill_rect(background,NULL, color); + sdl::fill_rect(background,nullptr, color); // we make the text less transparent, because the blitting on the // dark background will darken the anti-aliased part. @@ -196,7 +196,7 @@ surface floating_label::create_surface() SDL_Rect r = sdl::create_rect( border_, border_, 0, 0); SDL_SetAlpha(foreground,SDL_SRCALPHA,SDL_ALPHA_OPAQUE); - blit_surface(foreground, NULL, background, &r); + blit_surface(foreground, nullptr, background, &r); surf_ = create_optimized_surface(background); // RLE compression seems less efficient for big semi-transparent area @@ -207,18 +207,18 @@ surface floating_label::create_surface() // background is blurred shadow of the text surface background = create_neutral_surface (foreground->w + 4, foreground->h + 4); - sdl::fill_rect(background, NULL, 0); + sdl::fill_rect(background, nullptr, 0); SDL_Rect r = { 2, 2, 0, 0 }; - blit_surface(foreground, NULL, background, &r); + blit_surface(foreground, nullptr, background, &r); background = shadow_image(background, false); - if (background == NULL) { + if (background == nullptr) { ERR_FT << "could not create floating label's shadow" << std::endl; surf_ = create_optimized_surface(foreground); return surf_; } SDL_SetAlpha(foreground,SDL_SRCALPHA,SDL_ALPHA_OPAQUE); - blit_surface(foreground, NULL, background, &r); + blit_surface(foreground, nullptr, background, &r); surf_ = create_optimized_surface(background); } } @@ -254,30 +254,30 @@ void floating_label::draw(CVideo &video) void floating_label::draw(surface screen) { if(!visible_) { - buf_.assign(NULL); + buf_.assign(nullptr); return; } - if(screen == NULL) { + if(screen == nullptr) { return; } create_surface(); - if(surf_ == NULL) { + if(surf_ == nullptr) { return; } - if(buf_ == NULL) { + if(buf_ == nullptr) { buf_.assign(create_compatible_surface(screen, surf_->w, surf_->h)); - if(buf_ == NULL) { + if(buf_ == nullptr) { return; } } SDL_Rect rect = sdl::create_rect(xpos(surf_->w), ypos_, surf_->w, surf_->h); const clip_rect_setter clip_setter(screen, &clip_rect_); - sdl_copy_portion(screen,&rect,buf_,NULL); - sdl_blit(surf_,NULL,screen,&rect); + sdl_copy_portion(screen,&rect,buf_,nullptr); + sdl_blit(surf_,nullptr,screen,&rect); update_rect(rect); } @@ -292,19 +292,19 @@ void floating_label::undraw(CVideo &video) #else void floating_label::undraw(surface screen) { - if(screen == NULL || buf_ == NULL) { + if(screen == nullptr || buf_ == nullptr) { return; } SDL_Rect rect = sdl::create_rect(xpos(surf_->w), ypos_, surf_->w, surf_->h); const clip_rect_setter clip_setter(screen, &clip_rect_); - sdl_blit(buf_,NULL,screen,&rect); + sdl_blit(buf_,nullptr,screen,&rect); update_rect(rect); move(xmove_,ymove_); if(lifetime_ > 0) { --lifetime_; - if(alpha_change_ != 0 && (xmove_ != 0.0 || ymove_ != 0.0) && surf_ != NULL) { + if(alpha_change_ != 0 && (xmove_ != 0.0 || ymove_ != 0.0) && surf_ != nullptr) { // fade out moving floating labels // note that we don't optimize these surfaces since they will always change surf_.assign(adjust_surface_alpha_add(surf_,alpha_change_,false)); @@ -375,7 +375,7 @@ SDL_Rect get_floating_label_rect(int handle) #else if(i != labels.end()) { const surface surf = i->second.create_surface(); - if(surf != NULL) { + if(surf != nullptr) { return sdl::create_rect(0, 0, surf->w, surf->h); } } @@ -388,8 +388,8 @@ floating_label_context::floating_label_context() #ifdef SDL_GPU #else - surface const screen = NULL; - if(screen != NULL) { + surface const screen = nullptr; + if(screen != nullptr) { draw_floating_labels(screen); } #endif @@ -409,8 +409,8 @@ floating_label_context::~floating_label_context() #ifdef SDL_GPU //TODO #else - surface const screen = NULL; - if(screen != NULL) { + surface const screen = nullptr; + if(screen != nullptr) { undraw_floating_labels(screen); } #endif diff --git a/src/floating_label.hpp b/src/floating_label.hpp index c8c2a5af685d..8f78cbdf7829 100644 --- a/src/floating_label.hpp +++ b/src/floating_label.hpp @@ -36,7 +36,7 @@ enum LABEL_SCROLL_MODE { ANCHOR_LABEL_SCREEN, ANCHOR_LABEL_MAP }; class floating_label { public: - floating_label(const std::string& text, const surface& surface = NULL); + floating_label(const std::string& text, const surface& surface = nullptr); void set_font_size(int font_size) {font_size_ = font_size;} diff --git a/src/floating_textbox.cpp b/src/floating_textbox.cpp index cb596a757ab3..de4927205f3a 100644 --- a/src/floating_textbox.cpp +++ b/src/floating_textbox.cpp @@ -30,8 +30,8 @@ static lg::log_domain log_display("display"); namespace gui{ floating_textbox::floating_textbox() : - box_(NULL), - check_(NULL), + box_(nullptr), + check_(nullptr), mode_(TEXTBOX_NONE), label_string_(), label_(0) @@ -42,13 +42,13 @@ namespace gui{ if(!active()) { return; } - if(check_ != NULL) { + if(check_ != nullptr) { if(mode_ == TEXTBOX_MESSAGE) { preferences::set_message_private(check_->checked()); } } - box_.assign(NULL); - check_.assign(NULL); + box_.assign(nullptr); + check_.assign(nullptr); font::remove_floating_label(label_); mode_ = TEXTBOX_NONE; gui.invalidate_all(); @@ -56,14 +56,14 @@ namespace gui{ void floating_textbox::update_location(game_display& gui) { - if (box_ == NULL) + if (box_ == nullptr) return; const SDL_Rect& area = gui.map_outside_area(); const int border_size = 10; - const int ypos = area.y+area.h-30 - (check_ != NULL ? check_->height() + border_size : 0); + const int ypos = area.y+area.h-30 - (check_ != nullptr ? check_->height() + border_size : 0); if (label_ != 0) font::remove_floating_label(label_); @@ -87,7 +87,7 @@ namespace gui{ return; } - if(box_ != NULL) { + if(box_ != nullptr) { box_->set_volatile(true); const SDL_Rect rect = sdl::create_rect( area.x + label_area.w + border_size * 2 @@ -98,7 +98,7 @@ namespace gui{ box_->set_location(rect); } - if(check_ != NULL) { + if(check_ != nullptr) { check_->set_volatile(true); check_->set_location(box_->location().x,box_->location().y + box_->location().h + border_size); } @@ -138,7 +138,7 @@ namespace gui{ text.append(line_start ? ": " : " "); } else if (matches.size() > 1) { std::string completion_list = utils::join(matches, " "); - resources::screen->get_chat_manager().add_chat_message(time(NULL), "", 0, completion_list, + resources::screen->get_chat_manager().add_chat_message(time(nullptr), "", 0, completion_list, events::chat_handler::MESSAGE_PRIVATE, false); } box_->set_text(text); diff --git a/src/floating_textbox.hpp b/src/floating_textbox.hpp index dc71ac05fce1..2f4ae20afb89 100644 --- a/src/floating_textbox.hpp +++ b/src/floating_textbox.hpp @@ -46,7 +46,7 @@ namespace gui{ void show(gui::TEXTBOX_MODE mode, const std::string& label, const std::string& check_label, bool checked, game_display& gui); void tab(const std::set& dictionary); - bool active() const { return box_.get() != NULL; } + bool active() const { return box_.get() != nullptr; } private: util::scoped_ptr box_; diff --git a/src/font.cpp b/src/font.cpp index 6e9d0b2ded9f..99195429cbc6 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -257,7 +257,7 @@ static TTF_Font* open_font_impl(const std::string & fname, int size) { name = fname; if(!filesystem::file_exists(name)) { ERR_FT << "Failed opening font: '" << name << "': No such file or directory" << std::endl; - return NULL; + return nullptr; } } } @@ -267,7 +267,7 @@ static TTF_Font* open_font_impl(const std::string & fname, int size) { if(!filesystem::file_exists(name)) { if(!filesystem::file_exists(fname)) { ERR_FT << "Failed opening font: '" << name << "': No such file or directory" << std::endl; - return NULL; + return nullptr; } name = fname; } @@ -275,10 +275,10 @@ static TTF_Font* open_font_impl(const std::string & fname, int size) { SDL_RWops *rwops = filesystem::load_RWops(name); TTF_Font* font = TTF_OpenFontRW(rwops, true, size); // SDL takes ownership of rwops - if(font == NULL) { + if(font == nullptr) { ERR_FT << "Failed opening font: '" << fname << "'\n"; ERR_FT << "TTF_OpenFont: " << TTF_GetError() << std::endl; - return NULL; + return nullptr; } DBG_FT << "Opened a font: " << fname << std::endl; @@ -297,7 +297,7 @@ static TTF_Font* get_font(font_id id) { const std::map::iterator it = font_table.find(id); if(it != font_table.end()) { - if (it->second.font != NULL) { + if (it->second.font != nullptr) { // If we found a valid record, use SDL_TTF to add in the difference // between its intrinsic style and the desired style. TTF_SetFontStyle(it->second.font, it->second.style ^ id.style); @@ -308,7 +308,7 @@ static TTF_Font* get_font(font_id id) // There's no record, so we need to try to find a solution for this font // and make a record of it. If the indices are out of bounds don't bother though. if(id.subset < 0 || size_t(id.subset) >= font_names.size()) { - return NULL; + return nullptr; } // Favor to use the shipped Italic font over bold if both are present and are needed. @@ -339,9 +339,9 @@ static TTF_Font* get_font(font_id id) } // Failed to find a font. - ttf_record rec = {NULL, TTF_STYLE_NORMAL}; + ttf_record rec = {nullptr, TTF_STYLE_NORMAL}; font_table.insert(std::make_pair(id, rec)); - return NULL; + return nullptr; } static void clear_fonts() @@ -416,13 +416,13 @@ void manager::init() const BOOST_FOREACH(const std::string& path, filesystem::get_binary_paths("fonts")) { std::vector files; if(filesystem::is_directory(path)) { - filesystem::get_files_in_dir(path, &files, NULL, filesystem::ENTIRE_FILE_PATH); + filesystem::get_files_in_dir(path, &files, nullptr, filesystem::ENTIRE_FILE_PATH); } BOOST_FOREACH(const std::string& file, files) { if(file.substr(file.length() - 4) == ".ttf" || file.substr(file.length() - 4) == ".ttc") { const std::wstring wfile = unicode_cast(file); - AddFontResourceExW(wfile.c_str(), FR_PRIVATE, NULL); + AddFontResourceExW(wfile.c_str(), FR_PRIVATE, nullptr); } } } @@ -439,12 +439,12 @@ void manager::deinit() const BOOST_FOREACH(const std::string& path, filesystem::get_binary_paths("fonts")) { std::vector files; if(filesystem::is_directory(path)) - filesystem::get_files_in_dir(path, &files, NULL, filesystem::ENTIRE_FILE_PATH); + filesystem::get_files_in_dir(path, &files, nullptr, filesystem::ENTIRE_FILE_PATH); BOOST_FOREACH(const std::string& file, files) { if(file.substr(file.length() - 4) == ".ttf" || file.substr(file.length() - 4) == ".ttc") { const std::wstring wfile = unicode_cast(file); - RemoveFontResourceExW(wfile.c_str(), FR_PRIVATE, NULL); + RemoveFontResourceExW(wfile.c_str(), FR_PRIVATE, nullptr); } } } @@ -630,7 +630,7 @@ void text_surface::bidi_cvt() n = fribidi_charset_to_unicode(FRIBIDI_CHAR_SET_UTF8, c_str, len, bidi_logical); - fribidi_log2vis(bidi_logical, n, &base_dir, bidi_visual, NULL, NULL, NULL); + fribidi_log2vis(bidi_logical, n, &base_dir, bidi_visual, nullptr, nullptr, nullptr); fribidi_unicode_to_charset(FRIBIDI_CHAR_SET_UTF8, bidi_visual, n, utf8str); is_rtl_ = base_dir == FRIBIDI_TYPE_RTL; @@ -708,7 +708,7 @@ void text_surface::measure() const BOOST_FOREACH(text_chunk const &chunk, chunks_) { TTF_Font* ttfont = get_font(font_id(chunk.subset, font_size_, style_)); - if(ttfont == NULL) { + if(ttfont == nullptr) { continue; } @@ -825,7 +825,7 @@ static surface render_text(const std::string& text, int fontsize, const SDL_Colo int text_style = style; std::string::const_iterator after_markup = use_markup ? - parse_markup(ln->begin(), ln->end(), &sz, NULL, &text_style) : ln->begin(); + parse_markup(ln->begin(), ln->end(), &sz, nullptr, &text_style) : ln->begin(); text_surface txt_surf(sz, color, text_style); if (after_markup == ln->end() && (ln+1 != ln_end || lines.begin()+1 == ln_end)) { @@ -872,7 +872,7 @@ static surface render_text(const std::string& text, int fontsize, const SDL_Colo j_end = i->end(); j != j_end; ++j) { SDL_SetAlpha(*j, 0, 0); // direct blit without alpha blending SDL_Rect dstrect = sdl::create_rect(xpos, ypos, 0, 0); - sdl_blit(*j, NULL, res, &dstrect); + sdl_blit(*j, nullptr, res, &dstrect); xpos += (*j)->w; height = std::max((*j)->h, height); } @@ -908,7 +908,7 @@ SDL_Rect draw_text_line(surface& gui_surface, const SDL_Rect& area, int size, // for the main current use, we already parsed markup surface surface(render_text(etext,size,color,style,false)); - if(surface == NULL) { + if(surface == nullptr) { return sdl::create_rect(0, 0, 0, 0); } @@ -917,7 +917,7 @@ SDL_Rect draw_text_line(surface& gui_surface, const SDL_Rect& area, int size, dest.x = x; #ifdef HAVE_FRIBIDI // Oron -- Conditional, until all draw_text_line calls have fixed area parameter - if(getenv("NO_RTL") == NULL) { + if(getenv("NO_RTL") == nullptr) { bool is_rtl = text_cache::find(text_surface(text, size, color, style)).is_rtl(); if(is_rtl) dest.x = area.x + area.w - surface->w - (x - area.x); @@ -944,7 +944,7 @@ SDL_Rect draw_text_line(surface& gui_surface, const SDL_Rect& area, int size, dest.h = area.y + area.h - dest.y; } - if(gui_surface != NULL) { + if(gui_surface != nullptr) { SDL_Rect src = dest; src.x = 0; src.y = 0; @@ -962,7 +962,7 @@ int get_max_height(int size) { // Only returns the maximal size of the first font TTF_Font* const font = get_font(font_id(0, size)); - if(font == NULL) + if(font == nullptr) return 0; return TTF_FontHeight(font); } diff --git a/src/format_time_summary.cpp b/src/format_time_summary.cpp index 1b7259cc4891..67f955391901 100644 --- a/src/format_time_summary.cpp +++ b/src/format_time_summary.cpp @@ -22,16 +22,16 @@ namespace util { std::string format_time_summary(time_t t) { - time_t curtime = time(NULL); + time_t curtime = time(nullptr); const struct tm* timeptr = localtime(&curtime); - if(timeptr == NULL) { + if(timeptr == nullptr) { return ""; } const struct tm current_time = *timeptr; timeptr = localtime(&t); - if(timeptr == NULL) { + if(timeptr == nullptr) { return ""; } diff --git a/src/formula/callable.hpp b/src/formula/callable.hpp index e5524878c239..4169bb0fddbc 100644 --- a/src/formula/callable.hpp +++ b/src/formula/callable.hpp @@ -154,7 +154,7 @@ class formula_variant_callable_with_backup : public formula_callable { class map_formula_callable : public formula_callable { public: - explicit map_formula_callable(const formula_callable* fallback=NULL); + explicit map_formula_callable(const formula_callable* fallback=nullptr); map_formula_callable& add(const std::string& key, const variant& value); void set_fallback(const formula_callable* fallback) { fallback_ = fallback; } bool empty() const { return values_.empty(); } diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 04bf63145961..359d9e275a9d 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -63,7 +63,7 @@ void location_callable::get_inputs(std::vector* input int location_callable::do_compare(const game_logic::formula_callable* callable) const { const location_callable* loc_callable = dynamic_cast(callable); - if(loc_callable == NULL) { + if(loc_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -141,7 +141,7 @@ void attack_type_callable::get_inputs(std::vector* in int attack_type_callable::do_compare(const formula_callable* callable) const { const attack_type_callable* att_callable = dynamic_cast(callable); - if(att_callable == NULL) { + if(att_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -361,7 +361,7 @@ void unit_callable::get_inputs(std::vector* inputs) c int unit_callable::do_compare(const formula_callable* callable) const { const unit_callable* u_callable = dynamic_cast(callable); - if(u_callable == NULL) { + if(u_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -453,7 +453,7 @@ void unit_type_callable::get_inputs(std::vector* inpu int unit_type_callable::do_compare(const formula_callable* callable) const { const unit_type_callable* u_callable = dynamic_cast(callable); - if(u_callable == NULL) { + if(u_callable == nullptr) { return formula_callable::do_compare(callable); } @@ -513,7 +513,7 @@ void terrain_callable::get_inputs(std::vector* inputs int terrain_callable::do_compare(const formula_callable* callable) const { const terrain_callable* terr_callable = dynamic_cast(callable); - if(terr_callable == NULL) { + if(terr_callable == nullptr) { return formula_callable::do_compare(callable); } diff --git a/src/formula/debugger.cpp b/src/formula/debugger.cpp index 4db127422d9d..b41559e3d080 100644 --- a/src/formula/debugger.cpp +++ b/src/formula/debugger.cpp @@ -155,8 +155,8 @@ void formula_debugger::check_breakpoints() void formula_debugger::show_gui() { - if (resources::screen == NULL) { - WRN_FDB << "do not showing debug window due to NULL gui" << std::endl; + if (resources::screen == nullptr) { + WRN_FDB << "do not showing debug window due to nullptr gui" << std::endl; return; } if (game_config::debug) { @@ -201,7 +201,7 @@ variant formula_debugger::evaluate_arg_callback(const formula_expression &expres variant v = expression.execute(variables,this); call_stack_set_value(v); call_stack_set_evaluated(true); - msg(" evaluated expression: ",call_stack_.back()," to ",v.to_debug_string(NULL,true).c_str()); + msg(" evaluated expression: ",call_stack_.back()," to ",v.to_debug_string(nullptr,true).c_str()); check_breakpoints(); call_stack_pop(); return v; @@ -216,7 +216,7 @@ variant formula_debugger::evaluate_formula_callback(const formula &f, const form variant v = f.execute(variables,this); call_stack_set_value(v); call_stack_set_evaluated(true); - msg(" evaluated formula: ",call_stack_.back()," to ",v.to_debug_string(NULL,true).c_str()); + msg(" evaluated formula: ",call_stack_.back()," to ",v.to_debug_string(nullptr,true).c_str()); check_breakpoints(); call_stack_pop(); return v; @@ -231,7 +231,7 @@ variant formula_debugger::evaluate_formula_callback(const formula &f) variant v = f.execute(this); call_stack_set_value(v); call_stack_set_evaluated(true); - msg(" evaluated formula without variables: ",call_stack_.back()," to ",v.to_debug_string(NULL,true).c_str()); + msg(" evaluated formula without variables: ",call_stack_.back()," to ",v.to_debug_string(nullptr,true).c_str()); check_breakpoints(); call_stack_pop(); return v; diff --git a/src/formula/debugger.hpp b/src/formula/debugger.hpp index 9aa37d87d4e7..43d353dfc4b4 100644 --- a/src/formula/debugger.hpp +++ b/src/formula/debugger.hpp @@ -136,8 +136,8 @@ class formula_debugger { static formula_debugger* add_debug_info(formula_debugger *fdb, int arg_number, const std::string& f_name) { - if (fdb==NULL) { - return NULL; + if (fdb==nullptr) { + return nullptr; } fdb->add_debug_info(arg_number,f_name); return fdb; diff --git a/src/formula/debugger_fwd.cpp b/src/formula/debugger_fwd.cpp index 1148d7d9bac7..332b01ad0cf4 100644 --- a/src/formula/debugger_fwd.cpp +++ b/src/formula/debugger_fwd.cpp @@ -25,8 +25,8 @@ namespace game_logic { formula_debugger* add_debug_info(formula_debugger *fdb, int arg_number, const std::string& f_name) { - if (fdb==NULL) { - return NULL; + if (fdb==nullptr) { + return nullptr; } fdb->add_debug_info(arg_number,f_name); return fdb; diff --git a/src/formula/formula.cpp b/src/formula/formula.cpp index 91fac7435bae..b23f8da01255 100644 --- a/src/formula/formula.cpp +++ b/src/formula/formula.cpp @@ -1016,7 +1016,7 @@ expression_ptr parse_expression(const token* i1, const token* i2, function_symbo ++i1; } const std::string precond = ""; - if(symbols == NULL) { + if(symbols == nullptr) { throw formula_error("Function symbol table required but not present", "",*i1->filename, i1->line_number); } symbols->add_formula_function(formula_name, @@ -1033,7 +1033,7 @@ expression_ptr parse_expression(const token* i1, const token* i2, function_symbo } int parens = 0; - const token* op = NULL; + const token* op = nullptr; bool operator_group = false; for(const token* i = i1; i != i2; ++i) { if(i->type == TOKEN_LPARENS || i->type == TOKEN_LSQUARE) { @@ -1041,10 +1041,10 @@ expression_ptr parse_expression(const token* i1, const token* i2, function_symbo } else if(i->type == TOKEN_RPARENS || i->type == TOKEN_RSQUARE) { --parens; } else if(parens == 0 && i->type == TOKEN_OPERATOR) { - if( ( !operator_group ) && (op == NULL || operator_precedence(*op) >= + if( ( !operator_group ) && (op == nullptr || operator_precedence(*op) >= operator_precedence(*i)) ) { // Need special exception for exponentiation to be right-associative - if(*i->begin != '^' || op == NULL || *op->begin != '^') + if(*i->begin != '^' || op == nullptr || *op->begin != '^') op = i; } operator_group = true; @@ -1053,7 +1053,7 @@ expression_ptr parse_expression(const token* i1, const token* i2, function_symbo } } - if(op == NULL) { + if(op == nullptr) { if(i1->type == TOKEN_LPARENS && (i2-1)->type == TOKEN_RPARENS) { return parse_expression(i1+1,i2-1,symbols); } else if( (i2-1)->type == TOKEN_RSQUARE) { //check if there is [ ] : either a list/map definition, or a operator @@ -1219,11 +1219,11 @@ formula::formula(const std::string& str, function_symbol_table* symbols) : expr_(), str_(str), symbols_(symbols), - managing_symbols(symbols == NULL) + managing_symbols(symbols == nullptr) { using namespace formula_tokenizer; - if(symbols == NULL) { + if(symbols == nullptr) { symbols_ = new function_symbol_table; } @@ -1351,9 +1351,9 @@ formula::formula(const token* i1, const token* i2, function_symbol_table* symbol expr_(), str_(), symbols_(symbols), - managing_symbols(symbols == NULL) + managing_symbols(symbols == nullptr) { - if(symbols == NULL) { + if(symbols == nullptr) { symbols_ = new function_symbol_table; } diff --git a/src/formula/formula.hpp b/src/formula/formula.hpp index 79248e0e255f..fb7e93ff3a79 100644 --- a/src/formula/formula.hpp +++ b/src/formula/formula.hpp @@ -29,7 +29,7 @@ typedef boost::shared_ptr expression_ptr; class formula { public: static variant evaluate(const const_formula_ptr& f, - const formula_callable& variables, formula_debugger *fdb = NULL, + const formula_callable& variables, formula_debugger *fdb = nullptr, variant default_res=variant(0)) { if(f) { return f->evaluate(variables, fdb); @@ -38,32 +38,32 @@ class formula { } } - variant evaluate(const formula_callable& variables, formula_debugger *fdb = NULL) const + variant evaluate(const formula_callable& variables, formula_debugger *fdb = nullptr) const { - if (fdb!=NULL) { + if (fdb!=nullptr) { return evaluate_formula_callback(*fdb,*this,variables); } else { return execute(variables,fdb); } } - variant evaluate(formula_debugger *fdb = NULL) const + variant evaluate(formula_debugger *fdb = nullptr) const { - if (fdb!=NULL) { + if (fdb!=nullptr) { return evaluate_formula_callback(*fdb,*this); } else { return execute(fdb); } } - static formula_ptr create_optional_formula(const std::string& str, function_symbol_table* symbols=NULL); - explicit formula(const std::string& str, function_symbol_table* symbols=NULL); - explicit formula(const formula_tokenizer::token* i1, const formula_tokenizer::token* i2, function_symbol_table* symbols=NULL); + static formula_ptr create_optional_formula(const std::string& str, function_symbol_table* symbols=nullptr); + explicit formula(const std::string& str, function_symbol_table* symbols=nullptr); + explicit formula(const formula_tokenizer::token* i1, const formula_tokenizer::token* i2, function_symbol_table* symbols=nullptr); ~formula(); const std::string& str() const { return str_; } private: - variant execute(const formula_callable& variables, formula_debugger *fdb = NULL) const; + variant execute(const formula_callable& variables, formula_debugger *fdb = nullptr) const; variant execute(formula_debugger *fdb) const; formula() : expr_(), str_() {} diff --git a/src/formula/function.cpp b/src/formula/function.cpp index af0217093d17..c5f8eccfd309 100644 --- a/src/formula/function.cpp +++ b/src/formula/function.cpp @@ -69,7 +69,7 @@ class debug_function : public function_expression { variant execute(const formula_callable& variables, formula_debugger *fdb) const { boost::shared_ptr fdbp; bool need_wrapper = false; - if (fdb==NULL) { + if (fdb==nullptr) { fdbp = boost::shared_ptr(new formula_debugger()); fdb = &*fdbp; need_wrapper = true; @@ -287,19 +287,19 @@ class debug_print_function : public function_expression { if( args().size() == 1) { - str1 = var1.to_debug_string(NULL, true); + str1 = var1.to_debug_string(nullptr, true); LOG_SF << str1 << std::endl; if(game_config::debug) { - game_display::get_singleton()->get_chat_manager().add_chat_message(time(NULL), "WFL", 0, str1, events::chat_handler::MESSAGE_PUBLIC, false); + game_display::get_singleton()->get_chat_manager().add_chat_message(time(nullptr), "WFL", 0, str1, events::chat_handler::MESSAGE_PUBLIC, false); } return var1; } else { str1 = var1.string_cast(); const variant var2 = args()[1]->evaluate(variables,fdb); - str2 = var2.to_debug_string(NULL, true); + str2 = var2.to_debug_string(nullptr, true); LOG_SF << str1 << str2 << std::endl; if(game_config::debug) { - game_display::get_singleton()->get_chat_manager().add_chat_message(time(NULL), str1, 0, str2, events::chat_handler::MESSAGE_PUBLIC, false); + game_display::get_singleton()->get_chat_manager().add_chat_message(time(nullptr), str1, 0, str2, events::chat_handler::MESSAGE_PUBLIC, false); } return var2; } @@ -333,7 +333,7 @@ class debug_profile_function : public function_expression { str << "Evaluated in " << (run_time / 1000.0) << " ms on average"; LOG_SF << speaker << ": " << str.str() << std::endl; if(game_config::debug) { - game_display::get_singleton()->get_chat_manager().add_chat_message(time(NULL), speaker, 0, str.str(), events::chat_handler::MESSAGE_PUBLIC, false); + game_display::get_singleton()->get_chat_manager().add_chat_message(time(nullptr), speaker, 0, str.str(), events::chat_handler::MESSAGE_PUBLIC, false); } return value; } diff --git a/src/formula/function.hpp b/src/formula/function.hpp index ed41af5b7ac3..fcf346414c70 100644 --- a/src/formula/function.hpp +++ b/src/formula/function.hpp @@ -25,9 +25,9 @@ class formula_expression { public: formula_expression() : name_("") {} virtual ~formula_expression() {} - variant evaluate(const formula_callable& variables, formula_debugger *fdb = NULL) const { + variant evaluate(const formula_callable& variables, formula_debugger *fdb = nullptr) const { call_stack_manager manager(name_); - if (fdb!=NULL) { + if (fdb!=nullptr) { return evaluate_arg_callback(*fdb,*this,variables); } else { return execute(variables,fdb); @@ -38,7 +38,7 @@ class formula_expression { const char* get_name() const { return name_; } virtual std::string str() const = 0; private: - virtual variant execute(const formula_callable& variables, formula_debugger *fdb = NULL) const = 0; + virtual variant execute(const formula_callable& variables, formula_debugger *fdb = nullptr) const = 0; const char* name_; friend class formula_debugger; }; @@ -161,7 +161,7 @@ class wrapper_formula : public formula_expression { } } private: - virtual variant execute(const formula_callable& variables, formula_debugger *fdb = NULL) const + virtual variant execute(const formula_callable& variables, formula_debugger *fdb = nullptr) const { if (arg_) { return arg_->evaluate(variables,fdb); diff --git a/src/formula/string_utils.hpp b/src/formula/string_utils.hpp index 8501c254c9e9..6371b14f3afd 100644 --- a/src/formula/string_utils.hpp +++ b/src/formula/string_utils.hpp @@ -39,7 +39,7 @@ inline bool might_contain_variables(const std::string &str) /** * Function which will interpolate variables, starting with '$' in the string * 'str' with the equivalent symbols in the given symbol table. If 'symbols' - * is NULL, then game event variables will be used instead. + * is nullptr, then game event variables will be used instead. */ std::string interpolate_variables_into_string(const std::string &str, const string_map * const symbols); std::string interpolate_variables_into_string(const std::string &str, const variable_set& variables); diff --git a/src/formula/variant.cpp b/src/formula/variant.cpp index c0be6dbe7ca9..3dd69da3d495 100644 --- a/src/formula/variant.cpp +++ b/src/formula/variant.cpp @@ -587,7 +587,7 @@ bool variant::as_bool() const case TYPE_DECIMAL: return decimal_value_ != 0; case TYPE_CALLABLE: - return callable_ != NULL; + return callable_ != nullptr; case TYPE_LIST: return !list_->elements.empty(); case TYPE_MAP: diff --git a/src/formula/variant.hpp b/src/formula/variant.hpp index f5b64cf88cb0..c44a45561276 100644 --- a/src/formula/variant.hpp +++ b/src/formula/variant.hpp @@ -106,7 +106,7 @@ class variant { template T* try_convert() const { if(!is_callable()) { - return NULL; + return nullptr; } return dynamic_cast(mutable_callable()); @@ -158,7 +158,7 @@ class variant { std::string string_cast() const; - std::string to_debug_string(std::vector* seen=NULL, bool verbose = false) const; + std::string to_debug_string(std::vector* seen=nullptr, bool verbose = false) const; private: void must_be(TYPE t) const; @@ -248,7 +248,7 @@ T* convert_variant(const variant& v) { template T* try_convert_variant(const variant& v) { if(!v.is_callable()) { - return NULL; + return nullptr; } return dynamic_cast(v.mutable_callable()); diff --git a/src/game_board.cpp b/src/game_board.cpp index cd5cc853bff0..acc9d9cc4330 100644 --- a/src/game_board.cpp +++ b/src/game_board.cpp @@ -196,7 +196,7 @@ unit* game_board::get_visible_unit(const map_location &loc, const team ¤t_team, bool see_all) { unit_map::iterator ui = find_visible_unit(loc, current_team, see_all); - if (ui == units_.end()) return NULL; + if (ui == units_.end()) return nullptr; return &*ui; } diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index a39087c099b7..7292bd0300cc 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -71,7 +71,7 @@ game_config_manager::game_config_manager( game_config_manager::~game_config_manager() { assert(singleton); - singleton = NULL; + singleton = nullptr; } game_config_manager * game_config_manager::get() { @@ -268,7 +268,7 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, // If multiplayer campaign is being loaded, [scenario] tags should // become [multiplayer] tags and campaign's id should be added to them // to allow to recognize which scenarios belongs to a loaded campaign. - if (classification != NULL) { + if (classification != nullptr) { if (const config& campaign = game_config().find_child("campaign", "id", classification->campaign)) { const bool require_campaign = campaign["require_campaign"].to_bool(true); @@ -413,7 +413,7 @@ void game_config_manager::load_addons_cfg() cache_.get_config(addon.main_cfg, umc_cfg); // Annotate "era", "modification", and scenario tags with addon_id info - const char * tags_with_addon_id [] = { "era", "modification", "multiplayer", "scenario", NULL }; + const char * tags_with_addon_id [] = { "era", "modification", "multiplayer", "scenario", nullptr }; for (const char ** type = tags_with_addon_id; *type; type++) { diff --git a/src/game_config_manager.hpp b/src/game_config_manager.hpp index 0b560c75b42c..28d6a832f230 100644 --- a/src/game_config_manager.hpp +++ b/src/game_config_manager.hpp @@ -57,10 +57,10 @@ class game_config_manager void operator=(const game_config_manager&); void load_game_config(FORCE_RELOAD_CONFIG force_reload, - game_classification const* classification = NULL); + game_classification const* classification = nullptr); void load_game_config_with_loadscreen(FORCE_RELOAD_CONFIG force_reload, - game_classification const* classification = NULL); + game_classification const* classification = nullptr); // load_game_config() helper functions. void load_addons_cfg(); diff --git a/src/game_display.cpp b/src/game_display.cpp index 537d07f5f047..8d8c6eb0fe76 100644 --- a/src/game_display.cpp +++ b/src/game_display.cpp @@ -130,22 +130,22 @@ void game_display::new_turn() for(int i = 0; i != niterations; ++i) { #ifdef SDL_GPU - if(old_mask != NULL) { + if(old_mask != nullptr) { const fixed_t proportion = ftofxp(1.0) - fxpdiv(i,niterations); tod_hex_mask1 = sdl::timage(adjust_surface_alpha(old_mask,proportion)); } - if(new_mask != NULL) { + if(new_mask != nullptr) { const fixed_t proportion = fxpdiv(i,niterations); tod_hex_mask2 = sdl::timage(adjust_surface_alpha(new_mask,proportion)); } #else - if(old_mask != NULL) { + if(old_mask != nullptr) { const fixed_t proportion = ftofxp(1.0) - fxpdiv(i,niterations); tod_hex_mask1.assign(adjust_surface_alpha(old_mask,proportion)); } - if(new_mask != NULL) { + if(new_mask != nullptr) { const fixed_t proportion = fxpdiv(i,niterations); tod_hex_mask2.assign(adjust_surface_alpha(new_mask,proportion)); } @@ -166,8 +166,8 @@ void game_display::new_turn() tod_hex_mask1 = sdl::timage(); tod_hex_mask2 = sdl::timage(); #else - tod_hex_mask1.assign(NULL); - tod_hex_mask2.assign(NULL); + tod_hex_mask1.assign(nullptr); + tod_hex_mask2.assign(nullptr); #endif } @@ -309,11 +309,11 @@ void game_display::draw_hex(const map_location& loc) if(on_map && loc == mouseoverHex_) { tdrawing_layer hex_top_layer = LAYER_MOUSEOVER_BOTTOM; const unit *u = resources::gameboard->get_visible_unit(loc, dc_->teams()[viewing_team()] ); - if( u != NULL ) { + if( u != nullptr ) { hex_top_layer = LAYER_MOUSEOVER_TOP; } #ifdef SDL_GPU - if(u == NULL) { + if(u == nullptr) { drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_texture("misc/hover-hex-top.png~RC(magenta>gold)", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, @@ -335,7 +335,7 @@ void game_display::draw_hex(const map_location& loc) image::get_texture("misc/hover-hex-bottom.png~RC(magenta>lightblue)", image::SCALED_TO_HEX)); } #else - if(u == NULL) { + if(u == nullptr) { drawing_buffer_add( hex_top_layer, loc, xpos, ypos, image::get_image("misc/hover-hex-top.png~RC(magenta>gold)", image::SCALED_TO_HEX)); drawing_buffer_add(LAYER_MOUSEOVER_BOTTOM, loc, xpos, ypos, @@ -629,7 +629,7 @@ std::vector footsteps_images(const map_location& loc, const pathfind::m #ifdef SDL_GPU sdl::timage teleport; #else - surface teleport = NULL; + surface teleport = nullptr; #endif // We draw 2 half-hex (with possibly different directions), @@ -677,7 +677,7 @@ std::vector footsteps_images(const map_location& loc, const pathfind::m #ifdef SDL_GPU if (!teleport.null()) res.push_back(teleport); #else - if (teleport != NULL) res.push_back(teleport); + if (teleport != nullptr) res.push_back(teleport); #endif return res; @@ -720,7 +720,7 @@ void game_display::set_route(const pathfind::marked_route *route) { invalidate_route(); - if(route != NULL) { + if(route != nullptr) { route_ = *route; } else { route_.steps.clear(); diff --git a/src/game_display.hpp b/src/game_display.hpp index c3f58bd82f23..35a3a3396526 100644 --- a/src/game_display.hpp +++ b/src/game_display.hpp @@ -111,7 +111,7 @@ class game_display : public display /** * Sets the route along which footsteps are drawn to show movement of a - * unit. If NULL, no route is displayed. @a route does not have to remain + * unit. If nullptr, no route is displayed. @a route does not have to remain * valid after being set. */ void set_route(const pathfind::marked_route *route); diff --git a/src/game_events/action_wml.cpp b/src/game_events/action_wml.cpp index 62b5accb00ae..a8a13f3b205a 100644 --- a/src/game_events/action_wml.cpp +++ b/src/game_events/action_wml.cpp @@ -529,7 +529,7 @@ WML_HANDLER_FUNCTION(recall, cfg) DBG_NG << (*u)->id() << " matched the filter...\n"; const unit_ptr to_recruit = *u; const unit* pass_check = to_recruit.get(); - if(!cfg["check_passability"].to_bool(true)) pass_check = NULL; + if(!cfg["check_passability"].to_bool(true)) pass_check = nullptr; const map_location cfg_loc = cfg_to_loc(cfg); /// @todo fendrin: comment this monster @@ -971,12 +971,12 @@ WML_HANDLER_FUNCTION(set_variables, cfg) bool remove_empty = split_element["remove_empty"].to_bool(); - char* separator = separator_string.empty() ? NULL : &separator_string[0]; + char* separator = separator_string.empty() ? nullptr : &separator_string[0]; std::vector split_vector; //if no separator is specified, explode the string - if(separator == NULL) + if(separator == nullptr) { for(std::string::iterator i=split_string.begin(); i!=split_string.end(); ++i) { diff --git a/src/game_events/conditional_wml.cpp b/src/game_events/conditional_wml.cpp index 7b2e7edc6ed3..d130d585a91b 100644 --- a/src/game_events/conditional_wml.cpp +++ b/src/game_events/conditional_wml.cpp @@ -66,7 +66,7 @@ namespace { // Support functions // then check for that. const vconfig::child_list& have_unit = cond.get_children("have_unit"); for(vconfig::child_list::const_iterator u = have_unit.begin(); u != have_unit.end(); ++u) { - if(resources::units == NULL) + if(resources::units == nullptr) return false; std::vector > counts = (*u).has_attribute("count") ? utils::parse_ranges((*u)["count"]) : default_counts; diff --git a/src/game_events/menu_item.cpp b/src/game_events/menu_item.cpp index a7ec896c4d4a..050662d4025d 100644 --- a/src/game_events/menu_item.cpp +++ b/src/game_events/menu_item.cpp @@ -206,7 +206,7 @@ void wml_menu_item::fire_event(const map_location & event_hex, const game_data & { //It is possible to for example show a help menu during a [delay] of a synced event. set_scontext_unsynced leave_synced_context; - assert(resources::game_events != NULL); + assert(resources::game_events != nullptr); resources::game_events->pump().fire(event_name_, event_hex); return; } @@ -223,7 +223,7 @@ void wml_menu_item::fire_event(const map_location & event_hex, const game_data & } else { - synced_context::run_in_synced_context_if_not_already("fire_event", replay_helper::get_event(event_name_, event_hex, NULL)); + synced_context::run_in_synced_context_if_not_already("fire_event", replay_helper::get_event(event_name_, event_hex, nullptr)); } } diff --git a/src/game_events/pump.cpp b/src/game_events/pump.cpp index a67976b92364..810ed642873f 100644 --- a/src/game_events/pump.cpp +++ b/src/game_events/pump.cpp @@ -296,14 +296,14 @@ namespace { // Support functions // The event hasn't been filtered out, so execute the handler. ++impl_->internal_wml_tracking; context::scoped evc(impl_->contexts_); - assert(resources::lua_kernel != NULL); + assert(resources::lua_kernel != nullptr); handler_p->handle_event(ev, handler_p, *resources::lua_kernel); // NOTE: handler_p may be null at this point! if(ev.name == "select") { resources::gamedata->last_selected = ev.loc1; } - if(resources::screen != NULL) { + if(resources::screen != nullptr) { resources::screen->maybe_rebuild(); } return context_mutated(); @@ -363,7 +363,7 @@ namespace { // Support functions msg << " (" << itor->second << ")"; } - resources::screen->get_chat_manager().add_chat_message(time(NULL), caption, 0, msg.str(), + resources::screen->get_chat_manager().add_chat_message(time(nullptr), caption, 0, msg.str(), events::chat_handler::MESSAGE_PUBLIC, false); if ( to_cerr ) std::cerr << caption << ": " << msg.str() << '\n'; @@ -483,7 +483,7 @@ void t_pump::raise(const std::string& event, const entity_location& loc2, const config& data) { - if(resources::screen == NULL) + if(resources::screen == nullptr) return; DBG_EH << "raising event: " << event << "\n"; @@ -494,9 +494,9 @@ void t_pump::raise(const std::string& event, bool t_pump::operator()() { // Quick aborts: - if(resources::screen == NULL) + if(resources::screen == nullptr) return false; - assert(resources::lua_kernel != NULL); + assert(resources::lua_kernel != nullptr); if ( impl_->events_queue.empty() ) { DBG_EH << "Processing queued events, but none found.\n"; return false; diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index d24c75f7b7b4..6544e38ca0a2 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -212,7 +212,7 @@ config* connect_engine::current_config() { if(config& s = scenario()) return &s; else - return NULL; + return nullptr; } void connect_engine::import_user(const std::string& name, const bool observer, @@ -1063,7 +1063,7 @@ config side_engine::new_config() const // Find a config where a default leader is and set a new type // and gender values for it. config* leader = &res; - if (flg_.default_leader_cfg() != NULL) { + if (flg_.default_leader_cfg() != nullptr) { BOOST_FOREACH(config& side_unit, res.child_range("unit")) { if (*flg_.default_leader_cfg() == side_unit) { leader = &side_unit; diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index cba987217bb2..4e85c39d2375 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -138,7 +138,7 @@ scenario::~scenario() bool scenario::can_launch_game() const { - return map_.get() != NULL; + return map_.get() != nullptr; } surface scenario::create_image_surface(const SDL_Rect& image_rect) @@ -187,7 +187,7 @@ std::string scenario::map_size() const { std::stringstream map_size; - if (map_.get() != NULL) { + if (map_.get() != nullptr) { map_size << map_.get()->w(); map_size << utils::unicode_multiplication_sign; map_size << map_.get()->h(); @@ -200,7 +200,7 @@ std::string scenario::map_size() const void scenario::set_sides() { - if (map_.get() != NULL) { + if (map_.get() != nullptr) { // If there are less sides in the configuration than there are // starting positions, then generate the additional sides const int map_positions = map_->num_valid_starting_positions(); @@ -227,7 +227,7 @@ user_map::user_map(const config& data, const std::string& name, gamemap* map) : scenario(data), name_(name) { - if (map != NULL) { + if (map != nullptr) { map_.reset(new gamemap(*map)); } } @@ -407,8 +407,8 @@ create_engine::create_engine(CVideo& v, saved_game& state) : mods_(), state_(state), video_(v), - dependency_manager_(NULL), - generator_(NULL) + dependency_manager_(nullptr), + generator_(nullptr) { DBG_MP << "restoring game config\n"; @@ -423,10 +423,10 @@ create_engine::create_engine(CVideo& v, saved_game& state) : dependency_manager_.reset(new depcheck::manager(game_config_manager::get()->game_config(), type == game_classification::CAMPAIGN_TYPE::MULTIPLAYER, video_)); //TODO the editor dir is already configurable, is the preferences value filesystem::get_files_in_dir(filesystem::get_user_data_dir() + "/editor/maps", &user_map_names_, - NULL, filesystem::FILE_NAME_ONLY); + nullptr, filesystem::FILE_NAME_ONLY); filesystem::get_files_in_dir(filesystem::get_user_data_dir() + "/editor/scenarios", &user_scenario_names_, - NULL, filesystem::FILE_NAME_ONLY); + nullptr, filesystem::FILE_NAME_ONLY); DBG_MP << "initializing all levels, eras and mods\n"; @@ -804,7 +804,7 @@ void create_engine::set_current_level(const size_t index) generator_.reset(current_random_map->create_map_generator()); } else { - generator_.reset(NULL); + generator_.reset(nullptr); } if (current_level_type_ != level::TYPE::CAMPAIGN && @@ -849,7 +849,7 @@ bool create_engine::toggle_current_mod(bool force) bool create_engine::generator_assigned() const { - return generator_ != NULL; + return generator_ != nullptr; } void create_engine::generator_user_config(CVideo& v) diff --git a/src/game_initialization/create_engine.hpp b/src/game_initialization/create_engine.hpp index b0be16dc2c99..b8125bf11fd9 100644 --- a/src/game_initialization/create_engine.hpp +++ b/src/game_initialization/create_engine.hpp @@ -304,7 +304,7 @@ class create_engine saved_game& state_; CVideo& video_; - //Never NULL + //Never nullptr boost::scoped_ptr dependency_manager_; boost::scoped_ptr generator_; diff --git a/src/game_initialization/flg_manager.cpp b/src/game_initialization/flg_manager.cpp index 1983c0a53d05..1975cb1af8a2 100644 --- a/src/game_initialization/flg_manager.cpp +++ b/src/game_initialization/flg_manager.cpp @@ -61,12 +61,12 @@ flg_manager::flg_manager(const std::vector& era_factions, choosable_factions_(), choosable_leaders_(), choosable_genders_(), - current_faction_(NULL), + current_faction_(nullptr), current_leader_("null"), current_gender_("null"), default_leader_type_(side_["type"]), default_leader_gender_(side_["gender"]), - default_leader_cfg_(NULL) + default_leader_cfg_(nullptr) { const std::string& leader_id = side_["id"]; if (!leader_id.empty()) { @@ -76,7 +76,7 @@ flg_manager::flg_manager(const std::vector& era_factions, default_leader_type_ = (*default_leader_cfg_)["type"].str(); default_leader_gender_ = (*default_leader_cfg_)["gender"].str(); } else { - default_leader_cfg_ = NULL; + default_leader_cfg_ = nullptr; } } else if (default_leader_type_.empty()) { // Find a unit which can recruit. @@ -91,10 +91,10 @@ flg_manager::flg_manager(const std::vector& era_factions, } if (!default_leader_type_.empty() && default_leader_type_ != "random") { const unit_type* unit = unit_types.find(default_leader_type_); - if (unit == NULL) { + if (unit == nullptr) { default_leader_type_.clear(); default_leader_gender_.clear(); - default_leader_cfg_ = NULL; + default_leader_cfg_ = nullptr; } } @@ -332,7 +332,7 @@ void flg_manager::resolve_random(rand_rng::mt_rng & rng, const std::vector generator(NULL); + util::scoped_ptr generator(nullptr); generator.assign(create_map_generator(level["map_generation"], level.child("generator"))); state.set_scenario(generator->create_scenario()); @@ -883,7 +883,7 @@ void start_local_game_commandline(CVideo& video, const config& game_config, statistics::fresh_stats(); { - ng::connect_engine_ptr connect_engine(new ng::connect_engine(state, true, NULL)); + ng::connect_engine_ptr connect_engine(new ng::connect_engine(state, true, nullptr)); mp::connect ui(video, parameters.name, game_config, gamechat, gamelist, *connect_engine); diff --git a/src/game_initialization/multiplayer_create.cpp b/src/game_initialization/multiplayer_create.cpp index 6474c6825741..2a46cfb0da4a 100644 --- a/src/game_initialization/multiplayer_create.cpp +++ b/src/game_initialization/multiplayer_create.cpp @@ -112,7 +112,7 @@ create::create(CVideo& video, const config& cfg, saved_game& state, filter_num_players_slider_(video), description_(video, 100, "", false), filter_name_(video, 100, "", true, 256, font::SIZE_SMALL), - image_restorer_(NULL), + image_restorer_(nullptr), image_rect_(null_rect), available_level_types_(), engine_(video, state) @@ -618,7 +618,7 @@ void create::hide_children(bool hide) filter_name_.hide(hide); if (hide) { - image_restorer_.assign(NULL); + image_restorer_.assign(nullptr); } else { image_restorer_.assign(new surface_restorer(&video(), image_rect_)); diff --git a/src/game_initialization/multiplayer_lobby.cpp b/src/game_initialization/multiplayer_lobby.cpp index 542cea0b8e4c..b2139eb4b464 100644 --- a/src/game_initialization/multiplayer_lobby.cpp +++ b/src/game_initialization/multiplayer_lobby.cpp @@ -64,7 +64,7 @@ std::vector empty_string_vector; namespace mp { gamebrowser::gamebrowser(CVideo& video, const config &map_hashes) : - menu(video, empty_string_vector, false, -1, -1, NULL, &menu::bluebg_style), + menu(video, empty_string_vector, false, -1, -1, nullptr, &menu::bluebg_style), gold_icon_locator_("themes/gold.png"), xp_icon_locator_("themes/units.png"), map_size_icon_locator_("misc/map.png"), @@ -128,7 +128,7 @@ void gamebrowser::draw() return; if(dirty()) { bg_restore(); - util::scoped_ptr clipper(NULL); + util::scoped_ptr clipper(nullptr); if(clip_rect()) clipper.assign(new clip_rect_setter(video().getSurface(), clip_rect())); draw_contents(); @@ -155,7 +155,7 @@ void gamebrowser::draw_row(const size_t index, const SDL_Rect& item_rect, ROW_TY int ypos = item_rect.y + margin_; std::string no_era_string = ""; // Draw minimaps - if (game.mini_map != NULL) { + if (game.mini_map != nullptr) { int minimap_x = xpos + (minimap_size_ - game.mini_map->w)/2; int minimap_y = ypos + (minimap_size_ - game.mini_map->h)/2; video().blit_surface(minimap_x, minimap_y, game.mini_map); diff --git a/src/game_initialization/multiplayer_lobby.hpp b/src/game_initialization/multiplayer_lobby.hpp index cfdfd4c13f6d..ddc7f033ff79 100644 --- a/src/game_initialization/multiplayer_lobby.hpp +++ b/src/game_initialization/multiplayer_lobby.hpp @@ -145,7 +145,7 @@ class gamebrowser : public gui::menu { ADDON_REQ selection_addon_outcome() const { return empty() ? SATISFIED : games_[selected_].addons_outcome; } const std::vector * selection_addon_requirements() const - { return empty() ? NULL : &games_[selected_].addons; } + { return empty() ? nullptr : &games_[selected_].addons; } bool selected() const { return double_clicked_ && !empty(); } void reset_selection() { double_clicked_ = false; } int selection() const { return selected_; } diff --git a/src/game_initialization/multiplayer_ui.cpp b/src/game_initialization/multiplayer_ui.cpp index 1b338602155d..e8dac37fd745 100644 --- a/src/game_initialization/multiplayer_ui.cpp +++ b/src/game_initialization/multiplayer_ui.cpp @@ -154,7 +154,7 @@ std::string chat::format_message(const msg& message) if(message.user == "server" || message.user.substr(0,29) == "whisper: server message from ") { std::string::const_iterator after_markup = - font::parse_markup(message.message.begin(), message.message.end(), NULL, NULL, NULL); + font::parse_markup(message.message.begin(), message.message.end(), nullptr, nullptr, nullptr); msg_text = std::string(after_markup,message.message.end()); } @@ -172,7 +172,7 @@ SDL_Color chat::color_message(const msg& message) { // Normal users are not allowed to color their messages if(message.user == "server" || message.user.substr(0,29) == "whisper: server message from ") { - font::parse_markup(message.message.begin(), message.message.end(), NULL, &c, NULL); + font::parse_markup(message.message.begin(), message.message.end(), nullptr, &c, nullptr); // Highlight private messages too } else if(message.user.substr(0,8) == "whisper:") { c = font::LABEL_COLOR; @@ -193,7 +193,7 @@ ui::ui(CVideo& video, const std::string& title, const config& cfg, chat& c, conf title_(video_, title, font::SIZE_LARGE, font::TITLE_COLOR), entry_textbox_(video_, 100), chat_textbox_(video_, 100, "", false), - users_menu_(video_, std::vector(), false, -1, -1, NULL, &umenu_style), + users_menu_(video_, std::vector(), false, -1, -1, nullptr, &umenu_style), user_list_(), selected_game_(""), @@ -204,7 +204,7 @@ ui::ui(CVideo& video, const std::string& title, const config& cfg, chat& c, conf gamelist_refresh_(false), lobby_clock_(0), whisper_warnings_(), - plugins_context_(NULL) + plugins_context_(nullptr) { const SDL_Rect area = sdl::create_rect(0 , 0 @@ -284,9 +284,9 @@ void ui::draw_contents() surface background(image::get_image("misc/lobby.png")); background = scale_surface(background, video().getx(), video().gety()); - if(background == NULL) + if(background == nullptr) return; - sdl_blit(background, NULL, video().getSurface(), NULL); + sdl_blit(background, nullptr, video().getSurface(), nullptr); hide_children(false); } @@ -394,7 +394,7 @@ void ui::send_chat_message(const std::string& message, bool /*allies_only*/) msg["sender"] = preferences::login(); data.add_child("message", msg); - add_chat_message(time(NULL), preferences::login(),0, message); //local echo + add_chat_message(time(nullptr), preferences::login(),0, message); //local echo network::send_data(data, 0); } @@ -420,7 +420,7 @@ void ui::handle_key_event(const SDL_KeyboardEvent& event) text.append(line_start ? ": " : " "); } else { std::string completion_list = utils::join(matches, " "); - chat_.add_message(time(NULL), "", completion_list); + chat_.add_message(time(nullptr), "", completion_list); chat_.update_textbox(chat_textbox_); } entry_textbox_.set_text(text); @@ -448,7 +448,7 @@ void ui::process_message(const config& msg, const bool whisper) { timetable::const_iterator i = whisper_warnings_.find(sender); time_t last_warning = 0; - const time_t cur_time = time(NULL); + const time_t cur_time = time(nullptr); static const time_t warning_duration = 5 * 60; if (i != whisper_warnings_.end()) { @@ -483,7 +483,7 @@ void ui::process_message(const config& msg, const bool whisper) { preferences::parse_admin_authentication(sender, message); - bool is_lobby = dynamic_cast(this) != NULL; + bool is_lobby = dynamic_cast(this) != nullptr; if (whisper || utils::word_match(message, preferences::login())) { mp_ui_alerts::private_message(is_lobby, sender, message); @@ -508,7 +508,7 @@ void ui::process_message(const config& msg, const bool whisper) { if (!room.empty()) room = room + ": "; - chat_.add_message(time(NULL), room + prefix, msg["message"]); + chat_.add_message(time(nullptr), room + prefix, msg["message"]); chat_.update_textbox(chat_textbox_); config temp = msg; @@ -544,19 +544,19 @@ void ui::process_network_data(const config& data, const network::connection /*so } } else if (const config &c = data.child("room_join")) { if (c["player"] == preferences::login()) { - chat_.add_message(time(NULL), "server", + chat_.add_message(time(nullptr), "server", "You have joined the room '" + c["room"].str() + "'"); } else { - chat_.add_message(time(NULL), "server", + chat_.add_message(time(nullptr), "server", c["player"].str() + " has joined the room '" + c["room"].str() + "'"); } chat_.update_textbox(chat_textbox_); } else if (const config &c = data.child("room_part")) { if (c["player"] == preferences::login()) { - chat_.add_message(time(NULL), "server", + chat_.add_message(time(nullptr), "server", "You have left the room '" + c["room"].str() + "'"); } else { - chat_.add_message(time(NULL), "server", + chat_.add_message(time(nullptr), "server", c["player"].str() + " has left the room '" + c["room"].str() + "'"); } chat_.update_textbox(chat_textbox_); @@ -567,7 +567,7 @@ void ui::process_network_data(const config& data, const network::connection /*so BOOST_FOREACH(const config& m, ms.child_range("member")) { ss << m["name"] << " "; } - chat_.add_message(time(NULL), "server", ss.str()); + chat_.add_message(time(nullptr), "server", ss.str()); chat_.update_textbox(chat_textbox_); } if (const config &rs = c.child("rooms")) { @@ -576,7 +576,7 @@ void ui::process_network_data(const config& data, const network::connection /*so BOOST_FOREACH(const config& r, rs.child_range("room")) { ss << r["name"].str() << "(" << r["size"].str() << ") "; } - chat_.add_message(time(NULL), "server", ss.str()); + chat_.add_message(time(nullptr), "server", ss.str()); chat_.update_textbox(chat_textbox_); } } @@ -763,7 +763,7 @@ void ui::set_user_menu_items(const std::vector& list) void ui::set_user_list(const std::vector& list, bool silent) { if(!silent) { - bool is_lobby = dynamic_cast(this) != NULL; + bool is_lobby = dynamic_cast(this) != nullptr; if(list.size() < user_list_.size()) { mp_ui_alerts::player_leaves(is_lobby); diff --git a/src/game_initialization/multiplayer_wait.cpp b/src/game_initialization/multiplayer_wait.cpp index 7e754025d036..173f1cf6dc6a 100644 --- a/src/game_initialization/multiplayer_wait.cpp +++ b/src/game_initialization/multiplayer_wait.cpp @@ -143,7 +143,7 @@ void wait::leader_preview_pane::draw_contents() if (!unit_image.null()) { image_rect.w = unit_image->w; image_rect.h = unit_image->h; - sdl_blit(unit_image, NULL, screen, &image_rect); + sdl_blit(unit_image, nullptr, screen, &image_rect); } font::draw_text(&video(), area, font::SIZE_PLUS, font::NORMAL_COLOR, @@ -199,7 +199,7 @@ wait::wait(CVideo& v, const config& cfg, saved_game& state, ui(v, _("Game Lobby"), cfg, c, gamelist), cancel_button_(video(), first_scenario ? _("Cancel") : _("Quit")), start_label_(video(), _("Waiting for game to start..."), font::SIZE_SMALL, font::LOBBY_COLOR), - game_menu_(video(), std::vector(), false, -1, -1, NULL, &gui::menu::bluebg_style), + game_menu_(video(), std::vector(), false, -1, -1, nullptr, &gui::menu::bluebg_style), level_(), state_(state), first_scenario_(first_scenario), @@ -269,7 +269,7 @@ void wait::join_game(bool observe) //(i.e. we're loading from a saved game), then prefer to get the side //with the same description as our login. Otherwise just choose the first //available side. - const config *side_choice = NULL; + const config *side_choice = nullptr; int side_num = -1, nb_sides = 0; BOOST_FOREACH(const config &sd, get_scenario().child_range("side")) { @@ -370,7 +370,7 @@ void wait::join_game(bool observe) leader_preview_pane leader_selector(video(), flg, color); preview_panes.push_back(&leader_selector); - const int faction_choice = gui::show_dialog(video(), NULL, + const int faction_choice = gui::show_dialog(video(), nullptr, _("Choose your faction:"), _("Starting position: ") + std::to_string(side_num + 1), gui::OK_CANCEL, &choices, &preview_panes); diff --git a/src/game_initialization/playcampaign.hpp b/src/game_initialization/playcampaign.hpp index fb4e131d7cdd..d9407840fc0a 100644 --- a/src/game_initialization/playcampaign.hpp +++ b/src/game_initialization/playcampaign.hpp @@ -70,7 +70,7 @@ class campaign_controller , tdata_(tdata) , is_unit_test_(is_unit_test) , is_replay_(false) - , mp_info_(NULL) + , mp_info_(nullptr) { } LEVEL_RESULT play_game(); diff --git a/src/game_initialization/singleplayer.cpp b/src/game_initialization/singleplayer.cpp index e412a0480264..652ad61505a7 100644 --- a/src/game_initialization/singleplayer.cpp +++ b/src/game_initialization/singleplayer.cpp @@ -157,7 +157,7 @@ bool enter_configure_mode(CVideo& video, const config& game_config, saved_game& bool enter_connect_mode(CVideo& video, const config& game_config, saved_game& state, bool local_players_only) { - ng::connect_engine connect_eng(state, true, NULL); + ng::connect_engine connect_eng(state, true, nullptr); if (state.mp_settings().show_connect) { mp::ui::result res; diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 3bc9bc2821a0..f9ff48d6b4df 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -63,7 +63,7 @@ #include // for auto_any_base, etc #include // for optional #include // for tuple -#include // for NULL, system +#include // for system #include // for operator<<, basic_ostream, etc #include // for pair #include // for SDL_INIT_JOYSTICK, etc @@ -385,7 +385,7 @@ bool game_launcher::init_video() #if !(defined(__APPLE__)) surface icon(image::get_image("icons/icon-game.png", image::UNSCALED)); - if(icon != NULL) { + if(icon != nullptr) { video().set_window_icon(icon); } diff --git a/src/game_state.cpp b/src/game_state.cpp index cdfe09447cdd..327bf55a228c 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -73,7 +73,7 @@ game_state::game_state(const config & level, play_controller & pc, game_board& b tod_manager_(level), pathfind_manager_(new pathfind::manager(level)), reports_(new reports()), - lua_kernel_(new game_lua_kernel(NULL, *this, pc, *reports_)), + lua_kernel_(new game_lua_kernel(nullptr, *this, pc, *reports_)), events_manager_(new game_events::manager()), player_number_(level["playing_team"].to_int() + 1), end_level_data_(), @@ -219,7 +219,7 @@ void game_state::init(const config& level, play_controller & pc) pathfind_manager_.reset(new pathfind::manager(level)); - lua_kernel_.reset(new game_lua_kernel(NULL, *this, pc, *reports_)); + lua_kernel_.reset(new game_lua_kernel(nullptr, *this, pc, *reports_)); } void game_state::bind(wb::manager *, game_display * gd) @@ -260,7 +260,7 @@ void game_state::write(config& cfg) const // Preserve the undo stack so that fog/shroud clearing is kept accurate. undo_stack_->write(cfg.add_child("undo_stack")); - if(end_level_data_.get_ptr() != NULL) { + if(end_level_data_.get_ptr() != nullptr) { end_level_data_->write(cfg.add_child("end_level_data")); } } @@ -314,7 +314,7 @@ bool game_state::can_recruit_from(const map_location& leader_loc, int side) cons return false; } - return pathfind::find_vacant_tile(leader_loc, pathfind::VACANT_CASTLE, NULL, + return pathfind::find_vacant_tile(leader_loc, pathfind::VACANT_CASTLE, nullptr, &(board_.teams())[side-1]) != map_location::null_location(); } diff --git a/src/game_state.hpp b/src/game_state.hpp index 2da398f73601..63f50be362f1 100644 --- a/src/game_state.hpp +++ b/src/game_state.hpp @@ -52,7 +52,7 @@ class game_state : public filter_context boost::scoped_ptr reports_; boost::scoped_ptr lua_kernel_; boost::scoped_ptr events_manager_; - /// undo_stack_ is never NULL. It is implemented as a pointer so that + /// undo_stack_ is never nullptr. It is implemented as a pointer so that /// undo_list can be an incomplete type at this point (which reduces the /// number of files that depend on actions/undo.hpp). boost::scoped_ptr undo_stack_; diff --git a/src/generators/cave_map_generator.cpp b/src/generators/cave_map_generator.cpp index e9ddf02f67ea..cb994599ffe2 100644 --- a/src/generators/cave_map_generator.cpp +++ b/src/generators/cave_map_generator.cpp @@ -178,7 +178,7 @@ void cave_map_generator::cave_map_generator_job::generate_chambers() build_chamber(new_chamber.center,new_chamber.locs,chamber_size,jagged_edges); const config &items = ch.child("items"); - new_chamber.items = items ? &items : NULL; + new_chamber.items = items ? &items : nullptr; const std::string &id = ch["id"]; if (!id.empty()) { @@ -209,14 +209,14 @@ void cave_map_generator::cave_map_generator_job::place_chamber(const chamber& c) set_terrain(*i,params.clear_); } - if (c.items == NULL || c.locs.empty()) return; + if (c.items == nullptr || c.locs.empty()) return; size_t index = 0; BOOST_FOREACH(const config::any_child &it, c.items->all_children_range()) { config cfg = it.cfg; config &filter = cfg.child("filter"); - config* object_filter = NULL; + config* object_filter = nullptr; if (config &object = cfg.child("object")) { if (config &of = object.child("filter")) object_filter = &of; diff --git a/src/generators/default_map_generator.cpp b/src/generators/default_map_generator.cpp index 19d8a798fd45..8f672200e94a 100644 --- a/src/generators/default_map_generator.cpp +++ b/src/generators/default_map_generator.cpp @@ -126,14 +126,14 @@ void default_map_generator::user_config(CVideo& v) const std::string& castlesize_label = _("Castle size:"); const std::string& landform_label = _("Landform:"); - SDL_Rect players_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,players_label,0,0); - SDL_Rect width_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,width_label,0,0); - SDL_Rect height_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,height_label,0,0); - SDL_Rect iterations_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,iterations_label,0,0); - SDL_Rect hillsize_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,hillsize_label,0,0); - SDL_Rect villages_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_label,0,0); - SDL_Rect castlesize_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,castlesize_label,0,0); - SDL_Rect landform_rect = font::draw_text(NULL,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,0,0); + SDL_Rect players_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,players_label,0,0); + SDL_Rect width_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,width_label,0,0); + SDL_Rect height_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,height_label,0,0); + SDL_Rect iterations_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,iterations_label,0,0); + SDL_Rect hillsize_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,hillsize_label,0,0); + SDL_Rect villages_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,villages_label,0,0); + SDL_Rect castlesize_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,castlesize_label,0,0); + SDL_Rect landform_rect = font::draw_text(nullptr,screen_area(),font::SIZE_NORMAL,font::NORMAL_COLOR,landform_label,0,0); const int horz_margin = 15; const int text_right = xpos + horz_margin + @@ -348,7 +348,7 @@ std::string default_map_generator::config_name() const std::string default_map_generator::create_map(boost::optional randomseed) { - return generate_map(NULL, randomseed); + return generate_map(nullptr, randomseed); } std::string default_map_generator::generate_map(std::map* labels, boost::optional randomseed) @@ -363,7 +363,7 @@ std::string default_map_generator::generate_map(std::map labels_copy; - std::map * labels_ptr = labels ? &labels_copy : NULL; + std::map * labels_ptr = labels ? &labels_copy : nullptr; std::string error_message; //initilize the job outside the loop so that we really get a different result everytime we run the loop. default_map_generator_job job(seed); diff --git a/src/generators/default_map_generator_job.cpp b/src/generators/default_map_generator_job.cpp index 14aec3df338b..9c00e8483b62 100644 --- a/src/generators/default_map_generator_job.cpp +++ b/src/generators/default_map_generator_job.cpp @@ -611,13 +611,13 @@ std::string default_map_generator_job::generate_name(const unit_race& name_gener LOG_NG << "calling name generator...\n"; const std::string& name = name_generator.generate_name(unit_race::MALE); LOG_NG << "name generator returned '" << name << "'\n"; - if(base_name != NULL) { + if(base_name != nullptr) { *base_name = name; } LOG_NG << "assigned base name..\n"; utils::string_map table; - if(additional_symbols == NULL) { + if(additional_symbols == nullptr) { additional_symbols = &table; } @@ -783,7 +783,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t config naming = cfg.child_or_empty("naming"); // If the [naming] child is empty, we cannot provide good names. - std::map* misc_labels = naming.empty() ? NULL : labels; + std::map* misc_labels = naming.empty() ? nullptr : labels; // HACK: dummy names to satisfy unit_race requirements naming["id"] = "village_naming"; naming["plural_name"] = "villages"; @@ -842,7 +842,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t std::vector river = generate_river(heights, terrain, x, y, cfg["river_frequency"]); - if(river.empty() == false && misc_labels != NULL) { + if(river.empty() == false && misc_labels != nullptr) { std::string base_name; LOG_NG << "generating name for river...\n"; const std::string& name = generate_name(name_generator,"river_name",&base_name); @@ -865,7 +865,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t LOG_NG << "generating lake...\n"; std::set locs; bool res = generate_lake(terrain, x, y, cfg["lake_size"], locs); - if(res && misc_labels != NULL) { + if(res && misc_labels != nullptr) { bool touches_other_lake = false; std::string base_name; @@ -1145,7 +1145,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t direction = 2; } - if(misc_labels != NULL && on_bridge == false) { + if(misc_labels != nullptr && on_bridge == false) { on_bridge = true; std::string bridge_base_name; const std::string& name = generate_name(name_generator, "bridge_name", &bridge_base_name); @@ -1172,7 +1172,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t if(convert_to.empty() == false) { const t_translation::t_terrain letter = t_translation::read_terrain_code(convert_to); - if(misc_labels != NULL && terrain[x][y] != letter && name_count++ == name_frequency && on_bridge == false) { + if(misc_labels != nullptr && terrain[x][y] != letter && name_count++ == name_frequency && on_bridge == false) { misc_labels->insert(std::pair(map_location(x-width/3,y-height/3),name)); name_count = 0; } @@ -1211,7 +1211,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t } // Remove all labels under the castle tiles - if(labels != NULL) { + if(labels != nullptr) { labels->erase(location(x-width/3,y-height/3)); for (size_t i = 0; i < castle_size - 1; i++) { labels->erase(location(x+castles[i][0]-width/3, @@ -1229,7 +1229,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t *we name these now that everything else is placed (as e.g., placing * roads could split a forest) */ - if ( misc_labels != NULL ) { + if ( misc_labels != nullptr ) { for (x = width / 3; x < (width / 3)*2; x++) { for (y = height / 3; y < (height / 3) * 2;y++) { //check the terrain of the tile @@ -1279,7 +1279,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t { config naming_cfg = cfg.child_or_empty("village_naming"); // If the [village_naming] child is empty, we cannot provide good names. - std::map* village_labels = naming_cfg.empty() ? NULL : labels; + std::map* village_labels = naming_cfg.empty() ? nullptr : labels; // HACK: dummy names to satisfy unit_race requirements naming_cfg["id"] = "village_naming"; naming_cfg["plural_name"] = "villages"; @@ -1331,7 +1331,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t villages.insert(res); - if ( village_labels != NULL ) { + if ( village_labels != nullptr ) { const map_location loc(res.x-width/3,res.y-height/3); map_location adj[6]; @@ -1428,7 +1428,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t std::string name; for(size_t ntry = 0; ntry != 30 && (ntry == 0 || used_names.count(name) > 0); ++ntry) { - name = generate_name(village_names_generator,name_type,NULL,&symbols); + name = generate_name(village_names_generator,name_type,nullptr,&symbols); } used_names.insert(name); diff --git a/src/generators/default_map_generator_job.hpp b/src/generators/default_map_generator_job.hpp index 24afd5fbdeea..964770acff66 100644 --- a/src/generators/default_map_generator_job.hpp +++ b/src/generators/default_map_generator_job.hpp @@ -60,8 +60,8 @@ class default_map_generator_job bool generate_lake(t_translation::t_map& terrain, int x, int y, int lake_fall_off, std::set& locs_touched); map_location random_point_at_side(size_t width, size_t height); std::string generate_name(const unit_race& name_generator, const std::string& id, - std::string* base_name=NULL, - utils::string_map* additional_symbols=NULL); + std::string* base_name=nullptr, + utils::string_map* additional_symbols=nullptr); boost::random::mt19937 rng_; diff --git a/src/generators/map_create.cpp b/src/generators/map_create.cpp index 7fac0ec005d4..e52b4771f94e 100644 --- a/src/generators/map_create.cpp +++ b/src/generators/map_create.cpp @@ -37,7 +37,7 @@ map_generator* create_map_generator(const std::string& name, const config &cfg) } else if(name == "lua") { return new lua_map_generator(cfg); } else { - return NULL; + return nullptr; } } @@ -50,7 +50,7 @@ std::string random_generate_map(const std::string& parms, const config &cfg) std::vector parameters = utils::split(parms, ' '); assert(!parameters.empty()); //we use parameters.front() in the next line. util::scoped_ptr generator(create_map_generator(parameters.front(),cfg)); - if(generator == NULL) { + if(generator == nullptr) { std::stringstream ss; ss << "could not find map generator '" << parameters.front() << "'"; throw mapgen_exception(ss.str()); @@ -67,7 +67,7 @@ config random_generate_scenario(const std::string& parms, const config &cfg) std::vector parameters = utils::split(parms, ' '); assert(!parameters.empty()); //we use parameters.front() in the next line. util::scoped_ptr generator(create_map_generator(parameters.front(),cfg)); - if(generator == NULL) { + if(generator == nullptr) { std::stringstream ss; ss << "could not find map generator '" << parameters.front() << "'"; throw mapgen_exception(ss.str()); diff --git a/src/generators/map_generator.cpp b/src/generators/map_generator.cpp index 78228d041d76..55f2abfeeb62 100644 --- a/src/generators/map_generator.cpp +++ b/src/generators/map_generator.cpp @@ -82,7 +82,7 @@ int main(int argc, char** argv) nplayers = atoi(argv[7]); } - srand(time(NULL)); + srand(time(nullptr)); std::cout << generate_map(x,y,iterations,hill_size,lakes,nvillages,nplayers) << "\n"; } diff --git a/src/gettext.cpp b/src/gettext.cpp index 9b390e689561..2831bae20892 100644 --- a/src/gettext.cpp +++ b/src/gettext.cpp @@ -51,7 +51,7 @@ std::string dsgettext (const char * domainname, const char *msgid) const char *msgval = ::dgettext (domainname, msgid); if (msgval == msgid) { msgval = std::strrchr (msgid, '^'); - if (msgval == NULL) + if (msgval == nullptr) msgval = msgid; else msgval++; @@ -66,7 +66,7 @@ const char* sgettext (const char *msgid) const char *msgval = gettext (msgid); if (msgval == msgid) { msgval = std::strrchr (msgid, '^'); - if (msgval == NULL) + if (msgval == nullptr) msgval = msgid; else msgval++; @@ -79,7 +79,7 @@ const char* sngettext (const char *singular, const char *plural, int n) const char *msgval = ngettext (singular, plural, n); if (msgval == singular) { msgval = std::strrchr (singular, '^'); - if (msgval == NULL) + if (msgval == nullptr) msgval = singular; else msgval++; @@ -94,7 +94,7 @@ std::string dsngettext (const char * domainname, const char *singular, const cha const char *msgval = ::dngettext (domainname, singular, plural, n); if (msgval == singular) { msgval = std::strrchr (singular, '^'); - if (msgval == NULL) + if (msgval == nullptr) msgval = singular; else msgval++; @@ -104,7 +104,7 @@ std::string dsngettext (const char * domainname, const char *singular, const cha void bind_textdomain(const char* domain, const char* directory, const char* encoding) { - if(domain != NULL && strchr(domain, '/') != NULL) { + if(domain != nullptr && strchr(domain, '/') != nullptr) { // For compatibility with Boost.Locale implementation, which interprets // slashes in domain names in a special fashion. ERR_G << "illegal textdomain name '" << domain @@ -112,9 +112,9 @@ void bind_textdomain(const char* domain, const char* directory, const char* enco return; } - if(directory != NULL) + if(directory != nullptr) bindtextdomain(domain, directory); - if(encoding != NULL) + if(encoding != nullptr) bind_textdomain_codeset(domain, encoding); } @@ -150,7 +150,7 @@ void set_language(const std::string& slocale, const std::vector* al } #endif - char *res = NULL; + char *res = nullptr; std::vector::const_iterator i; if (alternates) i = alternates->begin(); diff --git a/src/gettext_boost.cpp b/src/gettext_boost.cpp index eec253380d0f..eb87ae15bd9a 100644 --- a/src/gettext_boost.cpp +++ b/src/gettext_boost.cpp @@ -225,7 +225,7 @@ std::string dsgettext (const char * domainname, const char *msgid) std::string msgval = dgettext (domainname, msgid); if (msgval == msgid) { const char* firsthat = std::strrchr (msgid, '^'); - if (firsthat == NULL) + if (firsthat == nullptr) msgval = msgid; else msgval = firsthat + 1; @@ -238,7 +238,7 @@ std::string dsngettext (const char * domainname, const char *singular, const cha std::string msgval = boost::locale::dngettext(domainname, singular, plural, n, get_manager().get_locale()); if (msgval == singular) { const char* firsthat = std::strrchr (singular, '^'); - if (firsthat == NULL) + if (firsthat == nullptr) msgval = singular; else msgval = firsthat + 1; diff --git a/src/global.hpp b/src/global.hpp index 83d5678971e9..5395693bb312 100644 --- a/src/global.hpp +++ b/src/global.hpp @@ -46,7 +46,7 @@ #ifdef NDEBUG /* * Wesnoth uses asserts to avoid undefined behaviour. For example, to make sure - * pointers are not NULL before deferring them, or collections are not empty + * pointers are not nullptr before deferring them, or collections are not empty * before accessing their elements. Therefore Wesnoth should not be compiled * with assertions disabled. */ diff --git a/src/gui/auxiliary/field.hpp b/src/gui/auxiliary/field.hpp index b377c13c0ea1..cdc5c7f2d41d 100644 --- a/src/gui/auxiliary/field.hpp +++ b/src/gui/auxiliary/field.hpp @@ -54,7 +54,7 @@ class tfield_ * @param mandatory Is the widget mandatory */ tfield_(const std::string& id, const bool mandatory) - : id_(id), mandatory_(mandatory), widget_(NULL) + : id_(id), mandatory_(mandatory), widget_(nullptr) { } @@ -74,7 +74,7 @@ class tfield_ * @todo Most functions that have a window parameter only use it to get the * widget. Evaluate and remove the window parameter where applicable. * - * @pre widget_ == NULL + * @pre widget_ == nullptr * * @param window The window to be attached to. */ @@ -130,12 +130,12 @@ class tfield_ /** * Detaches the field from a window. * - * @pre widget_ != NULL || !mandatory_ + * @pre widget_ != nullptr || !mandatory_ */ void detach_from_window() { assert(!mandatory_ || widget_); - widget_ = NULL; + widget_ = nullptr; } /** diff --git a/src/gui/auxiliary/formula.hpp b/src/gui/auxiliary/formula.hpp index ca1bf7c57f90..9d7a4ef43240 100644 --- a/src/gui/auxiliary/formula.hpp +++ b/src/gui/auxiliary/formula.hpp @@ -81,13 +81,13 @@ class tformula * @param functions The variables, which can be called during the * evaluation of the formula. (Note is is also * possible to add extra functions to the table, - * when the variable is not @c NULL. + * when the variable is not @c nullptr. * * @returns The stored result or the result of the * evaluation of the formula. */ T operator()(const game_logic::map_formula_callable& variables, - game_logic::function_symbol_table* functions = NULL) const; + game_logic::function_symbol_table* functions = nullptr) const; /** Determine whether the class contains a formula. */ bool has_formula() const @@ -119,7 +119,7 @@ class tformula * @param functions The variables, which can be called during the * evaluation of the formula. (Note is is also * possible to add extra functions to the table, - * when the variable is not @c NULL. + * when the variable is not @c nullptr. * * @returns The calculated value. */ diff --git a/src/gui/auxiliary/iterator/policy_visit.hpp b/src/gui/auxiliary/iterator/policy_visit.hpp index 85c37c971e1d..19a0b4782783 100644 --- a/src/gui/auxiliary/iterator/policy_visit.hpp +++ b/src/gui/auxiliary/iterator/policy_visit.hpp @@ -58,7 +58,7 @@ class tskip */ gui2::twidget* get(twalker_&) { - return NULL; + return nullptr; } }; diff --git a/src/gui/auxiliary/iterator/walker_grid.cpp b/src/gui/auxiliary/iterator/walker_grid.cpp index ca99e7b017e8..61b48f76108c 100644 --- a/src/gui/auxiliary/iterator/walker_grid.cpp +++ b/src/gui/auxiliary/iterator/walker_grid.cpp @@ -38,7 +38,7 @@ twalker_::tstate tgrid::next(const tlevel level) switch(level) { case widget: if(widget_) { - widget_ = NULL; + widget_ = nullptr; return invalid; } else { /* FALL DOWN */ @@ -63,7 +63,7 @@ bool tgrid::at_end(const tlevel level) const { switch(level) { case widget: - return widget_ == NULL; + return widget_ == nullptr; case grid: return true; case child: @@ -80,17 +80,17 @@ gui2::twidget* tgrid::get(const tlevel level) case widget: return widget_; case grid: - return NULL; + return nullptr; case child: if(itor_ == grid_.end()) { - return NULL; + return nullptr; } else { return *itor_; } } assert(false); - return NULL; + return nullptr; } } // namespace iterator diff --git a/src/gui/auxiliary/iterator/walker_widget.cpp b/src/gui/auxiliary/iterator/walker_widget.cpp index a23b610ac574..53e0ea046220 100644 --- a/src/gui/auxiliary/iterator/walker_widget.cpp +++ b/src/gui/auxiliary/iterator/walker_widget.cpp @@ -41,7 +41,7 @@ twalker_::tstate twidget::next(const tlevel level) switch(level) { case widget: if(widget_) { - widget_ = NULL; + widget_ = nullptr; return invalid; } else { /* FALL DOWN */ @@ -59,7 +59,7 @@ bool twidget::at_end(const tlevel level) const { switch(level) { case widget: - return widget_ == NULL; + return widget_ == nullptr; case grid: /* FALL DOWN */ case child: return true; @@ -76,11 +76,11 @@ gui2::twidget* twidget::get(const tlevel level) return widget_; case grid: /* FALL DOWN */ case child: - return NULL; + return nullptr; } assert(false); - return NULL; + return nullptr; } } // namespace walker diff --git a/src/gui/core/canvas.cpp b/src/gui/core/canvas.cpp index dc94102c28a3..22a3aac618c2 100644 --- a/src/gui/core/canvas.cpp +++ b/src/gui/core/canvas.cpp @@ -1181,7 +1181,7 @@ void timage::draw(surface& canvas, for(int y = 0; y < rows; ++y) { const SDL_Rect dest = sdl::create_rect( x * image_->w, y * image_->h, 0, 0); - blit_surface(image_, NULL, surf, &dest); + blit_surface(image_, nullptr, surf, &dest); } } @@ -1512,11 +1512,11 @@ void tcanvas::blit(surface& surf, SDL_Rect rect) SDL_Rect r = rect; surface s = get_surface_portion(surf, r); s = blur_surface(s, blur_depth_, false); - sdl_blit(s, NULL, surf, &rect); + sdl_blit(s, nullptr, surf, &rect); } } - sdl_blit(canvas_, NULL, surf, &rect); + sdl_blit(canvas_, nullptr, surf, &rect); } void tcanvas::parse_cfg(const config& cfg) diff --git a/src/gui/core/event/dispatcher.cpp b/src/gui/core/event/dispatcher.cpp index d4aaff956e98..8fdaae8235c1 100644 --- a/src/gui/core/event/dispatcher.cpp +++ b/src/gui/core/event/dispatcher.cpp @@ -256,7 +256,7 @@ class ttrigger_notification bool& handled, bool& halt) { - functor(dispatcher, event, handled, halt, NULL); + functor(dispatcher, event, handled, halt, nullptr); } }; diff --git a/src/gui/core/event/dispatcher.hpp b/src/gui/core/event/dispatcher.hpp index 72b06d77f84f..d3b75ac2092d 100644 --- a/src/gui/core/event/dispatcher.hpp +++ b/src/gui/core/event/dispatcher.hpp @@ -80,7 +80,7 @@ tsignal_keyboard_function; * Callback function signature. * * This function is used for the callbacks in tset_event_notification. - * Added the dummy void* parameter which will be NULL to get a different + * Added the dummy void* parameter which will be nullptr to get a different * signature as tsignal_function's callback. */ typedef boost::function } else { typedef typename boost::mpl::next::type titor; return find::value>::execute( - static_cast(NULL), - static_cast(NULL), + static_cast(nullptr), + static_cast(nullptr), event, functor); } @@ -240,7 +240,7 @@ inline bool find(E event, F functor) typedef typename boost::mpl::end::type end; return implementation::find::value>::execute( - static_cast(NULL), static_cast(NULL), event, functor); + static_cast(nullptr), static_cast(nullptr), event, functor); } namespace implementation @@ -279,8 +279,8 @@ namespace implementation * If there's no line from widget to parent the result is undefined. * (If widget == dispatcher the result will always be empty.) * - * @pre dispatcher != NULL - * @pre widget != NULL + * @pre dispatcher != nullptr + * @pre widget != nullptr * * @param event The event to test. * @param dispatcher The final widget to test, this is also the @@ -498,8 +498,8 @@ inline bool fire_event(const tevent event, * A helper to allow the common event firing code to be shared between the * different signal function types. * - * @pre dispatcher != NULL - * @pre widget != NULL + * @pre dispatcher != nullptr + * @pre widget != nullptr * * @tparam T The signal type of the event to handle. * @tparam F The type of the functor. diff --git a/src/gui/core/event/distributor.cpp b/src/gui/core/event/distributor.cpp index 6e128bf518b0..f03564db80bc 100644 --- a/src/gui/core/event/distributor.cpp +++ b/src/gui/core/event/distributor.cpp @@ -111,11 +111,11 @@ class tlock tmouse_motion::tmouse_motion(twidget& owner, const tdispatcher::tposition queue_position) - : mouse_focus_(NULL) + : mouse_focus_(nullptr) , mouse_captured_(false) , owner_(owner) , hover_timer_(0) - , hover_widget_(NULL) + , hover_widget_(nullptr) , hover_position_(0, 0) , hover_shown_(true) , signal_handler_sdl_mouse_motion_entered_(false) @@ -296,7 +296,7 @@ void tmouse_motion::show_tooltip() hover_shown_ = true; hover_timer_ = 0; - hover_widget_ = NULL; + hover_widget_ = nullptr; hover_position_ = tpoint(0, 0); } @@ -309,9 +309,9 @@ void tmouse_motion::mouse_leave() owner_.fire(event::MOUSE_LEAVE, *mouse_focus_); } - owner_.fire(NOTIFY_REMOVE_TOOLTIP, *mouse_focus_, NULL); + owner_.fire(NOTIFY_REMOVE_TOOLTIP, *mouse_focus_, nullptr); - mouse_focus_ = NULL; + mouse_focus_ = nullptr; stop_hover_timer(); } @@ -353,7 +353,7 @@ void tmouse_motion::stop_hover_timer() } hover_timer_ = 0; - hover_widget_ = NULL; + hover_widget_ = nullptr; hover_position_ = tpoint(0, 0); } } @@ -381,7 +381,7 @@ tmouse_button::initialize_state(const bool is_down) { last_click_stamp_ = 0; - last_clicked_widget_ = NULL; + last_clicked_widget_ = nullptr; focus_ = 0; is_down_ = is_down; } @@ -539,7 +539,7 @@ void tmouse_button(keyboard_focus_); - if(control != NULL && !control->get_active()) { + if(control != nullptr && !control->get_active()) { continue; } @@ -775,32 +775,32 @@ void tdistributor::signal_handler_notify_removal(tdispatcher& widget, } if(tmouse_button_left::last_clicked_widget_ == &widget) { - tmouse_button_left::last_clicked_widget_ = NULL; + tmouse_button_left::last_clicked_widget_ = nullptr; } if(tmouse_button_left::focus_ == &widget) { - tmouse_button_left::focus_ = NULL; + tmouse_button_left::focus_ = nullptr; } if(tmouse_button_middle::last_clicked_widget_ == &widget) { - tmouse_button_middle::last_clicked_widget_ = NULL; + tmouse_button_middle::last_clicked_widget_ = nullptr; } if(tmouse_button_middle::focus_ == &widget) { - tmouse_button_middle::focus_ = NULL; + tmouse_button_middle::focus_ = nullptr; } if(tmouse_button_right::last_clicked_widget_ == &widget) { - tmouse_button_right::last_clicked_widget_ = NULL; + tmouse_button_right::last_clicked_widget_ = nullptr; } if(tmouse_button_right::focus_ == &widget) { - tmouse_button_right::focus_ = NULL; + tmouse_button_right::focus_ = nullptr; } if(mouse_focus_ == &widget) { - mouse_focus_ = NULL; + mouse_focus_ = nullptr; } if(keyboard_focus_ == &widget) { - keyboard_focus_ = NULL; + keyboard_focus_ = nullptr; } const std::vector::iterator itor = std::find(keyboard_focus_chain_.begin(), diff --git a/src/gui/core/event/distributor.hpp b/src/gui/core/event/distributor.hpp index ea59f10377ef..40be362eedd4 100644 --- a/src/gui/core/event/distributor.hpp +++ b/src/gui/core/event/distributor.hpp @@ -252,7 +252,7 @@ class tdistributor : public tmouse_button_left, * Captures the keyboard input. * * @param widget The widget which should capture the keyboard. - * Sending NULL releases the capturing. + * Sending nullptr releases the capturing. */ void keyboard_capture(twidget* widget); diff --git a/src/gui/core/event/handler.cpp b/src/gui/core/event/handler.cpp index 53f2f84fc1b6..e103ec096e1a 100644 --- a/src/gui/core/event/handler.cpp +++ b/src/gui/core/event/handler.cpp @@ -58,8 +58,8 @@ namespace event /***** Static data. *****/ class thandler; -static thandler* handler = NULL; -static events::event_context* event_context = NULL; +static thandler* handler = nullptr; +static events::event_context* event_context = nullptr; #ifdef MAIN_EVENT_HANDLER static unsigned draw_interval = 0; @@ -83,8 +83,8 @@ static Uint32 timer_sdl_draw_event(Uint32, void*) data.type = DRAW_EVENT; data.code = 0; - data.data1 = NULL; - data.data2 = NULL; + data.data1 = nullptr; + data.data2 = nullptr; event.type = DRAW_EVENT; event.user = data; @@ -214,7 +214,7 @@ class thandler : public events::sdl_handler * Gets the dispatcher that wants to receive the keyboard input. * * @returns The dispatcher. - * @retval NULL No dispatcher found. + * @retval nullptr No dispatcher found. */ tdispatcher* keyboard_dispatcher(); @@ -297,9 +297,9 @@ class thandler : public events::sdl_handler thandler::thandler() : events::sdl_handler(false) - , mouse_focus(NULL) + , mouse_focus(nullptr) , dispatchers_() - , keyboard_focus_(NULL) + , keyboard_focus_(nullptr) { if(SDL_WasInit(SDL_INIT_TIMER) == 0) { if(SDL_InitSubSystem(SDL_INIT_TIMER) == -1) { @@ -463,10 +463,10 @@ void thandler::disconnect(tdispatcher* dispatcher) dispatchers_.erase(itor); if(dispatcher == mouse_focus) { - mouse_focus = NULL; + mouse_focus = nullptr; } if(dispatcher == keyboard_focus_) { - keyboard_focus_ = NULL; + keyboard_focus_ = nullptr; } /***** Set proper state for the other dispatchers. *****/ @@ -484,7 +484,7 @@ void thandler::disconnect(tdispatcher* dispatcher) if(dispatchers_.empty()) { leave(); delete event_context; - event_context = NULL; + event_context = nullptr; } } @@ -493,7 +493,7 @@ void thandler::activate() FOREACH(AUTO dispatcher, dispatchers_) { dispatcher->fire( - SDL_ACTIVATE, dynamic_cast(*dispatcher), NULL); + SDL_ACTIVATE, dynamic_cast(*dispatcher), nullptr); } } @@ -661,7 +661,7 @@ tdispatcher* thandler::keyboard_dispatcher() } } - return NULL; + return nullptr; } void thandler::hat_motion(const SDL_Event& event) @@ -752,17 +752,17 @@ tmanager::tmanager() #ifdef MAIN_EVENT_HANDLER draw_interval = 30; - SDL_AddTimer(draw_interval, timer_sdl_draw_event, NULL); + SDL_AddTimer(draw_interval, timer_sdl_draw_event, nullptr); event_poll_interval = 10; - SDL_AddTimer(event_poll_interval, timer_sdl_poll_events, NULL); + SDL_AddTimer(event_poll_interval, timer_sdl_poll_events, nullptr); #endif } tmanager::~tmanager() { delete handler; - handler = NULL; + handler = nullptr; #ifdef MAIN_EVENT_HANDLER draw_interval = 0; @@ -811,7 +811,7 @@ void release_mouse(tdispatcher* dispatcher) assert(handler); assert(dispatcher); if(handler->mouse_focus == dispatcher) { - handler->mouse_focus = NULL; + handler->mouse_focus = nullptr; } } diff --git a/src/gui/core/notifiee.hpp b/src/gui/core/notifiee.hpp index 6f1805e6a494..e87d1fb195fb 100644 --- a/src/gui/core/notifiee.hpp +++ b/src/gui/core/notifiee.hpp @@ -35,7 +35,7 @@ class tnotifiee typedef FUNCTOR tfunctor; friend class tnotifier; - tnotifiee() : notifier_(NULL) + tnotifiee() : notifier_(nullptr) { } diff --git a/src/gui/core/notifier.hpp b/src/gui/core/notifier.hpp index 2273a835c30d..95a620899dcf 100644 --- a/src/gui/core/notifier.hpp +++ b/src/gui/core/notifier.hpp @@ -48,7 +48,7 @@ class tnotifier assert(item.first); assert((*item.first).notifier_ == this); - (*item.first).notifier_ = NULL; + (*item.first).notifier_ = nullptr; } } @@ -84,7 +84,7 @@ class tnotifier assert(notifiee.notifier_ == this); - notifiee.notifier_ = NULL; + notifiee.notifier_ = nullptr; notifiees_.erase(itor); } diff --git a/src/gui/core/timer.cpp b/src/gui/core/timer.cpp index 2027c77b9696..d3d6b821189c 100644 --- a/src/gui/core/timer.cpp +++ b/src/gui/core/timer.cpp @@ -99,7 +99,7 @@ static Uint32 timer_callback(Uint32, void* id) data.type = TIMER_EVENT; data.code = 0; data.data1 = id; - data.data2 = NULL; + data.data2 = nullptr; event.type = TIMER_EVENT; event.user = data; diff --git a/src/gui/dialogs/chat_log.cpp b/src/gui/dialogs/chat_log.cpp index 3429833db5c0..53226ac89a6f 100644 --- a/src/gui/dialogs/chat_log.cpp +++ b/src/gui/dialogs/chat_log.cpp @@ -71,7 +71,7 @@ class tchat_log::model public: model(const vconfig& c, replay* r) : cfg(c) - , msg_label(NULL) + , msg_label(nullptr) , chat_log_history(r->build_chat_log()) , page(0) , page_number() diff --git a/src/gui/dialogs/debug_clock.cpp b/src/gui/dialogs/debug_clock.cpp index 9e95427cff3c..4b98c01213c5 100644 --- a/src/gui/dialogs/debug_clock.cpp +++ b/src/gui/dialogs/debug_clock.cpp @@ -175,7 +175,7 @@ tdebug_clock::ttime::ttime() : hour(0), minute(0), second(0), millisecond(0) void tdebug_clock::ttime::set_current_time() { - time_t now = time(NULL); + time_t now = time(nullptr); tm* stamp = localtime(&now); hour = stamp->tm_hour; diff --git a/src/gui/dialogs/debug_clock.hpp b/src/gui/dialogs/debug_clock.hpp index b13989d7cd15..a79141e7e19d 100644 --- a/src/gui/dialogs/debug_clock.hpp +++ b/src/gui/dialogs/debug_clock.hpp @@ -33,15 +33,15 @@ class tdebug_clock : public tpopup public: tdebug_clock() : tpopup() - , hour_percentage_(NULL) - , minute_percentage_(NULL) - , second_percentage_(NULL) - , hour_(NULL) - , minute_(NULL) - , second_(NULL) - , pane_(NULL) - , clock_(NULL) - , window_(NULL) + , hour_percentage_(nullptr) + , minute_percentage_(nullptr) + , second_percentage_(nullptr) + , hour_(nullptr) + , minute_(nullptr) + , second_(nullptr) + , pane_(nullptr) + , clock_(nullptr) + , window_(nullptr) , signal_() , time_() { diff --git a/src/gui/dialogs/editor/custom_tod.cpp b/src/gui/dialogs/editor/custom_tod.cpp index b2659c375efd..9ea878a0d4dd 100644 --- a/src/gui/dialogs/editor/custom_tod.cpp +++ b/src/gui/dialogs/editor/custom_tod.cpp @@ -89,12 +89,12 @@ tcustom_tod::tcustom_tod(editor::editor_display* display, const std::vector& tods) : tods_(tods) , current_tod_(0) - , current_tod_name_(NULL) - , current_tod_id_(NULL) - , current_tod_image_(NULL) - , current_tod_mask_(NULL) - , current_tod_sound_(NULL) - , current_tod_number_(NULL) + , current_tod_name_(nullptr) + , current_tod_id_(nullptr) + , current_tod_image_(nullptr) + , current_tod_mask_(nullptr) + , current_tod_sound_(nullptr) + , current_tod_number_(nullptr) , lawful_bonus_field_(register_integer("lawful_bonus", true)) , tod_red_field_(register_integer("tod_red", true, diff --git a/src/gui/dialogs/editor/custom_tod.hpp b/src/gui/dialogs/editor/custom_tod.hpp index 31379c438552..cc186388c2fa 100644 --- a/src/gui/dialogs/editor/custom_tod.hpp +++ b/src/gui/dialogs/editor/custom_tod.hpp @@ -111,7 +111,7 @@ class tcustom_tod : public tdialog /** * The display to update when the ToD changes. * - * The pointer may be NULL, in the unit tests, but normally it should be a + * The pointer may be nullptr, in the unit tests, but normally it should be a * pointer to a valid object. */ editor::editor_display* display_; diff --git a/src/gui/dialogs/editor/generate_map.cpp b/src/gui/dialogs/editor/generate_map.cpp index 01618c8be16e..e7ce16158702 100644 --- a/src/gui/dialogs/editor/generate_map.cpp +++ b/src/gui/dialogs/editor/generate_map.cpp @@ -64,7 +64,7 @@ REGISTER_DIALOG(editor_generate_map) teditor_generate_map::teditor_generate_map() : map_generators_() - , last_map_generator_(NULL) + , last_map_generator_(nullptr) , current_map_generator_(0) , random_seed_() { @@ -125,7 +125,7 @@ void teditor_generate_map::pre_show(twindow& window) } } - if (last_map_generator_ != NULL) { + if (last_map_generator_ != nullptr) { // We need to call this manually because it won't be called by // list.select_row() even if we set the callback before // calling it diff --git a/src/gui/dialogs/formula_debugger.cpp b/src/gui/dialogs/formula_debugger.cpp index dfd1af7d5ed8..56491c17891d 100644 --- a/src/gui/dialogs/formula_debugger.cpp +++ b/src/gui/dialogs/formula_debugger.cpp @@ -110,7 +110,7 @@ void tformula_debugger::pre_show(twindow& window) << ": \"" << font::escape_text(i.name()) << "\": (" << font::escape_text(i.str()) << ") = " << "" - << font::escape_text(i.value().to_debug_string(NULL, false)) + << font::escape_text(i.value().to_debug_string(nullptr, false)) << "" << std::endl; } } diff --git a/src/gui/dialogs/game_cache_options.cpp b/src/gui/dialogs/game_cache_options.cpp index 5cfac566a72e..d37d2db36810 100644 --- a/src/gui/dialogs/game_cache_options.cpp +++ b/src/gui/dialogs/game_cache_options.cpp @@ -76,9 +76,9 @@ REGISTER_DIALOG(game_cache_options) tgame_cache_options::tgame_cache_options() : cache_path_(filesystem::get_cache_dir()) - , clean_button_(NULL) - , purge_button_(NULL) - , size_label_(NULL) + , clean_button_(nullptr) + , purge_button_(nullptr) + , size_label_(nullptr) { } @@ -121,7 +121,7 @@ void tgame_cache_options::pre_show(twindow& window) void tgame_cache_options::post_show(twindow& /*window*/) { - size_label_ = NULL; + size_label_ = nullptr; } void tgame_cache_options::update_cache_size_display() diff --git a/src/gui/dialogs/game_load.cpp b/src/gui/dialogs/game_load.cpp index 7c3a8bd71fd6..9609499469fb 100644 --- a/src/gui/dialogs/game_load.cpp +++ b/src/gui/dialogs/game_load.cpp @@ -330,7 +330,7 @@ void tgame_load::evaluate_summary_string(std::stringstream& str, switch(ct.v) { case game_classification::CAMPAIGN_TYPE::SCENARIO: { const std::string campaign_id = cfg_summary["campaign"]; - const config* campaign = NULL; + const config* campaign = nullptr; if(!campaign_id.empty()) { if(const config& c = cache_config_.find_child( "campaign", "id", campaign_id)) { @@ -339,7 +339,7 @@ void tgame_load::evaluate_summary_string(std::stringstream& str, } } utils::string_map symbols; - if(campaign != NULL) { + if(campaign != nullptr) { symbols["campaign_name"] = (*campaign)["name"]; } else { // Fallback to nontranslatable campaign id. @@ -348,7 +348,7 @@ void tgame_load::evaluate_summary_string(std::stringstream& str, str << vgettext("Campaign: $campaign_name", symbols); // Display internal id for debug purposes if we didn't above - if(game_config::debug && (campaign != NULL)) { + if(game_config::debug && (campaign != nullptr)) { str << '\n' << "(" << campaign_id << ")"; } break; diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 2b55317ccc67..30b96cd07c76 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -31,14 +31,14 @@ namespace gui2 REGISTER_DIALOG(loadscreen) tloadscreen::tloadscreen(boost::function f) - : window_(NULL) + : window_(nullptr) , timer_id_(0) , animation_counter_(0) , work_(f) , worker_() , cursor_setter_() - , current_stage_(NULL) - , current_visible_stage_(NULL) + , current_stage_(nullptr) + , current_visible_stage_(nullptr) { current_load = this; } @@ -48,7 +48,7 @@ void tloadscreen::close() if(window_) { window_->undraw(); delete window_; - window_ = NULL; + window_ = nullptr; } } @@ -85,7 +85,7 @@ void tloadscreen::progress(const char* stage) } } -tloadscreen* tloadscreen::current_load = NULL; +tloadscreen* tloadscreen::current_load = nullptr; void tloadscreen::timer_callback(twindow& window) { @@ -109,7 +109,7 @@ void tloadscreen::timer_callback(twindow& window) tloadscreen::~tloadscreen() { close(); - current_load = NULL; + current_load = nullptr; } void tloadscreen::display(CVideo& video, boost::function f) diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index ecbeb70a3182..2894198f47a2 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -42,9 +42,9 @@ class tloadscreen : public tdialog ~tloadscreen(); static void display(CVideo& video, boost::function f); - static bool displaying() { return current_load != NULL; } + static bool displaying() { return current_load != nullptr; } - static void progress(const char* stage_name = NULL); + static void progress(const char* stage_name = nullptr); /** * Hides the window. diff --git a/src/gui/dialogs/lobby/data.cpp b/src/gui/dialogs/lobby/data.cpp index c99339e3e094..0251a8522d11 100644 --- a/src/gui/dialogs/lobby/data.cpp +++ b/src/gui/dialogs/lobby/data.cpp @@ -62,7 +62,7 @@ void chat_log::add_message(const time_t& timestamp, void chat_log::add_message(const std::string& user, const std::string& message) { - add_message(time(NULL), user, message); + add_message(time(nullptr), user, message); } void chat_log::clear() @@ -110,7 +110,7 @@ user_info::user_info(const config& c) } void user_info::update_state(int selected_game_id, - const room_info* current_room /*= NULL*/) + const room_info* current_room /*= nullptr*/) { if(game_id != 0) { if(game_id == selected_game_id) { @@ -119,7 +119,7 @@ void user_info::update_state(int selected_game_id, state = GAME; } } else { - if(current_room != NULL && current_room->is_member(name)) { + if(current_room != nullptr && current_room->is_member(name)) { state = SEL_ROOM; } else { state = LOBBY; diff --git a/src/gui/dialogs/lobby/data.hpp b/src/gui/dialogs/lobby/data.hpp index 432b25176a20..0b77ee6a36f3 100644 --- a/src/gui/dialogs/lobby/data.hpp +++ b/src/gui/dialogs/lobby/data.hpp @@ -104,7 +104,7 @@ struct user_info explicit user_info(const config& c); void update_state(int selected_game_id, - const room_info* current_room = NULL); + const room_info* current_room = nullptr); void update_relation(); enum user_relation { diff --git a/src/gui/dialogs/lobby/info.cpp b/src/gui/dialogs/lobby/info.cpp index f8d7781d5845..368ee0d12dd2 100644 --- a/src/gui/dialogs/lobby/info.cpp +++ b/src/gui/dialogs/lobby/info.cpp @@ -204,7 +204,7 @@ void lobby_info::process_userlist() { if(ui.game_id != 0) { game_info* g = get_game_by_id(ui.game_id); - if(g == NULL) { + if(g == nullptr) { WRN_NG << "User " << ui.name << " has unknown game_id: " << ui.game_id << "\n"; } else { @@ -243,13 +243,13 @@ void lobby_info::sync_games_display_status() game_info* lobby_info::get_game_by_id(int id) { std::map::iterator i = games_by_id_.find(id); - return i == games_by_id_.end() ? NULL : i->second; + return i == games_by_id_.end() ? nullptr : i->second; } const game_info* lobby_info::get_game_by_id(int id) const { std::map::const_iterator i = games_by_id_.find(id); - return i == games_by_id_.end() ? NULL : i->second; + return i == games_by_id_.end() ? nullptr : i->second; } room_info* lobby_info::get_room(const std::string& name) @@ -259,7 +259,7 @@ room_info* lobby_info::get_room(const std::string& name) if(r.name() == name) return &r; } - return NULL; + return nullptr; } const room_info* lobby_info::get_room(const std::string& name) const @@ -269,12 +269,12 @@ const room_info* lobby_info::get_room(const std::string& name) const if(r.name() == name) return &r; } - return NULL; + return nullptr; } bool lobby_info::has_room(const std::string& name) const { - return get_room(name) != NULL; + return get_room(name) != nullptr; } chat_log& lobby_info::get_whisper_log(const std::string& name) diff --git a/src/gui/dialogs/lobby/lobby.cpp b/src/gui/dialogs/lobby/lobby.cpp index 89295ac9cc72..0ec931df9b4a 100644 --- a/src/gui/dialogs/lobby/lobby.cpp +++ b/src/gui/dialogs/lobby/lobby.cpp @@ -172,7 +172,7 @@ void tlobby_main::send_chat_message(const std::string& message, msg["sender"] = preferences::login(); data.add_child("message", msg); - add_chat_message(time(NULL), preferences::login(), 0, message); // local + add_chat_message(time(nullptr), preferences::login(), 0, message); // local // echo network::send_data(data, 0); } @@ -342,21 +342,21 @@ tlobby_main::tlobby_main(const config& game_config, CVideo& video) : legacy_result_(QUIT) , game_config_(game_config) - , gamelistbox_(NULL) - , userlistbox_(NULL) - , roomlistbox_(NULL) - , chat_log_container_(NULL) - , chat_input_(NULL) - , window_(NULL) + , gamelistbox_(nullptr) + , userlistbox_(nullptr) + , roomlistbox_(nullptr) + , chat_log_container_(nullptr) + , chat_input_(nullptr) + , window_(nullptr) , lobby_info_(info) - , preferences_callback_(NULL) + , preferences_callback_() , open_windows_() , active_window_(0) - , filter_friends_(NULL) - , filter_ignored_(NULL) - , filter_slots_(NULL) - , filter_invert_(NULL) - , filter_text_(NULL) + , filter_friends_(nullptr) + , filter_ignored_(nullptr) + , filter_slots_(nullptr) + , filter_invert_(nullptr) + , filter_text_(nullptr) , selected_game_id_() , player_list_() , player_list_dirty_(false) @@ -454,10 +454,10 @@ void modify_grid_with_data(tgrid* grid, const std::string& key = v.first; const string_map& strmap = v.second; twidget* w = grid->find(key, false); - if(w == NULL) + if(w == nullptr) continue; tcontrol* c = dynamic_cast(w); - if(c == NULL) + if(c == nullptr) continue; FOREACH(const AUTO & vv, strmap) { @@ -794,7 +794,7 @@ void tlobby_main::update_playerlist() FOREACH(AUTO userptr, lobby_info_.users_sorted()) { user_info& user = *userptr; - tsub_player_list* target_list(NULL); + tsub_player_list* target_list(nullptr); std::map data; std::stringstream icon_ss; std::string name = user.name; @@ -1032,7 +1032,7 @@ void tlobby_main::pre_show(twindow& window) void tlobby_main::post_show(twindow& /*window*/) { - window_ = NULL; + window_ = nullptr; remove_timer(lobby_update_timer_); lobby_update_timer_ = 0; } @@ -1041,7 +1041,7 @@ room_info* tlobby_main::active_window_room() { const tlobby_chat_window& t = open_windows_[active_window_]; if(t.whisper) - return NULL; + return nullptr; return lobby_info_.get_room(t.name); } @@ -1101,7 +1101,7 @@ tlobby_chat_window* tlobby_main::search_create_window(const std::string& name, return &open_windows_.back(); } - return NULL; + return nullptr; } bool tlobby_main::whisper_window_active(const std::string& name) diff --git a/src/gui/dialogs/lobby/lobby.hpp b/src/gui/dialogs/lobby/lobby.hpp index fbdc6a6e1d4b..5ec574f23e66 100644 --- a/src/gui/dialogs/lobby/lobby.hpp +++ b/src/gui/dialogs/lobby/lobby.hpp @@ -190,7 +190,7 @@ class tlobby_main : public tdialog, private events::chat_handler legacy_result legacy_result_; /** - * Get the room* corresponding to the currently active window, or NULL + * Get the room* corresponding to the currently active window, or nullptr * if a whisper window is active at the moment */ room_info* active_window_room(); diff --git a/src/gui/dialogs/lobby/player_info.cpp b/src/gui/dialogs/lobby/player_info.cpp index 0e1a3185bb6b..437b2165faea 100644 --- a/src/gui/dialogs/lobby/player_info.cpp +++ b/src/gui/dialogs/lobby/player_info.cpp @@ -35,12 +35,12 @@ tlobby_player_info::tlobby_player_info(events::chat_handler& chat, const lobby_info& li) : chat_(chat) , info_(info) - , reason_(NULL) - , time_(NULL) - , relation_(NULL) - , add_to_friends_(NULL) - , add_to_ignores_(NULL) - , remove_from_list_(NULL) + , reason_(nullptr) + , time_(nullptr) + , relation_(nullptr) + , add_to_friends_(nullptr) + , add_to_ignores_(nullptr) + , remove_from_list_(nullptr) , result_open_whisper_(false) , lobby_info_(li) { @@ -103,7 +103,7 @@ void tlobby_player_info::pre_show(twindow& window) std::stringstream loc; const game_info* game = lobby_info_.get_game_by_id(info_.game_id); - if(game != NULL) { + if(game != nullptr) { loc << _("In game:") << " " << game->name << " "; if(info_.observing) { loc << _("(observing)"); diff --git a/src/gui/dialogs/lua_interpreter.cpp b/src/gui/dialogs/lua_interpreter.cpp index 90965dde3caf..f1e7d1024f63 100644 --- a/src/gui/dialogs/lua_interpreter.cpp +++ b/src/gui/dialogs/lua_interpreter.cpp @@ -81,7 +81,7 @@ class tlua_interpreter::view { tscroll_label* msg_label; //the view is extremely simple, it's pretty much just this one widget that gets updated public: - view() : msg_label(NULL) {} + view() : msg_label(nullptr) {} /** Bind the scroll label widget to my pointer, and configure */ void bind(twindow& window) { @@ -143,7 +143,7 @@ class tlua_interpreter::lua_model { ~lua_model() { DBG_LUA << "destroying a tlua_interpreter::model\n"; - L_.set_external_log(NULL); //deregister our log since it's about to be destroyed + L_.set_external_log(nullptr); //deregister our log since it's about to be destroyed } /** Ask the lua kernel to execute a command. No throw of game::lua_error, instead the error message is formatted and printed to console.*/ @@ -232,7 +232,7 @@ class tlua_interpreter::input_model { #ifdef HAVE_HISTORY LOG_LUA << "searching in direction " << direction << " from position " << where_history() << "\n"; - HIST_ENTRY * e = NULL; + HIST_ENTRY * e = nullptr; if (end_of_history_) { // if the direction is > 0, do nothing because searching down only takes place when we are in the history records. if (direction < 0) { @@ -254,7 +254,7 @@ class tlua_interpreter::input_model { if (result == 0) { e = current_history(); } else { - e = NULL; // if the search misses, it leaves the state as it was, which might not have been on an entry matching prefix. + e = nullptr; // if the search misses, it leaves the state as it was, which might not have been on an entry matching prefix. end_of_history_ = true; // we actually want to force it to be null and treat as off the end of history in this case. } } @@ -364,8 +364,8 @@ class tlua_interpreter::controller { void search(int direction); public: controller(lua_kernel_base & lk) - : copy_button(NULL) - , text_entry(NULL) + : copy_button(nullptr) + , text_entry(nullptr) , text_entry_() , lua_model_(new tlua_interpreter::lua_model(lk)) , input_model_(new tlua_interpreter::input_model()) diff --git a/src/gui/dialogs/message.cpp b/src/gui/dialogs/message.cpp index e22a5b0cf5f5..6d5bd6bde1fe 100644 --- a/src/gui/dialogs/message.cpp +++ b/src/gui/dialogs/message.cpp @@ -103,7 +103,7 @@ void tmessage::post_show(twindow& /*window*/) { FOREACH(AUTO & button_status, buttons_) { - button_status.button = NULL; + button_status.button = nullptr; } } @@ -134,7 +134,7 @@ void tmessage::set_button_retval(const tbutton_id button, const int retval) } tmessage::tbutton_status::tbutton_status() - : button(NULL) + : button(nullptr) , caption() , visible(twidget::tvisible::invisible) , retval(twindow::NONE) diff --git a/src/gui/dialogs/multiplayer/mp_change_control.cpp b/src/gui/dialogs/multiplayer/mp_change_control.cpp index f6ec6ce009db..9010e3febe01 100644 --- a/src/gui/dialogs/multiplayer/mp_change_control.cpp +++ b/src/gui/dialogs/multiplayer/mp_change_control.cpp @@ -86,7 +86,7 @@ void dialog_view_callback(twidget& caller) class tmp_change_control::model { public: - model() : sides_list(NULL), nicks_list(NULL), sides(), nicks() + model() : sides_list(nullptr), nicks_list(nullptr), sides(), nicks() { } diff --git a/src/gui/dialogs/multiplayer/mp_create_game.cpp b/src/gui/dialogs/multiplayer/mp_create_game.cpp index c3c1fbd46b93..d87d45593f0e 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.cpp @@ -45,7 +45,7 @@ REGISTER_DIALOG(mp_create_game) tmp_create_game::tmp_create_game(const config& cfg) : cfg_(cfg) - , scenario_(NULL) + , scenario_(nullptr) , use_map_settings_(register_bool( "use_map_settings", true, @@ -101,7 +101,7 @@ void tmp_create_game::pre_show(twindow& window) // User maps /* FIXME implement user maps std::vector maps; - filesystem::get_files_in_dir(filesystem::get_user_data_dir() + "/editor/maps", &maps, NULL, + filesystem::get_files_in_dir(filesystem::get_user_data_dir() + "/editor/maps", &maps, nullptr, filesystem::FILE_NAME_ONLY); FOREACH(const AUTO& map, maps) { @@ -153,7 +153,7 @@ void tmp_create_game::update_map(twindow& window) minimap.set_map_data((*scenario_)["map_data"]); } else { minimap.set_map_data(""); - scenario_ = NULL; + scenario_ = nullptr; } update_map_settings(window); diff --git a/src/gui/dialogs/popup.cpp b/src/gui/dialogs/popup.cpp index 04dc1b0b9b7b..e96fe29ddc0c 100644 --- a/src/gui/dialogs/popup.cpp +++ b/src/gui/dialogs/popup.cpp @@ -22,7 +22,7 @@ namespace gui2 { -tpopup::tpopup() : window_(NULL) +tpopup::tpopup() : window_(nullptr) { } @@ -59,7 +59,7 @@ void tpopup::hide() if(window_) { window_->undraw(); delete window_; - window_ = NULL; + window_ = nullptr; } } diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index f1e6751e12ac..a9d438aac5a3 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -977,7 +977,7 @@ void tpreferences::add_hotkey_callback(tlistbox& hotkeys) hotkey::hotkey_ptr oldhk; // only if not cancelled. - if (newhk.get() == NULL) { + if (newhk.get() == nullptr) { return; } diff --git a/src/gui/dialogs/title_screen.cpp b/src/gui/dialogs/title_screen.cpp index 714e4bfe120c..c524b056353c 100644 --- a/src/gui/dialogs/title_screen.cpp +++ b/src/gui/dialogs/title_screen.cpp @@ -132,7 +132,7 @@ static bool hotkey(twindow& window, const ttitle_screen::tresult result) return true; } -ttitle_screen::ttitle_screen() : debug_clock_(NULL) +ttitle_screen::ttitle_screen() : debug_clock_(nullptr) { } @@ -394,7 +394,7 @@ void ttitle_screen::show_debug_clock_window(CVideo& video) if(debug_clock_) { delete debug_clock_; - debug_clock_ = NULL; + debug_clock_ = nullptr; } else { debug_clock_ = new tdebug_clock(); debug_clock_->show(video, true); diff --git a/src/gui/dialogs/wml_message.hpp b/src/gui/dialogs/wml_message.hpp index e69e8e55c5a2..273fe0335efe 100644 --- a/src/gui/dialogs/wml_message.hpp +++ b/src/gui/dialogs/wml_message.hpp @@ -56,10 +56,10 @@ class twml_message_ : public tdialog , mirror_(mirror) , has_input_(false) , input_caption_("") - , input_text_(NULL) + , input_text_(nullptr) , input_maximum_length_(0) , option_list_() - , chosen_option_(NULL) + , chosen_option_(nullptr) { } diff --git a/src/gui/widgets/container.hpp b/src/gui/widgets/container.hpp index 41a069a1914a..66a5c828c686 100644 --- a/src/gui/widgets/container.hpp +++ b/src/gui/widgets/container.hpp @@ -150,7 +150,7 @@ class tcontainer_ : public tcontrol */ virtual iterator::twalker_* create_walker() override { - return NULL; + return nullptr; } /** diff --git a/src/gui/widgets/control.cpp b/src/gui/widgets/control.cpp index 055b72bdbc86..c665b249f7f2 100644 --- a/src/gui/widgets/control.cpp +++ b/src/gui/widgets/control.cpp @@ -52,7 +52,7 @@ tcontrol::tcontrol(const unsigned canvas_count) , tooltip_() , help_message_() , canvas_(canvas_count) - , config_(NULL) + , config_(nullptr) , renderer_() , text_maximum_width_(0) , text_alignment_(PANGO_ALIGN_LEFT) @@ -79,7 +79,7 @@ tcontrol::tcontrol(const implementation::tbuilder_control& builder, , tooltip_(builder.tooltip) , help_message_(builder.help) , canvas_(canvas_count) - , config_(NULL) + , config_(nullptr) , renderer_() , text_maximum_width_(0) , text_alignment_(PANGO_ALIGN_LEFT) @@ -287,7 +287,7 @@ twidget* tcontrol::find_at(const tpoint& coordinate, const bool must_be_active) return (twidget::find_at(coordinate, must_be_active) && (!must_be_active || get_active())) ? this - : NULL; + : nullptr; } const twidget* tcontrol::find_at(const tpoint& coordinate, @@ -296,7 +296,7 @@ const twidget* tcontrol::find_at(const tpoint& coordinate, return (twidget::find_at(coordinate, must_be_active) && (!must_be_active || get_active())) ? this - : NULL; + : nullptr; } twidget* tcontrol::find(const std::string& id, const bool must_be_active) @@ -304,7 +304,7 @@ twidget* tcontrol::find(const std::string& id, const bool must_be_active) return (twidget::find(id, must_be_active) && (!must_be_active || get_active())) ? this - : NULL; + : nullptr; } const twidget* tcontrol::find(const std::string& id, const bool must_be_active) @@ -313,7 +313,7 @@ const twidget* tcontrol::find(const std::string& id, const bool must_be_active) return (twidget::find(id, must_be_active) && (!must_be_active || get_active())) ? this - : NULL; + : nullptr; } void tcontrol::set_definition(const std::string& definition) diff --git a/src/gui/widgets/control.hpp b/src/gui/widgets/control.hpp index 76a5b9530fc8..bec2b795226a 100644 --- a/src/gui/widgets/control.hpp +++ b/src/gui/widgets/control.hpp @@ -107,7 +107,7 @@ class tcontrol : public twidget /** * Gets the minimum size as defined in the config. * - * @pre config_ != NULL + * @pre config_ != nullptr * * @returns The size. */ @@ -116,7 +116,7 @@ class tcontrol : public twidget /** * Gets the default size as defined in the config. * - * @pre config_ != NULL + * @pre config_ != nullptr * * @returns The size. */ @@ -125,7 +125,7 @@ class tcontrol : public twidget /** * Gets the best size as defined in the config. * - * @pre config_ != NULL + * @pre config_ != nullptr * * @returns The size. */ diff --git a/src/gui/widgets/debug.cpp b/src/gui/widgets/debug.cpp index 0c21986e8519..50947836a932 100644 --- a/src/gui/widgets/debug.cpp +++ b/src/gui/widgets/debug.cpp @@ -83,7 +83,7 @@ std::string get_child_widget_id(const std::string& parent_id, std::string get_base_filename() { char buf[17] = { 0 }; - time_t t = time(NULL); + time_t t = time(nullptr); tm* lt = localtime(&t); if(lt) { strftime(buf, sizeof(buf), "%Y%m%d_%H%M%S", lt); diff --git a/src/gui/widgets/generator.cpp b/src/gui/widgets/generator.cpp index 7a136862f887..7dbb6e49d415 100644 --- a/src/gui/widgets/generator.cpp +++ b/src/gui/widgets/generator.cpp @@ -228,7 +228,7 @@ twidget* thorizontal_list::find_at(const tpoint& coordinate, return widget; } } - return NULL; + return nullptr; } const twidget* thorizontal_list::find_at(const tpoint& coordinate, @@ -251,7 +251,7 @@ const twidget* thorizontal_list::find_at(const tpoint& coordinate, return widget; } } - return NULL; + return nullptr; } void thorizontal_list::handle_key_left_arrow(SDLMod /*modifier*/, bool& handled) @@ -428,7 +428,7 @@ twidget* tvertical_list::find_at(const tpoint& coordinate, return widget; } } - return NULL; + return nullptr; } const twidget* tvertical_list::find_at(const tpoint& coordinate, @@ -451,7 +451,7 @@ const twidget* tvertical_list::find_at(const tpoint& coordinate, return widget; } } - return NULL; + return nullptr; } void tvertical_list::handle_key_up_arrow(SDLMod /*modifier*/, bool& handled) @@ -577,7 +577,7 @@ twidget* tindependent::find_at(const tpoint& coordinate, const int selected_item = get_selected_item(); if(selected_item < 0) { - return NULL; + return nullptr; } tgrid& grid = item(selected_item); @@ -591,7 +591,7 @@ const twidget* tindependent::find_at(const tpoint& coordinate, const int selected_item = get_selected_item(); if(selected_item < 0) { - return NULL; + return nullptr; } const tgrid& grid = item(selected_item); @@ -607,7 +607,7 @@ twidget* tindependent::find(const std::string& id, const bool must_be_active) } } } - return NULL; + return nullptr; } const twidget* tindependent::find(const std::string& id, @@ -621,7 +621,7 @@ const twidget* tindependent::find(const std::string& id, } } } - return NULL; + return nullptr; } void tindependent::set_visible_rectangle(const SDL_Rect& rectangle) @@ -805,7 +805,7 @@ tgenerator_* tgenerator_::build(const bool has_minimum, const tplacement placement, const bool select) { - tgenerator_* result = NULL; + tgenerator_* result = nullptr; GENERATE_BODY; return result; } diff --git a/src/gui/widgets/generator_private.hpp b/src/gui/widgets/generator_private.hpp index afed64a7c583..39de3329051a 100644 --- a/src/gui/widgets/generator_private.hpp +++ b/src/gui/widgets/generator_private.hpp @@ -566,7 +566,7 @@ struct tshow : public virtual tgenerator_ * the new item. No widgets with id == "" are * allowed. * @param callback The callback function is not used and - * should be NULL. + * should be nullptr. */ void init(tgrid* grid, const std::map& data, @@ -935,7 +935,7 @@ class tgenerator : public minimum_selection, */ virtual iterator::twalker_* create_walker() override { - return NULL; + return nullptr; } /***** ***** ***** ***** keyboard functions ***** ***** ***** *****/ diff --git a/src/gui/widgets/grid.cpp b/src/gui/widgets/grid.cpp index 4649697d0c0d..7bfd42d7054b 100644 --- a/src/gui/widgets/grid.cpp +++ b/src/gui/widgets/grid.cpp @@ -135,7 +135,7 @@ twidget* tgrid::swap_child(const std::string& id, return old; } - return NULL; + return nullptr; } void tgrid::remove_child(const unsigned row, const unsigned col) @@ -147,7 +147,7 @@ void tgrid::remove_child(const unsigned row, const unsigned col) if(cell.widget()) { delete cell.widget(); } - cell.set_widget(NULL); + cell.set_widget(nullptr); } void tgrid::remove_child(const std::string& id, const bool find_all) @@ -157,7 +157,7 @@ void tgrid::remove_child(const std::string& id, const bool find_all) if(child.id() == id) { delete child.widget(); - child.set_widget(NULL); + child.set_widget(nullptr); if(!find_all) { break; @@ -469,7 +469,7 @@ void tgrid::place(const tpoint& origin, const tpoint& size) out << " Failed to place a grid, we have " << size << " space but we need " << best_size << " space."; out << " This happened at a grid with the id '" << id() << "'"; twidget* pw = parent(); - while(pw != NULL) { + while(pw != nullptr) { out << " in a '" << typeid(*pw).name() << "' with the id '" << pw->id() << "'"; pw = pw->parent(); } diff --git a/src/gui/widgets/grid.hpp b/src/gui/widgets/grid.hpp index 24b32d8070a5..8c5999148470 100644 --- a/src/gui/widgets/grid.hpp +++ b/src/gui/widgets/grid.hpp @@ -136,12 +136,12 @@ class tgrid : public twidget * * returns The widget which got removed (the parent of * the widget is cleared). If no widget found - * and thus not replace NULL will returned. + * and thus not replace nullptr will returned. */ twidget* swap_child(const std::string& id, twidget* widget, const bool recurse, - twidget* new_parent = NULL); + twidget* new_parent = nullptr); /** * Removes and frees a widget in a cell. @@ -311,7 +311,7 @@ class tgrid : public twidget friend struct tgrid_implementation; public: - tchild() : flags_(0), border_size_(0), widget_(NULL) + tchild() : flags_(0), border_size_(0), widget_(nullptr) // Fixme make a class where we can store some properties in the cache // regarding size etc. diff --git a/src/gui/widgets/list.cpp b/src/gui/widgets/list.cpp index 77b0da33b2b8..8cdbdfbcd9bf 100644 --- a/src/gui/widgets/list.cpp +++ b/src/gui/widgets/list.cpp @@ -46,7 +46,7 @@ tlist::tlist(const bool has_minimum, const tbuilder_grid_const_ptr list_builder) : tcontainer_(2) // FIXME magic number , state_(ENABLED) - , generator_(NULL) + , generator_(nullptr) , list_builder_(list_builder) , need_layout_(false) { @@ -82,7 +82,7 @@ tlist::add_row(const std::map& data, const int index) { assert(generator_); - tgrid& grid = generator_->create_item(index, list_builder_, data, NULL); + tgrid& grid = generator_->create_item(index, list_builder_, data, nullptr); tselectable_* selectable = find_widget(&grid, "_toggle", false, false); @@ -198,7 +198,7 @@ void tlist::set_row_shown(const unsigned row, const bool shown) } if(selected_row != get_selected_row()) { - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } } @@ -232,7 +232,7 @@ void tlist::set_row_shown(const std::vector& shown) } if(selected_row != get_selected_row()) { - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } } @@ -438,7 +438,7 @@ void tlist::signal_handler_left_button_click(tgrid* grid, for(size_t i = 0; i < generator_->get_item_count(); ++i) { if(&generator_->item(i) == grid) { generator_->select_item(i); - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } } } @@ -472,7 +472,7 @@ void tlist::signal_handler_sdl_key_down(const event::tevent event, /* Do nothing. */ } if(handled) { - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } } diff --git a/src/gui/widgets/listbox.cpp b/src/gui/widgets/listbox.cpp index 7ef1222b5b64..7246e4aa8d18 100644 --- a/src/gui/widgets/listbox.cpp +++ b/src/gui/widgets/listbox.cpp @@ -64,8 +64,8 @@ tlistbox::tlistbox(const bool has_minimum, : tscrollbar_container(2) // FIXME magic number , generator_(tgenerator_::build(has_minimum, has_maximum, placement, select)) , is_horizonal_(placement == tgenerator_::horizontal_list) - , list_builder_(NULL) - , callback_value_changed_(NULL) + , list_builder_(nullptr) + , callback_value_changed_() , need_layout_(false) , orders_() { @@ -506,7 +506,7 @@ void swap_grid(tgrid* grid, widget->set_id(id); // Get the container containing the wanted widget. - tgrid* parent_grid = NULL; + tgrid* parent_grid = nullptr; if(grid) { parent_grid = find_widget(grid, id, false, false); } @@ -553,7 +553,7 @@ void tlistbox::finalize(tbuilder_grid_const_ptr header, generator_->create_items( -1, list_builder_, list_data, callback_list_item_clicked); - swap_grid(NULL, content_grid(), generator_, "_list_grid"); + swap_grid(nullptr, content_grid(), generator_, "_list_grid"); } namespace { bool default_sort(unsigned i1, unsigned i2) @@ -570,7 +570,7 @@ void tlistbox::order_by_column(unsigned column, twidget& widget) } FOREACH(AUTO& pair, orders_) { - if(pair.first != NULL && pair.first != &selectable) { + if(pair.first != nullptr && pair.first != &selectable) { pair.first->set_value(0); } } @@ -723,7 +723,7 @@ tlistbox_definition::tlistbox_definition(const config& cfg) * The definition of a horizontal listbox is the same as for a normal listbox. */ tlistbox_definition::tresolution::tresolution(const config& cfg) - : tresolution_definition_(cfg), grid(NULL) + : tresolution_definition_(cfg), grid(nullptr) { // Note the order should be the same as the enum tstate in listbox.hpp. state.push_back(tstate_definition(cfg.child("state_enabled"))); @@ -839,9 +839,9 @@ tbuilder_listbox::tbuilder_listbox(const config& cfg) get_scrollbar_mode(cfg["vertical_scrollbar_mode"])) , horizontal_scrollbar_mode( get_scrollbar_mode(cfg["horizontal_scrollbar_mode"])) - , header(NULL) - , footer(NULL) - , list_builder(NULL) + , header(nullptr) + , footer(nullptr) + , list_builder(nullptr) , list_data() , has_minimum_(cfg["has_minimum"].to_bool(true)) , has_maximum_(cfg["has_maximum"].to_bool(true)) @@ -1018,7 +1018,7 @@ tbuilder_horizontal_listbox::tbuilder_horizontal_listbox(const config& cfg) get_scrollbar_mode(cfg["vertical_scrollbar_mode"])) , horizontal_scrollbar_mode( get_scrollbar_mode(cfg["horizontal_scrollbar_mode"])) - , list_builder(NULL) + , list_builder(nullptr) , list_data() { const config& l = cfg.child("list_definition"); @@ -1085,7 +1085,7 @@ twidget* tbuilder_horizontal_listbox::build() const widget->init_grid(conf->grid); - widget->finalize(NULL, NULL, list_data); + widget->finalize(nullptr, nullptr, list_data); return widget; #endif diff --git a/src/gui/widgets/matrix.cpp b/src/gui/widgets/matrix.cpp index 9bd9a179f034..984893fb74f4 100644 --- a/src/gui/widgets/matrix.cpp +++ b/src/gui/widgets/matrix.cpp @@ -58,7 +58,7 @@ unsigned tstate_default::get_state() const } tmatrix::tmatrix(const implementation::tbuilder_matrix& builder) - : tbase(builder, get_control_type()), content_(), pane_(NULL) + : tbase(builder, get_control_type()), content_(), pane_(nullptr) { boost::intrusive_ptr cfg = boost::dynamic_pointer_cast( @@ -182,7 +182,7 @@ iterator::twalker_* tmatrix::create_walker() /** * @todo Implement properly. */ - return NULL; + return nullptr; } const std::string& tmatrix::get_control_type() const @@ -279,10 +279,10 @@ tbuilder_matrix::tbuilder_matrix(const config& cfg) get_scrollbar_mode(cfg["vertical_scrollbar_mode"])) , horizontal_scrollbar_mode( get_scrollbar_mode(cfg["horizontal_scrollbar_mode"])) - , builder_top(NULL) - , builder_bottom(NULL) - , builder_left(NULL) - , builder_right(NULL) + , builder_top(nullptr) + , builder_bottom(nullptr) + , builder_left(nullptr) + , builder_right(nullptr) , builder_main(create_builder_widget(cfg.child("main", "[matrix]"))) { if(const config& top = cfg.child("top")) { diff --git a/src/gui/widgets/matrix.hpp b/src/gui/widgets/matrix.hpp index 9ad9b9e8530c..784efc8426f2 100644 --- a/src/gui/widgets/matrix.hpp +++ b/src/gui/widgets/matrix.hpp @@ -199,7 +199,7 @@ class tmatrix : public tbase * @ref create_item(). * * @returns The wanted grid. - * @retval NULL The id isn't associated with an item. + * @retval nullptr The id isn't associated with an item. */ tgrid* grid(const unsigned id); @@ -211,7 +211,7 @@ class tmatrix : public tbase * @ref create_item(). * * @returns The wanted grid. - * @retval NULL The id isn't associated with an item. + * @retval nullptr The id isn't associated with an item. */ const tgrid* grid(const unsigned id) const; diff --git a/src/gui/widgets/minimap.cpp b/src/gui/widgets/minimap.cpp index 7df4fecbb4f0..f458e699cb7d 100644 --- a/src/gui/widgets/minimap.cpp +++ b/src/gui/widgets/minimap.cpp @@ -132,7 +132,7 @@ static const size_t cache_max_size = 100; * normally doesn't happen a lot so the clearing of the cache is rather * unusual. */ -static const ::config* terrain = NULL; +static const ::config* terrain = nullptr; /** The cache. */ typedef std::map tcache; @@ -185,7 +185,7 @@ bool tminimap::disable_click_dismiss() const const surface tminimap::get_image(const int w, const int h) const { if(!terrain_) { - return NULL; + return nullptr; } if(terrain_ != terrain) { @@ -216,7 +216,7 @@ const surface tminimap::get_image(const int w, const int h) const try { const gamemap map(boost::make_shared(*terrain_), map_data_); - const surface surf = image::getMinimap(w, h, map, NULL); + const surface surf = image::getMinimap(w, h, map, nullptr); cache.insert(std::make_pair(key, tvalue(surf))); #ifdef DEBUG_MINIMAP_CACHE std::cerr << '-'; @@ -230,7 +230,7 @@ const surface tminimap::get_image(const int w, const int h) const std::cerr << 'X'; #endif } - return NULL; + return nullptr; } void tminimap::impl_draw_background(surface& frame_buffer, @@ -253,7 +253,7 @@ void tminimap::impl_draw_background(surface& frame_buffer, const ::surface surf = get_image(rect.w, rect.h); if(surf) { - sdl_blit(surf, NULL, frame_buffer, &rect); + sdl_blit(surf, nullptr, frame_buffer, &rect); } } diff --git a/src/gui/widgets/minimap.hpp b/src/gui/widgets/minimap.hpp index 8de2bc4b6469..6b4a854639c7 100644 --- a/src/gui/widgets/minimap.hpp +++ b/src/gui/widgets/minimap.hpp @@ -36,7 +36,7 @@ namespace gui2 class tminimap : public tcontrol { public: - tminimap() : tcontrol(1), map_data_(), terrain_(NULL) + tminimap() : tcontrol(1), map_data_(), terrain_(nullptr) { } @@ -96,7 +96,7 @@ class tminimap : public tcontrol * @param w The wanted width of the image. * @param h The wanted height of the image. * - * @returns The image, NULL upon error. + * @returns The image, nullptr upon error. */ const surface get_image(const int w, const int h) const; diff --git a/src/gui/widgets/multi_page.cpp b/src/gui/widgets/multi_page.cpp index 5925b707e034..ed513f7f6828 100644 --- a/src/gui/widgets/multi_page.cpp +++ b/src/gui/widgets/multi_page.cpp @@ -35,7 +35,7 @@ tmulti_page::tmulti_page() : tcontainer_(0) , generator_( tgenerator_::build(true, true, tgenerator_::independent, false)) - , page_builder_(NULL) + , page_builder_(nullptr) { } @@ -132,7 +132,7 @@ void swap_grid(tgrid* grid, widget->set_id(id); // Get the container containing the wanted widget. - tgrid* parent_grid = NULL; + tgrid* parent_grid = nullptr; if(grid) { parent_grid = find_widget(grid, id, false, false); } @@ -155,7 +155,7 @@ void tmulti_page::finalize(const std::vector& page_data) { assert(generator_); generator_->create_items(-1, page_builder_, page_data, NULL); - swap_grid(NULL, &grid(), generator_, "_content_grid"); + swap_grid(nullptr, &grid(), generator_, "_content_grid"); } void tmulti_page::impl_draw_background(surface& /*frame_buffer*/ @@ -210,7 +210,7 @@ tmulti_page_definition::tmulti_page_definition(const config& cfg) * A multipage has no states. */ tmulti_page_definition::tresolution::tresolution(const config& cfg) - : tresolution_definition_(cfg), grid(NULL) + : tresolution_definition_(cfg), grid(nullptr) { const config& child = cfg.child("grid"); VALIDATE(child, _("No grid defined.")); @@ -267,7 +267,7 @@ namespace implementation { tbuilder_multi_page::tbuilder_multi_page(const config& cfg) - : implementation::tbuilder_control(cfg), builder(NULL), data() + : implementation::tbuilder_control(cfg), builder(nullptr), data() { const config& page = cfg.child("page_definition"); diff --git a/src/gui/widgets/pane.cpp b/src/gui/widgets/pane.cpp index 0c9dbce8de8f..9ddbe53deda8 100644 --- a/src/gui/widgets/pane.cpp +++ b/src/gui/widgets/pane.cpp @@ -58,7 +58,7 @@ struct tpane_implementation * First test whether the mouse is at the pane. */ if(pane->twidget::find_at(coordinate, must_be_active) != pane) { - return NULL; + return nullptr; } typedef typename utils::tconst_clone::reference thack; @@ -82,7 +82,7 @@ struct tpane_implementation } } - return NULL; + return nullptr; } /** @@ -104,7 +104,7 @@ struct tpane_implementation } } - return NULL; + return nullptr; } }; @@ -262,7 +262,7 @@ iterator::twalker_* tpane::create_walker() /** * @todo Implement properly. */ - return NULL; + return nullptr; } tgrid* tpane::grid(const unsigned id) diff --git a/src/gui/widgets/pane.hpp b/src/gui/widgets/pane.hpp index b7495fbfae0b..5f62d418faac 100644 --- a/src/gui/widgets/pane.hpp +++ b/src/gui/widgets/pane.hpp @@ -134,7 +134,7 @@ class tpane : public twidget * @ref create_item(). * * @returns The wanted grid. - * @retval NULL The id isn't associated with an item. + * @retval nullptr The id isn't associated with an item. */ tgrid* grid(const unsigned id); @@ -146,7 +146,7 @@ class tpane : public twidget * @ref create_item(). * * @returns The wanted grid. - * @retval NULL The id isn't associated with an item. + * @retval nullptr The id isn't associated with an item. */ const tgrid* grid(const unsigned id) const; diff --git a/src/gui/widgets/panel.cpp b/src/gui/widgets/panel.cpp index 523e46039b18..5062575775aa 100644 --- a/src/gui/widgets/panel.cpp +++ b/src/gui/widgets/panel.cpp @@ -190,7 +190,7 @@ namespace implementation { tbuilder_panel::tbuilder_panel(const config& cfg) - : tbuilder_control(cfg), grid(NULL) + : tbuilder_control(cfg), grid(nullptr) { const config& c = cfg.child("grid"); diff --git a/src/gui/widgets/scroll_label.cpp b/src/gui/widgets/scroll_label.cpp index 52bf57d1e9ff..e65adc7e8e01 100644 --- a/src/gui/widgets/scroll_label.cpp +++ b/src/gui/widgets/scroll_label.cpp @@ -179,7 +179,7 @@ tscroll_label_definition::tscroll_label_definition(const config& cfg) * @end{parent}{name="gui/"} */ tscroll_label_definition::tresolution::tresolution(const config& cfg) - : tresolution_definition_(cfg), grid(NULL) + : tresolution_definition_(cfg), grid(nullptr) { // Note the order should be the same as the enum tstate is scroll_label.hpp. state.push_back(tstate_definition(cfg.child("state_enabled"))); diff --git a/src/gui/widgets/scrollbar.cpp b/src/gui/widgets/scrollbar.cpp index 89836cab41bd..7a00270f8d68 100644 --- a/src/gui/widgets/scrollbar.cpp +++ b/src/gui/widgets/scrollbar.cpp @@ -97,7 +97,7 @@ void tscrollbar_::scroll(const tscroll scroll) assert(false); } - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } void tscrollbar_::place(const tpoint& origin, const tpoint& size) @@ -281,7 +281,7 @@ void tscrollbar_::move_positioner(const int distance) child_callback_positioner_moved(); - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); // positioner_moved_notifier_.notify(); } @@ -402,11 +402,11 @@ void tscrollbar_::signal_handler_left_button_down(const event::tevent event, if(bar == -1) { scroll(HALF_JUMP_BACKWARDS); - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); // positioner_moved_notifier_.notify(); } else if(bar == 1) { scroll(HALF_JUMP_FORWARD); - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); // positioner_moved_notifier_.notify(); } else { assert(bar == 0); diff --git a/src/gui/widgets/scrollbar_container.cpp b/src/gui/widgets/scrollbar_container.cpp index 831924baedc5..bdcd3f38569c 100644 --- a/src/gui/widgets/scrollbar_container.cpp +++ b/src/gui/widgets/scrollbar_container.cpp @@ -71,12 +71,12 @@ tscrollbar_container::tscrollbar_container(const unsigned canvas_count) , state_(ENABLED) , vertical_scrollbar_mode_(auto_visible_first_run) , horizontal_scrollbar_mode_(auto_visible_first_run) - , vertical_scrollbar_grid_(NULL) - , horizontal_scrollbar_grid_(NULL) - , vertical_scrollbar_(NULL) - , horizontal_scrollbar_(NULL) - , content_grid_(NULL) - , content_(NULL) + , vertical_scrollbar_grid_(nullptr) + , horizontal_scrollbar_grid_(nullptr) + , vertical_scrollbar_(nullptr) + , horizontal_scrollbar_(nullptr) + , content_grid_(nullptr) + , content_(nullptr) , content_visible_area_() { connect_signal( diff --git a/src/gui/widgets/scrollbar_panel.cpp b/src/gui/widgets/scrollbar_panel.cpp index 88fea3a2fa19..e4c3db70d2f0 100644 --- a/src/gui/widgets/scrollbar_panel.cpp +++ b/src/gui/widgets/scrollbar_panel.cpp @@ -141,7 +141,7 @@ tbuilder_scrollbar_panel::tbuilder_scrollbar_panel(const config& cfg) get_scrollbar_mode(cfg["vertical_scrollbar_mode"])) , horizontal_scrollbar_mode( get_scrollbar_mode(cfg["horizontal_scrollbar_mode"])) - , grid(NULL) + , grid(nullptr) { const config& definition = cfg.child("definition"); diff --git a/src/gui/widgets/settings.cpp b/src/gui/widgets/settings.cpp index 47658e1e7d57..edd579da8fbf 100644 --- a/src/gui/widgets/settings.cpp +++ b/src/gui/widgets/settings.cpp @@ -349,7 +349,7 @@ const std::string& tgui_definition::read(const config& cfg) FOREACH(AUTO & widget_type, registred_widget_type()) { - widget_type.second(*this, widget_type.first, cfg, NULL); + widget_type.second(*this, widget_type.first, cfg, nullptr); } /***** Window types *****/ diff --git a/src/gui/widgets/stacked_widget.cpp b/src/gui/widgets/stacked_widget.cpp index aece6c66d965..d7651f699553 100644 --- a/src/gui/widgets/stacked_widget.cpp +++ b/src/gui/widgets/stacked_widget.cpp @@ -75,7 +75,7 @@ void swap_grid(tgrid* grid, widget->set_id(id); // Get the container containing the wanted widget. - tgrid* parent_grid = NULL; + tgrid* parent_grid = nullptr; if(grid) { parent_grid = find_widget(grid, id, false, false); } @@ -103,7 +103,7 @@ tstacked_widget::finalize(std::vector widget_builder) { generator_->create_item(-1, builder, empty_data, NULL); } - swap_grid(NULL, &grid(), generator_, "_content_grid"); + swap_grid(nullptr, &grid(), generator_, "_content_grid"); select_layer(-1); } @@ -191,7 +191,7 @@ tstacked_widget_definition::tstacked_widget_definition(const config& cfg) * @end{parent}{name="gui/"} */ tstacked_widget_definition::tresolution::tresolution(const config& cfg) - : tresolution_definition_(cfg), grid(NULL) + : tresolution_definition_(cfg), grid(nullptr) { // Add a dummy state since every widget needs a state. static config dummy("draw"); diff --git a/src/gui/widgets/text.cpp b/src/gui/widgets/text.cpp index 612453b22c0a..70d25683f968 100644 --- a/src/gui/widgets/text.cpp +++ b/src/gui/widgets/text.cpp @@ -178,7 +178,7 @@ void ttext_::paste_selection(const bool mouse) update_canvas(); set_is_dirty(true); - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } void ttext_::set_selection_start(const size_t selection_start) @@ -263,7 +263,7 @@ void ttext_::handle_key_backspace(SDLMod /*modifier*/, bool& handled) } else if(selection_start_) { delete_char(true); } - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } void ttext_::handle_key_delete(SDLMod /*modifier*/, bool& handled) @@ -276,7 +276,7 @@ void ttext_::handle_key_delete(SDLMod /*modifier*/, bool& handled) } else if(selection_start_ < text_.get_length()) { delete_char(false); } - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } void ttext_::handle_key_default(bool& handled, @@ -289,7 +289,7 @@ void ttext_::handle_key_default(bool& handled, if(unicode.size() > 1 || unicode[0] != 0) { handled = true; insert_char(unicode); - fire(event::NOTIFY_MODIFIED, *this, NULL); + fire(event::NOTIFY_MODIFIED, *this, nullptr); } } diff --git a/src/gui/widgets/toggle_panel.cpp b/src/gui/widgets/toggle_panel.cpp index feff01d8b904..454cda5b11b6 100644 --- a/src/gui/widgets/toggle_panel.cpp +++ b/src/gui/widgets/toggle_panel.cpp @@ -409,7 +409,7 @@ namespace implementation tbuilder_toggle_panel::tbuilder_toggle_panel(const config& cfg) : tbuilder_control(cfg) - , grid(NULL) + , grid(nullptr) , retval_id_(cfg["return_value_id"]) , retval_(cfg["return_value"]) { diff --git a/src/gui/widgets/tree_view.cpp b/src/gui/widgets/tree_view.cpp index 99dc1c066668..60ba8f88996b 100644 --- a/src/gui/widgets/tree_view.cpp +++ b/src/gui/widgets/tree_view.cpp @@ -44,10 +44,10 @@ ttree_view::ttree_view(const std::vector& node_definitions) , need_layout_(false) , root_node_(new ttree_view_node("root", node_definitions_, - NULL, + nullptr, *this, std::map())) - , selected_item_(NULL) + , selected_item_(nullptr) , selection_change_callback_() { connect_signal( @@ -193,7 +193,7 @@ ttree_view_node* ttree_view::get_next_node() { ttree_view_node* selected = selected_item(); if(!selected) { - return NULL; + return nullptr; } ttree_view_node* visible = selected->get_last_visible_parent_node(); if(visible != selected) { @@ -297,7 +297,7 @@ ttree_view_definition::ttree_view_definition(const config& cfg) * @end{parent}{name="gui/"} */ ttree_view_definition::tresolution::tresolution(const config& cfg) - : tresolution_definition_(cfg), grid(NULL) + : tresolution_definition_(cfg), grid(nullptr) { // Note the order should be the same as the enum tstate is listbox.hpp. state.push_back(tstate_definition(cfg.child("state_enabled"))); @@ -418,7 +418,7 @@ twidget* tbuilder_tree_view::build() const ttree_node::ttree_node(const config& cfg) : id(cfg["id"]) , unfolded(cfg["unfolded"].to_bool(false)) - , builder(NULL) + , builder(nullptr) { VALIDATE(!id.empty(), missing_mandatory_wml_key("node", "id")); diff --git a/src/gui/widgets/tree_view_node.cpp b/src/gui/widgets/tree_view_node.cpp index b14ce1dd0b5a..ecec2fde5564 100644 --- a/src/gui/widgets/tree_view_node.cpp +++ b/src/gui/widgets/tree_view_node.cpp @@ -45,8 +45,8 @@ ttree_view_node::ttree_view_node( , grid_() , children_() , node_definitions_(node_definitions) - , toggle_(NULL) - , label_(NULL) + , toggle_(nullptr) + , label_(nullptr) , unfolded_(false) , callback_state_change_() , callback_state_to_folded_() @@ -130,7 +130,7 @@ ttree_view_node::ttree_view_node( ttree_view_node::~ttree_view_node() { if(/*tree_view() &&*/ tree_view().selected_item_ == this) { - tree_view().selected_item_ = NULL; + tree_view().selected_item_ = nullptr; } } @@ -312,7 +312,7 @@ struct ttree_view_node_implementation return widget; } } - return NULL; + return nullptr; } public: @@ -329,7 +329,7 @@ struct ttree_view_node_implementation } if(tree_view_node.is_folded()) { - return NULL; + return nullptr; } return find_at_aux(tree_view_node.children_.begin(), @@ -732,11 +732,11 @@ ttree_view_node* ttree_view_node::get_last_visible_parent_node() ttree_view_node* ttree_view_node::get_node_above() { assert(!is_root_node()); - ttree_view_node* cur = NULL; + ttree_view_node* cur = nullptr; for(size_t i = 0; i < parent_node_->size(); ++i) { if(&parent_node_->children_[i] == this) { if(i == 0) { - return parent_node_->is_root_node() ? NULL : parent_node_; + return parent_node_->is_root_node() ? nullptr : parent_node_; } else { cur = &parent_node_->children_[i - 1]; @@ -757,7 +757,7 @@ ttree_view_node* ttree_view_node::get_node_below() return &get_child_at(0); } ttree_view_node* cur = this; - while(cur->parent_node_ != NULL) { + while(cur->parent_node_ != nullptr) { ttree_view_node& parent = *cur->parent_node_; for(size_t i = 0; i < parent.size(); ++i) { @@ -772,14 +772,14 @@ ttree_view_node* ttree_view_node::get_node_below() } } } - return NULL; + return nullptr; } ttree_view_node* ttree_view_node::get_selectable_node_above() { ttree_view_node* above = this; do { above = above->get_node_above(); - } while(above != NULL && above->label_ == NULL); + } while(above != nullptr && above->label_ == nullptr); return above; } ttree_view_node* ttree_view_node::get_selectable_node_below() @@ -787,7 +787,7 @@ ttree_view_node* ttree_view_node::get_selectable_node_below() ttree_view_node* below = this; do { below = below->get_node_below(); - } while(below != NULL && below->label_ == NULL); + } while(below != nullptr && below->label_ == nullptr); return below; } diff --git a/src/gui/widgets/tree_view_node.hpp b/src/gui/widgets/tree_view_node.hpp index 2f7c6139ae98..68100249de7d 100644 --- a/src/gui/widgets/tree_view_node.hpp +++ b/src/gui/widgets/tree_view_node.hpp @@ -96,7 +96,7 @@ class ttree_view_node : public twidget */ bool is_root_node() const { - return parent_node_ == NULL; + return parent_node_ == nullptr; } /** @@ -137,7 +137,7 @@ class ttree_view_node : public twidget */ virtual iterator::twalker_* create_walker() override { - return NULL; + return nullptr; } /** See @ref twidget::find_at. */ diff --git a/src/gui/widgets/viewport.cpp b/src/gui/widgets/viewport.cpp index 3c311cf57122..538d334faf50 100644 --- a/src/gui/widgets/viewport.cpp +++ b/src/gui/widgets/viewport.cpp @@ -52,7 +52,7 @@ struct tviewport_implementation * First test whether the mouse is at the pane. */ if(viewport->twidget::find_at(coordinate, must_be_active) != viewport) { - return NULL; + return nullptr; } /* @@ -183,7 +183,7 @@ iterator::twalker_* tviewport::create_walker() /** * @todo Implement properly. */ - return NULL; + return nullptr; } // }---------- BUILDER -----------{ diff --git a/src/gui/widgets/widget.cpp b/src/gui/widgets/widget.cpp index 9c682cc56bdc..882264414568 100644 --- a/src/gui/widgets/widget.cpp +++ b/src/gui/widgets/widget.cpp @@ -27,7 +27,7 @@ namespace gui2 twidget::twidget() : id_("") - , parent_(NULL) + , parent_(nullptr) , x_(-1) , y_(-1) , width_(0) @@ -51,7 +51,7 @@ twidget::twidget() twidget::twidget(const tbuilder_widget& builder) : id_(builder.id) - , parent_(NULL) + , parent_(nullptr) , x_(-1) , y_(-1) , width_(0) @@ -81,7 +81,7 @@ twidget::~twidget() twidget* p = parent(); while(p) { - fire(event::NOTIFY_REMOVAL, *p, NULL); + fire(event::NOTIFY_REMOVAL, *p, nullptr); p = p->parent(); } @@ -123,7 +123,7 @@ twindow* twidget::get_window() result = result->parent_; } - // on error dynamic_cast returns NULL which is what we want. + // on error dynamic_cast returns nullptr which is what we want. return dynamic_cast(result); } @@ -137,14 +137,14 @@ const twindow* twidget::get_window() const result = result->parent_; } - // on error dynamic_cast returns NULL which is what we want. + // on error dynamic_cast returns nullptr which is what we want. return dynamic_cast(result); } tdialog* twidget::dialog() { twindow* window = get_window(); - return window ? window->dialog() : NULL; + return window ? window->dialog() : nullptr; } void twidget::set_parent(twidget* parent) @@ -546,24 +546,24 @@ twidget::draw_debug_border(surface& frame_buffer, int x_offset, int y_offset) twidget* twidget::find_at(const tpoint& coordinate, const bool must_be_active) { - return is_at(coordinate, must_be_active) ? this : NULL; + return is_at(coordinate, must_be_active) ? this : nullptr; } const twidget* twidget::find_at(const tpoint& coordinate, const bool must_be_active) const { - return is_at(coordinate, must_be_active) ? this : NULL; + return is_at(coordinate, must_be_active) ? this : nullptr; } twidget* twidget::find(const std::string& id, const bool /*must_be_active*/) { - return id_ == id ? this : NULL; + return id_ == id ? this : nullptr; } const twidget* twidget::find(const std::string& id, const bool /*must_be_active*/) const { - return id_ == id ? this : NULL; + return id_ == id ? this : nullptr; } bool twidget::has_widget(const twidget& widget) const diff --git a/src/gui/widgets/widget.hpp b/src/gui/widgets/widget.hpp index 274286d96133..c9d08572d211 100644 --- a/src/gui/widgets/widget.hpp +++ b/src/gui/widgets/widget.hpp @@ -190,7 +190,7 @@ class twidget : private boost::noncopyable, * Get the parent window. * * @returns Pointer to parent window. - * @retval NULL No parent window found. + * @retval nullptr No parent window found. */ twindow* get_window(); @@ -208,7 +208,7 @@ class twidget : private boost::noncopyable, * function will be removed. * * @returns The top-level dialogue. - * @retval NULL No top-level window or the top-level window is + * @retval nullptr No top-level window or the top-level window is * not owned by a dialogue. */ tdialog* dialog(); @@ -225,7 +225,7 @@ class twidget : private boost::noncopyable, * The parent widget. * * If the widget has a parent it contains a pointer to the parent, else it - * is set to @c NULL. + * is set to @c nullptr. */ twidget* parent_; @@ -755,7 +755,7 @@ class twidget : private boost::noncopyable, * flag. * * @returns The widget with the id. - * @retval NULL No widget at the wanted coordinate found (or + * @retval nullptr No widget at the wanted coordinate found (or * not active if must_be_active was set). */ virtual twidget* find_at(const tpoint& coordinate, @@ -777,7 +777,7 @@ class twidget : private boost::noncopyable, * flag. * * @returns The widget with the id. - * @retval NULL No widget with the id found (or not active if + * @retval nullptr No widget with the id found (or not active if * must_be_active was set). */ virtual twidget* find(const std::string& id, const bool must_be_active); diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index 9706630ab4c9..836b61eb0c69 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -97,7 +97,7 @@ class tbuilder_window : public tbuilder_control twidget* build() const { - return NULL; + return nullptr; } }; @@ -142,8 +142,8 @@ static Uint32 draw_timer(Uint32, void*) data.type = DRAW_EVENT; data.code = 0; - data.data1 = NULL; - data.data2 = NULL; + data.data1 = nullptr; + data.data2 = nullptr; event.type = DRAW_EVENT; event.user = data; @@ -193,8 +193,8 @@ static bool helptip() data.type = SHOW_HELPTIP_EVENT; data.code = 0; - data.data1 = NULL; - data.data2 = NULL; + data.data1 = nullptr; + data.data2 = nullptr; event.type = SHOW_HELPTIP_EVENT; event.user = data; @@ -282,7 +282,7 @@ twindow* tmanager::window(const unsigned id) std::map::iterator itor = windows_.find(id); if(itor == windows_.end()) { - return NULL; + return nullptr; } else { return itor->second; } @@ -614,7 +614,7 @@ int twindow::show(const bool restore, const unsigned auto_close_timeout) { if(interval_ == 0) { draw_interval = 30; - SDL_AddTimer(draw_interval, draw_timer, NULL); + SDL_AddTimer(draw_interval, draw_timer, nullptr); // There might be some time between creation and showing so // reupdate the sizes. @@ -657,8 +657,8 @@ int twindow::show(const bool restore, const unsigned auto_close_timeout) data.type = CLOSE_WINDOW_EVENT; data.code = tmanager::instance().get_id(*this); - data.data1 = NULL; - data.data2 = NULL; + data.data1 = nullptr; + data.data2 = nullptr; event.type = CLOSE_WINDOW_EVENT; event.user = data; @@ -687,7 +687,7 @@ int twindow::show(const bool restore, const unsigned auto_close_timeout) * return the proper button state. When initializing here all * works fine. */ - mouse_button_state_ = SDL_GetMouseState(NULL, NULL); + mouse_button_state_ = SDL_GetMouseState(nullptr, nullptr); mouse_button_state_initialised = true; } @@ -1041,7 +1041,7 @@ void twindow::layout() : h_(variables_, &functions_); /***** Handle click dismiss status. *****/ - tbutton* click_dismiss_button = NULL; + tbutton* click_dismiss_button = nullptr; if((click_dismiss_button = find_widget(this, "click_dismiss", false, false))) { @@ -1281,7 +1281,7 @@ void swap_grid(tgrid* grid, widget->set_id(id); // Get the container containing the wanted widget. - tgrid* parent_grid = NULL; + tgrid* parent_grid = nullptr; if(grid) { parent_grid = find_widget(grid, id, false, false); } @@ -1308,7 +1308,7 @@ void swap_grid(tgrid* grid, void twindow::finalize(const boost::intrusive_ptr& content_grid) { - swap_grid(NULL, &grid(), content_grid->build(), "_window_content_grid"); + swap_grid(nullptr, &grid(), content_grid->build(), "_window_content_grid"); } #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS @@ -1534,7 +1534,7 @@ twindow_definition::twindow_definition(const config& cfg) } twindow_definition::tresolution::tresolution(const config& cfg) - : tpanel_definition::tresolution(cfg), grid(NULL) + : tpanel_definition::tresolution(cfg), grid(nullptr) { const config& child = cfg.child("grid"); // VALIDATE(child, _("No grid defined.")); diff --git a/src/gui/widgets/window.hpp b/src/gui/widgets/window.hpp index f47baf942858..c83d449c9692 100644 --- a/src/gui/widgets/window.hpp +++ b/src/gui/widgets/window.hpp @@ -102,7 +102,7 @@ class twindow : public tpanel, public cursor::setter * * @param handle The instance id of the window. * - * @returns The window or NULL. + * @returns The window or nullptr. */ static twindow* window_instance(const unsigned handle); diff --git a/src/halo.cpp b/src/halo.cpp index fcf1181373fa..7e5c1a127f0a 100644 --- a/src/halo.cpp +++ b/src/halo.cpp @@ -145,14 +145,14 @@ halo_impl::effect::effect(display * screen, int xpos, int ypos, const animatedget_screen_surface(); const clip_rect_setter clip_setter(screen, &clip_rect); - if(buffer_ == NULL || buffer_->w != rect.w || buffer_->h != rect.h) { + if(buffer_ == nullptr || buffer_->w != rect.w || buffer_->h != rect.h) { SDL_Rect rect = rect_; buffer_.assign(get_surface_portion(screen,rect)); } else { SDL_Rect rect = rect_; - sdl_copy_portion(screen,&rect,buffer_,NULL); + sdl_copy_portion(screen,&rect,buffer_,nullptr); } - sdl_blit(surf_,NULL,screen,&rect); + sdl_blit(surf_,nullptr,screen,&rect); update_rect(rect_); @@ -279,7 +279,7 @@ void halo_impl::effect::unrender() const int ypos = y_ + screeny - surf_->h/2; SDL_Rect rect = sdl::create_rect(xpos, ypos, surf_->w, surf_->h); - sdl_blit(buffer_,NULL,screen,&rect); + sdl_blit(buffer_,nullptr,screen,&rect); update_rect(rect); } diff --git a/src/help/help.cpp b/src/help/help.cpp index cbe470018d68..573554dd2741 100644 --- a/src/help/help.cpp +++ b/src/help/help.cpp @@ -41,7 +41,6 @@ #include "widgets/button.hpp" // for button #include // for assert -#include // for NULL #include // for min #include // for basic_ostream, operator<<, etc #include // for vector, vector<>::iterator @@ -94,14 +93,14 @@ extern config dummy_cfg; help_manager::help_manager(const config *cfg) //, gamemap *_map) { - game_cfg = cfg == NULL ? &dummy_cfg : cfg; + game_cfg = cfg == nullptr ? &dummy_cfg : cfg; // map = _map; } help_manager::~help_manager() { - game_cfg = NULL; -// map = NULL; + game_cfg = nullptr; +// map = nullptr; toplevel.clear(); hidden_sections.clear(); // These last numbers must be reset so that the content is regenerated. diff --git a/src/help/help_browser.cpp b/src/help/help_browser.cpp index 34e2454fa747..a28472368391 100644 --- a/src/help/help_browser.cpp +++ b/src/help/help_browser.cpp @@ -13,7 +13,6 @@ */ #include "help_browser.hpp" -#include // for NULL #include // for operator<<, basic_ostream, etc #include // for SDL_GetMouseState, etc #include "cursor.hpp" // for set, CURSOR_TYPE::HYPERLINK, etc @@ -41,7 +40,7 @@ help_browser::help_browser(CVideo& video, const section &toplevel) : forward_topics_(), back_button_(video, "", gui::button::TYPE_PRESS, "button_normal/button_small_H22", gui::button::DEFAULT_SPACE, true, "icons/arrows/long_arrow_ornate_left"), forward_button_(video, "", gui::button::TYPE_PRESS, "button_normal/button_small_H22", gui::button::DEFAULT_SPACE, true, "icons/arrows/long_arrow_ornate_right"), - shown_topic_(NULL) + shown_topic_(nullptr) { // Hide the buttons at first since we do not have any forward or // back topics at this point. They will be unhidden when history @@ -103,7 +102,7 @@ void help_browser::process_event() if (sdl::point_in_rect(mousex, mousey, menu_.location())) { menu_.process(); const topic *chosen_topic = menu_.chosen_topic(); - if (chosen_topic != NULL && chosen_topic != shown_topic_) { + if (chosen_topic != nullptr && chosen_topic != shown_topic_) { /// A new topic has been chosen in the menu, display it. show_topic(*chosen_topic); } @@ -124,7 +123,7 @@ void help_browser::move_in_history(std::deque &from, if (!from.empty()) { const topic *to_show = from.back(); from.pop_back(); - if (shown_topic_ != NULL) { + if (shown_topic_ != nullptr) { if (to.size() > max_history) { to.pop_front(); } @@ -148,7 +147,7 @@ void help_browser::handle_event(const SDL_Event &event) const std::string ref = text_area_.ref_at(mousex, mousey); if (ref != "") { const topic *t = find_topic(toplevel_, ref); - if (t == NULL) { + if (t == nullptr) { std::stringstream msg; msg << _("Reference to unknown topic: ") << "'" << ref << "'."; gui2::show_transient_message(video(), "", msg.str()); @@ -185,7 +184,7 @@ void help_browser::show_topic(const std::string &topic_id) { const topic *t = find_topic(toplevel_, topic_id); - if (t != NULL) { + if (t != nullptr) { show_topic(*t); } else if (topic_id.find(unit_prefix)==0 || topic_id.find(hidden_symbol() + unit_prefix)==0) { show_topic(unknown_unit_topic); @@ -201,7 +200,7 @@ void help_browser::show_topic(const topic &t, bool save_in_history) if (save_in_history) { forward_topics_.clear(); - if (shown_topic_ != NULL) { + if (shown_topic_ != nullptr) { if (back_topics_.size() > max_history) { back_topics_.pop_front(); } diff --git a/src/help/help_button.cpp b/src/help/help_button.cpp index f6681414bffe..cc581d2caf1d 100644 --- a/src/help/help_button.cpp +++ b/src/help/help_button.cpp @@ -25,7 +25,7 @@ namespace help { help_button::help_button(CVideo& video, const std::string &help_topic) - : dialog_button(video, _("Help")), video_(video), topic_(help_topic), help_hand_(NULL) + : dialog_button(video, _("Help")), video_(video), topic_(help_topic), help_hand_(nullptr) {} help_button::~help_button() { @@ -64,7 +64,7 @@ void help_button::leave() { //now kill the hotkey handler delete help_hand_; - help_hand_ = NULL; + help_hand_ = nullptr; } } // end namespace help diff --git a/src/help/help_impl.cpp b/src/help/help_impl.cpp index 96ba39403eb8..7fa458d1c112 100644 --- a/src/help/help_impl.cpp +++ b/src/help/help_impl.cpp @@ -62,7 +62,7 @@ static lg::log_domain log_help("help"); namespace help { -const config *game_cfg = NULL; +const config *game_cfg = nullptr; // The default toplevel. help::section toplevel; // All sections and topics not referenced from the default toplevel. @@ -148,7 +148,7 @@ void parse_config_internal(const config *help_cfg, const config *section_cfg, std::cerr << "Maximum section depth has been reached. Maybe circular dependency?" << std::endl; } - else if (section_cfg != NULL) { + else if (section_cfg != nullptr) { const std::vector sections = utils::quoted_split((*section_cfg)["sections"]); sec.level = level; std::string id = level == 0 ? "toplevel" : (*section_cfg)["id"].str(); @@ -251,9 +251,9 @@ void parse_config_internal(const config *help_cfg, const config *section_cfg, section parse_config(const config *cfg) { section sec; - if (cfg != NULL) { + if (cfg != nullptr) { config const &toplevel_cfg = cfg->child("toplevel"); - parse_config_internal(cfg, toplevel_cfg ? &toplevel_cfg : NULL, sec); + parse_config_internal(cfg, toplevel_cfg ? &toplevel_cfg : nullptr, sec); } return sec; } @@ -350,7 +350,7 @@ const std::vector& topic_text::parsed_text() const parsed_text_ = parse_text((*generator_)()); if (--generator_->count == 0) delete generator_; - generator_ = NULL; + generator_ = nullptr; } return parsed_text_; } @@ -1057,11 +1057,11 @@ const topic *find_topic(const section &sec, const std::string &id) section_list::const_iterator sit; for (sit = sec.sections.begin(); sit != sec.sections.end(); ++sit) { const topic *t = find_topic(*(*sit), id); - if (t != NULL) { + if (t != nullptr) { return t; } } - return NULL; + return nullptr; } const section *find_section(const section &sec, const std::string &id) @@ -1073,11 +1073,11 @@ const section *find_section(const section &sec, const std::string &id) } for (sit = sec.sections.begin(); sit != sec.sections.end(); ++sit) { const section *s = find_section(*(*sit), id); - if (s != NULL) { + if (s != nullptr) { return s; } } - return NULL; + return nullptr; } std::vector parse_text(const std::string &text) @@ -1223,7 +1223,7 @@ SDL_Color string_to_color(const std::string &cmp_str) } // a #rrggbb color in pango format. if (*cmp_str.c_str() == '#' && cmp_str.size() == 7) { - return int_to_color(strtoul(cmp_str.c_str() + 1, NULL, 16)); + return int_to_color(strtoul(cmp_str.c_str() + 1, nullptr, 16)); } return font::NORMAL_COLOR; } @@ -1285,7 +1285,7 @@ void generate_contents() { toplevel.clear(); hidden_sections.clear(); - if (game_cfg != NULL) { + if (game_cfg != nullptr) { const config *help_config = &game_cfg->child("help"); if (!*help_config) { help_config = &dummy_cfg; @@ -1303,7 +1303,7 @@ void generate_contents() BOOST_FOREACH(const config §ion, help_config->child_range("section")) { const std::string id = section["id"]; - if (find_section(toplevel, id) == NULL) { + if (find_section(toplevel, id) == nullptr) { // This section does not exist referenced from the // toplevel. Hence, add it to the hidden ones if it // is not referenced from another section. @@ -1320,7 +1320,7 @@ void generate_contents() BOOST_FOREACH(const config &topic, help_config->child_range("topic")) { const std::string id = topic["id"]; - if (find_topic(toplevel, id) == NULL) { + if (find_topic(toplevel, id) == nullptr) { if (!topic_is_referenced(id, *help_config)) { if (ss.str() != "") { ss << ","; @@ -1381,7 +1381,7 @@ unsigned image_width(const std::string &filename) { image::locator loc(filename); surface surf(image::get_image(loc)); - if (surf != NULL) { + if (surf != nullptr) { return surf->w; } return 0; diff --git a/src/help/help_impl.hpp b/src/help/help_impl.hpp index 5bafadf5970e..9800f74b1442 100644 --- a/src/help/help_impl.hpp +++ b/src/help/help_impl.hpp @@ -86,7 +86,7 @@ class topic_text ~topic_text(); topic_text(): parsed_text_(), - generator_(NULL) + generator_(nullptr) { } @@ -177,7 +177,7 @@ class has_id has_id(const std::string &id) : id_(id) {} bool operator()(const topic &t) { return t.id == id_; } bool operator()(const section &s) { return s.id == id_; } - bool operator()(const section *s) { return s != NULL && s->id == id_; } + bool operator()(const section *s) { return s != nullptr && s->id == id_; } private: const std::string id_; }; @@ -262,7 +262,7 @@ std::vector generate_faction_topics(const config &, const bool); std::vector generate_era_topics(const bool, const std::string & era_id); /// Parse a help config, return the top level section. Return an empty -/// section if cfg is NULL. +/// section if cfg is nullptr. section parse_config(const config *cfg); /// Recursive function used by parse_config. void parse_config_internal(const config *help_cfg, const config *section_cfg, @@ -276,12 +276,12 @@ bool section_is_referenced(const std::string §ion_id, const config &cfg); bool topic_is_referenced(const std::string &topic_id, const config &cfg); /// Search for the topic with the specified identifier in the section -/// and its subsections. Return the found topic, or NULL if none could +/// and its subsections. Return the found topic, or nullptr if none could /// be found. const topic *find_topic(const section &sec, const std::string &id); /// Search for the section with the specified identifier in the section -/// and its subsections. Return the found section or NULL if none could +/// and its subsections. Return the found section or nullptr if none could /// be found. const section *find_section(const section &sec, const std::string &id); diff --git a/src/help/help_menu.cpp b/src/help/help_menu.cpp index 303febd02f26..ac9d7fde6756 100644 --- a/src/help/help_menu.cpp +++ b/src/help/help_menu.cpp @@ -30,12 +30,12 @@ class CVideo; // lines 56-56 namespace help { help_menu::help_menu(CVideo &video, section const &toplevel, int max_height) : - gui::menu(video, empty_string_vector, true, max_height, -1, NULL, &gui::menu::bluebg_style), + gui::menu(video, empty_string_vector, true, max_height, -1, nullptr, &gui::menu::bluebg_style), visible_items_(), toplevel_(toplevel), expanded_(), restorer_(), - chosen_topic_(NULL), + chosen_topic_(nullptr), selected_item_(&toplevel, "") { silent_ = true; //silence the default menu sounds @@ -166,7 +166,7 @@ int help_menu::process() selected_item_ = visible_items_[res]; const section* sec = selected_item_.sec; - if (sec != NULL) { + if (sec != nullptr) { // Check how we click on the section int x = mousex - menu::location().x; @@ -186,7 +186,7 @@ int help_menu::process() // click on title open the topic associated to this section chosen_topic_ = find_topic(toplevel, ".."+sec->id ); } - } else if (selected_item_.t != NULL) { + } else if (selected_item_.t != nullptr) { /// Choose a topic if it is clicked. chosen_topic_ = selected_item_.t; } @@ -197,7 +197,7 @@ int help_menu::process() const topic *help_menu::chosen_topic() { const topic *ret = chosen_topic_; - chosen_topic_ = NULL; + chosen_topic_ = nullptr; return ret; } @@ -215,19 +215,19 @@ void help_menu::display_visible_items() } help_menu::visible_item::visible_item(const section *_sec, const std::string &vis_string) : - t(NULL), sec(_sec), visible_string(vis_string) {} + t(nullptr), sec(_sec), visible_string(vis_string) {} help_menu::visible_item::visible_item(const topic *_t, const std::string &vis_string) : - t(_t), sec(NULL), visible_string(vis_string) {} + t(_t), sec(nullptr), visible_string(vis_string) {} bool help_menu::visible_item::operator==(const section &_sec) const { - return sec != NULL && *sec == _sec; + return sec != nullptr && *sec == _sec; } bool help_menu::visible_item::operator==(const topic &_t) const { - return t != NULL && *t == _t; + return t != nullptr && *t == _t; } bool help_menu::visible_item::operator==(const visible_item &vis_item) const diff --git a/src/help/help_menu.hpp b/src/help/help_menu.hpp index 8e413953963e..f1e64d9e55a4 100644 --- a/src/help/help_menu.hpp +++ b/src/help/help_menu.hpp @@ -39,7 +39,7 @@ class help_menu : public gui::menu void select_topic(const topic &t); /// If a topic has been chosen, return that topic, otherwise - /// NULL. If one topic is returned, it will not be returned again, + /// nullptr. If one topic is returned, it will not be returned again, /// if it is not re-chosen. const topic *chosen_topic(); @@ -48,7 +48,7 @@ class help_menu : public gui::menu struct visible_item { visible_item(const section *_sec, const std::string &visible_string); visible_item(const topic *_t, const std::string &visible_string); - // Invariant, one if these should be NULL. The constructors + // Invariant, one if these should be nullptr. The constructors // enforce it. const topic *t; const section *sec; diff --git a/src/help/help_text_area.cpp b/src/help/help_text_area.cpp index ed54eb8d6e5e..da6af6698d28 100644 --- a/src/help/help_text_area.cpp +++ b/src/help/help_text_area.cpp @@ -24,7 +24,6 @@ #include "util.hpp" // for lexical_cast, etc #include "video.hpp" // for update_rect, CVideo -#include // for NULL #include // for max, min, find_if #include // for operator<<, stringstream, etc #include // for vector, etc @@ -40,7 +39,7 @@ help_text_area::help_text_area(CVideo &video, const section &toplevel) : items_(), last_row_(), toplevel_(toplevel), - shown_topic_(NULL), + shown_topic_(nullptr), title_spacing_(16), curr_loc_(0, 0), min_row_height_(font::get_max_height(normal_font_size)), @@ -108,7 +107,7 @@ void help_text_area::set_items() font::make_text_ellipsis(shown_topic_->title, title_size, inner_location().w); surface surf(font::get_rendered_text(show_title, title_size, font::NORMAL_COLOR, TTF_STYLE_BOLD)); - if (surf != NULL) { + if (surf != nullptr) { add_item(item(surf, 0, 0, show_title)); curr_loc_.second = title_spacing_; contents_height_ = title_spacing_; @@ -172,7 +171,7 @@ void help_text_area::handle_ref_cfg(const config &cfg) throw parse_error(msg.str()); } - if (find_topic(toplevel_, dst) == NULL && !force) { + if (find_topic(toplevel_, dst) == nullptr && !force) { // detect the broken link but quietly silence the hyperlink for normal user add_text_item(text, game_config::debug ? dst : "", true); @@ -537,7 +536,7 @@ void help_text_area::draw_contents() ++dst.y; } } - sdl_blit(it->surf, NULL, screen, &dst); + sdl_blit(it->surf, nullptr, screen, &dst); } } update_rect(loc); diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index 356acf6af4eb..d4bb8d8f2a6b 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -468,21 +468,21 @@ void basic_handler::handle_event(const SDL_Event& event) // If we're not in a dialog we can call the regular key event handler. if (!gui::in_dialog()) { key_event(event,exec_); - } else if (exec_ != NULL) { + } else if (exec_ != nullptr) { event_execute(event,exec_); } break; case SDL_JOYBUTTONDOWN: if (!gui::in_dialog()) { jbutton_event(event,exec_); - } else if (exec_ != NULL) { + } else if (exec_ != nullptr) { event_execute(event,exec_); } break; case SDL_MOUSEBUTTONDOWN: if (!gui::in_dialog()) { mbutton_event(event,exec_); - } else if (exec_ != NULL) { + } else if (exec_ != nullptr) { event_execute(event,exec_); } break; @@ -524,7 +524,7 @@ static void event_execute( const SDL_Event& event, command_executor* executor) void execute_command(const hotkey_command& command, command_executor* executor, int index) { - if (executor != NULL) { + if (executor != nullptr) { if (!executor->can_execute_command(command, index) || executor->execute_command(command, index)) { return; diff --git a/src/hotkey/command_executor.hpp b/src/hotkey/command_executor.hpp index fcd6fa4276c8..87257a5f2d33 100644 --- a/src/hotkey/command_executor.hpp +++ b/src/hotkey/command_executor.hpp @@ -151,9 +151,9 @@ class command_executor_default : public command_executor void quit_to_main_menu(); }; /* Functions to be called every time a event is intercepted. - * Will call the relevant function in executor if the event is not NULL. + * Will call the relevant function in executor if the event is not nullptr. * Also handles some events in the function itself, - * and so is still meaningful to call with executor=NULL + * and so is still meaningful to call with executor=nullptr */ void jbutton_event(const SDL_Event& event, command_executor* executor); void jhat_event(const SDL_Event& event, command_executor* executor); diff --git a/src/hotkey/hotkey_preferences_display.cpp b/src/hotkey/hotkey_preferences_display.cpp index c934f46b6d30..1a96eae6c417 100644 --- a/src/hotkey/hotkey_preferences_display.cpp +++ b/src/hotkey/hotkey_preferences_display.cpp @@ -35,7 +35,7 @@ hotkey::hotkey_ptr show_binding_dialog(CVideo& video, const std::string& id) const std::string text = _("Press desired hotkey (Esc cancels)"); SDL_Rect clip_rect = sdl::create_rect(0, 0, video.getx(), video.gety()); - SDL_Rect text_size = font::draw_text(NULL, clip_rect, font::SIZE_LARGE, + SDL_Rect text_size = font::draw_text(nullptr, clip_rect, font::SIZE_LARGE, font::NORMAL_COLOR, text, 0, 0); const int centerx = video.getx() / 2; diff --git a/src/image.cpp b/src/image.cpp index b8fae01b1b99..975672bdd507 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -517,8 +517,8 @@ static surface load_image_file(const image::locator &loc) static surface load_image_sub_file(const image::locator &loc) { surface surf = get_image(loc.get_filename(), UNSCALED); - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; modification_queue mods = modification::decode(loc.get_modifications()); @@ -558,7 +558,7 @@ static surface load_image_sub_file(const image::locator &loc) // Safe because those images are only used by terrain rendering // and it filters them out. // A safer and more general way would be to keep only one copy of it - surf = NULL; + surf = nullptr; } loc.add_to_cache(is_empty_hex_, is_empty); } @@ -591,7 +591,7 @@ static surface apply_light(surface surf, const light_string& ls){ } // check if the lightmap is already cached or need to be generated - surface lightmap = NULL; + surface lightmap = nullptr; lit_variants::iterator i = lightmaps_.find(ls); if(i != lightmaps_.end()) { lightmap = i->second; @@ -612,11 +612,11 @@ static surface apply_light(surface surf, const light_string& ls){ //note that we avoid infinite recursion by using only atomic operation surface lts = image::get_lighted_image(lm_img[sls[0]], sls, HEXED); //first image will be the base where we blit the others - if(lightmap == NULL) { + if(lightmap == nullptr) { //copy the cached image to avoid modifying the cache lightmap = make_neutral_surface(lts); } else{ - blit_surface(lts, NULL, lightmap, NULL); + blit_surface(lts, nullptr, lightmap, nullptr); } } //cache the result @@ -639,7 +639,7 @@ surface load_from_disk(const locator &loc) case locator::SUB_FILE: return load_image_sub_file(loc); default: - return surface(NULL); + return surface(nullptr); } } @@ -666,7 +666,7 @@ static SDL_PixelFormat last_pixel_format; void set_pixel_format(SDL_PixelFormat* format) { - assert(format != NULL); + assert(format != nullptr); SDL_PixelFormat &f = *format; SDL_PixelFormat &l = last_pixel_format; @@ -722,7 +722,7 @@ void color_adjustment_resetter::reset() void set_team_colors(const std::vector* colors) { - if (colors == NULL) + if (colors == nullptr) team_colors.clear(); else { team_colors = *colors; @@ -811,7 +811,7 @@ static surface get_scaled_to_hex(const locator& i_locator) if (!img.null()) { return scale_to_hex_func(img, zoom, zoom); } else { - return surface(NULL); + return surface(nullptr); } } @@ -831,7 +831,7 @@ static surface get_scaled_to_zoom(const locator& i_locator) if(!res.null()) { return scale_to_zoom_func(res, ((res.get()->w * zoom) / tile_size), ((res.get()->h * zoom) / tile_size)); } else { - return surface(NULL); + return surface(nullptr); } } @@ -1165,8 +1165,8 @@ bool is_empty_hex(const locator& i_locator) surface reverse_image(const surface& surf) { - if(surf == NULL) { - return surface(NULL); + if(surf == nullptr) { + return surface(nullptr); } const std::map::iterator itor = reversed_images_.find(surf); @@ -1176,8 +1176,8 @@ surface reverse_image(const surface& surf) } const surface rev(flip_surface(surf)); - if(rev == NULL) { - return surface(NULL); + if(rev == nullptr) { + return surface(nullptr); } reversed_images_.insert(std::pair(surf,rev)); diff --git a/src/image.hpp b/src/image.hpp index 6605bccdf891..cc55c40a8d6b 100644 --- a/src/image.hpp +++ b/src/image.hpp @@ -186,8 +186,8 @@ namespace image { ///set the team colors used by the TC image modification ///use a vector with one string for each team - ///using NULL will reset to default TC - void set_team_colors(const std::vector* colors = NULL); + ///using nullptr will reset to default TC + void set_team_colors(const std::vector* colors = nullptr); const std::vector& get_team_colors(); diff --git a/src/image_modifications.cpp b/src/image_modifications.cpp index b6cd9a9eaeb8..f68aa25dfbbb 100644 --- a/src/image_modifications.cpp +++ b/src/image_modifications.cpp @@ -35,11 +35,11 @@ static lg::log_domain log_display("display"); namespace image { -/** Adds @a mod to the queue (unless mod is NULL). */ +/** Adds @a mod to the queue (unless mod is nullptr). */ void modification_queue::push(modification * mod) { // Null pointers do not get stored. (Shouldn't happen, but just in case.) - if ( mod != NULL ) + if ( mod != nullptr ) priorities_[mod->priority()].push_back(mod); } @@ -89,7 +89,7 @@ std::map mod_parsers; * @param encoded_mod A string representing a single modification * * @return A pointer to the decoded modification object - * @retval NULL if the string is invalid or a parser isn't found + * @retval nullptr if the string is invalid or a parser isn't found */ modification* decode_modification(const std::string& encoded_mod) { @@ -98,7 +98,7 @@ modification* decode_modification(const std::string& encoded_mod) if(split.size() != 2) { ERR_DP << "error parsing image modifications: " << encoded_mod << "\n"; - return NULL; + return nullptr; } std::string mod_type = split[0]; @@ -107,7 +107,7 @@ modification* decode_modification(const std::string& encoded_mod) if(mod_parsers.find(mod_type) == mod_parsers.end()) { ERR_DP << "unknown image function in path: " << mod_type << '\n'; - return NULL; + return nullptr; } return (*mod_parsers[mod_type])(args); @@ -299,7 +299,7 @@ surface blit_modification::operator()(const surface& src) const surface nsrc = make_neutral_surface(src); surface nsurf = make_neutral_surface(surf_); SDL_Rect r = sdl::create_rect(x_, y_, 0, 0); - blit_surface(nsurf, NULL, nsrc, &r); + blit_surface(nsurf, nullptr, nsrc, &r); return nsrc; } @@ -324,7 +324,7 @@ surface mask_modification::operator()(const surface& src) const return mask_surface(src, mask_); SDL_Rect r = sdl::create_rect(x_, y_, 0, 0); surface new_mask = create_neutral_surface(src->w, src->h); - blit_surface(mask_, NULL, new_mask, &r); + blit_surface(mask_, nullptr, new_mask, &r); return mask_surface(src, new_mask); } @@ -344,7 +344,7 @@ int mask_modification::get_y() const } surface light_modification::operator()(const surface& src) const { - if(src == NULL) { return NULL; } + if(src == nullptr) { return nullptr; } //light_surface wants a neutral surface having same dimensions surface nsurf; @@ -513,7 +513,7 @@ surface brighten_modification::operator()(const surface &src) const surface ret = make_neutral_surface(src); surface tod_bright(image::get_image(game_config::images::tod_bright)); if (tod_bright) - blit_surface(tod_bright, NULL, ret, NULL); + blit_surface(tod_bright, nullptr, ret, nullptr); return ret; } @@ -522,17 +522,17 @@ surface darken_modification::operator()(const surface &src) const surface ret = make_neutral_surface(src); surface tod_dark(image::get_image(game_config::images::tod_dark)); if (tod_dark) - blit_surface(tod_dark, NULL, ret, NULL); + blit_surface(tod_dark, nullptr, ret, nullptr); return ret; } surface background_modification::operator()(const surface &src) const { surface ret = make_neutral_surface(src); - SDL_FillRect(ret, NULL, SDL_MapRGBA(ret->format, color_.r, color_.g, + SDL_FillRect(ret, nullptr, SDL_MapRGBA(ret->format, color_.r, color_.g, color_.b, color_.a)); SDL_SetAlpha(src, SDL_SRCALPHA, SDL_ALPHA_OPAQUE); - blit_surface(src, NULL, ret, NULL); + blit_surface(src, nullptr, ret, nullptr); return ret; } @@ -578,7 +578,7 @@ REGISTER_MOD_PARSER(TC, args) if(params.size() < 2) { ERR_DP << "too few arguments passed to the ~TC() function" << std::endl; - return NULL; + return nullptr; } int side_n = lexical_cast_default(params[0], -1); @@ -586,7 +586,7 @@ REGISTER_MOD_PARSER(TC, args) if (side_n < 1) { ERR_DP << "invalid team (" << side_n << ") passed to the ~TC() function\n"; - return NULL; + return nullptr; } else if (side_n < static_cast(image::get_team_colors().size())) { team_color = image::get_team_colors()[side_n - 1]; @@ -598,7 +598,7 @@ REGISTER_MOD_PARSER(TC, args) } catch(bad_lexical_cast const&) { ERR_DP << "bad things happen" << std::endl; - return NULL; + return nullptr; } } @@ -610,7 +610,7 @@ REGISTER_MOD_PARSER(TC, args) << "' palette\n" << "bailing out from TC\n"; - return NULL; + return nullptr; } std::map rc_map; @@ -628,7 +628,7 @@ REGISTER_MOD_PARSER(TC, args) << '\n' << "bailing out from TC\n"; - return NULL; + return nullptr; } return new rc_modification(rc_map); @@ -665,7 +665,7 @@ REGISTER_MOD_PARSER(RC, args) return new rc_modification(rc_map); } - return NULL; + return nullptr; } // Palette switch @@ -677,7 +677,7 @@ REGISTER_MOD_PARSER(PAL, args) ERR_DP << "not enough arguments passed to the ~PAL() function: " << args << "\n"; - return NULL; + return nullptr; } @@ -702,7 +702,7 @@ REGISTER_MOD_PARSER(PAL, args) ERR_DP << "bailing out from PAL\n"; - return NULL; + return nullptr; } } @@ -741,7 +741,7 @@ REGISTER_MOD_PARSER(ROTATE, args) lexical_cast_default(slice_params[2])); break; } - return NULL; + return nullptr; } // Grayscale @@ -759,7 +759,7 @@ REGISTER_MOD_PARSER(BW, args) int threshold = lexical_cast(params[0]); if (threshold < 0 || threshold > 255) { ERR_DP << "~BW() argument out of range 0 - 255" << std::endl; - return NULL; + return nullptr; } else { return new bw_modification(threshold); @@ -767,12 +767,12 @@ REGISTER_MOD_PARSER(BW, args) } catch (bad_lexical_cast) { ERR_DP << "unsupported argument in ~BW() function" << std::endl; - return NULL; + return nullptr; } } else { ERR_DP << "~BW() requires exactly one argument" << std::endl; - return NULL; + return nullptr; } } @@ -799,7 +799,7 @@ REGISTER_MOD_PARSER(NEG, args) int threshold = lexical_cast(params[0]); if (threshold < -1 || threshold > 255) { ERR_DP << "unsupported argument value in ~NEG() function" << std::endl; - return NULL; + return nullptr; } else { return new negative_modification(threshold, threshold, threshold); @@ -807,7 +807,7 @@ REGISTER_MOD_PARSER(NEG, args) } catch (bad_lexical_cast) { ERR_DP << "unsupported argument value in ~NEG() function" << std::endl; - return NULL; + return nullptr; } break; case 3: @@ -817,7 +817,7 @@ REGISTER_MOD_PARSER(NEG, args) int thresholdBlue = lexical_cast(params[2]); if (thresholdRed < -1 || thresholdRed > 255 || thresholdGreen < -1 || thresholdGreen > 255 || thresholdBlue < -1 || thresholdBlue > 255) { ERR_DP << "unsupported argument value in ~NEG() function" << std::endl; - return NULL; + return nullptr; } else { return new negative_modification(thresholdRed, thresholdGreen, thresholdBlue); @@ -825,15 +825,15 @@ REGISTER_MOD_PARSER(NEG, args) } catch (bad_lexical_cast) { ERR_DP << "unsupported argument value in ~NEG() function" << std::endl; - return NULL; + return nullptr; } break; default: ERR_DP << "~NEG() requires 0, 1 or 3 arguments" << std::endl; - return NULL; + return nullptr; } - return NULL; + return nullptr; } // Plot Alpha @@ -855,7 +855,7 @@ REGISTER_MOD_PARSER(ADJUST_ALPHA, args) if(params.size() != 1) { ERR_DP << "~ADJUST_ALPHA() requires exactly 1 arguments" << std::endl; - return NULL; + return nullptr; } std::string opacity_str = params.at(0); @@ -878,7 +878,7 @@ REGISTER_MOD_PARSER(CS, args) if(s == 0) { ERR_DP << "no arguments passed to the ~CS() function" << std::endl; - return NULL; + return nullptr; } int r = 0, g = 0, b = 0; @@ -902,7 +902,7 @@ REGISTER_MOD_PARSER(BLEND, args) if(params.size() != 4) { ERR_DP << "~BLEND() requires exactly 4 arguments" << std::endl; - return NULL; + return nullptr; } float opacity = 0.0f; @@ -933,7 +933,7 @@ REGISTER_MOD_PARSER(CROP, args) if(s == 0 || (s == 1 && slice_params[0].empty())) { ERR_DP << "no arguments passed to the ~CROP() function" << std::endl; - return NULL; + return nullptr; } SDL_Rect slice_rect = { 0, 0, 0, 0 }; @@ -969,7 +969,7 @@ REGISTER_MOD_PARSER(BLIT, args) if(s == 0 || (s == 1 && param[0].empty())){ ERR_DP << "no arguments passed to the ~BLIT() function" << std::endl; - return NULL; + return nullptr; } int x = 0, y = 0; @@ -981,14 +981,14 @@ REGISTER_MOD_PARSER(BLIT, args) if(x < 0 || y < 0) { //required by blit_surface ERR_DP << "negative position arguments in ~BLIT() function" << std::endl; - return NULL; + return nullptr; } const image::locator img(param[0]); std::stringstream message; message << "~BLIT():"; if(!check_image(img, message)) - return NULL; + return nullptr; surface surf = get_image(img); return new blit_modification(surf, x, y); @@ -1002,7 +1002,7 @@ REGISTER_MOD_PARSER(MASK, args) if(s == 0 || (s == 1 && param[0].empty())){ ERR_DP << "no arguments passed to the ~MASK() function" << std::endl; - return NULL; + return nullptr; } int x = 0, y = 0; @@ -1014,14 +1014,14 @@ REGISTER_MOD_PARSER(MASK, args) if(x < 0 || y < 0) { //required by blit_surface ERR_DP << "negative position arguments in ~MASK() function" << std::endl; - return NULL; + return nullptr; } const image::locator img(param[0]); std::stringstream message; message << "~MASK():"; if(!check_image(img, message)) - return NULL; + return nullptr; surface surf = get_image(img); return new mask_modification(surf, x, y); @@ -1032,7 +1032,7 @@ REGISTER_MOD_PARSER(L, args) { if(args.empty()){ ERR_DP << "no arguments passed to the ~L() function" << std::endl; - return NULL; + return nullptr; } surface surf = get_image(args); @@ -1048,7 +1048,7 @@ REGISTER_MOD_PARSER(SCALE, args) if(s == 0 || (s == 1 && scale_params[0].empty())) { ERR_DP << "no arguments passed to the ~SCALE() function" << std::endl; - return NULL; + return nullptr; } int w = 0, h = 0; @@ -1069,7 +1069,7 @@ REGISTER_MOD_PARSER(SCALE_SHARP, args) if(s == 0 || (s == 1 && scale_params[0].empty())) { ERR_DP << "no arguments passed to the ~SCALE_SHARP() function" << std::endl; - return NULL; + return nullptr; } int w = 0, h = 0; @@ -1090,7 +1090,7 @@ REGISTER_MOD_PARSER(SCALE_INTO, args) if(s == 0 || (s == 1 && scale_params[0].empty())) { ERR_DP << "no arguments passed to the ~SCALE_INTO() function" << std::endl; - return NULL; + return nullptr; } int w = 0, h = 0; @@ -1111,7 +1111,7 @@ REGISTER_MOD_PARSER(SCALE_INTO_SHARP, args) if(s == 0 || (s == 1 && scale_params[0].empty())) { ERR_DP << "no arguments passed to the ~SCALE_INTO_SHARP() function" << std::endl; - return NULL; + return nullptr; } int w = 0, h = 0; @@ -1193,14 +1193,14 @@ REGISTER_MOD_PARSER(B, args) REGISTER_MOD_PARSER(NOP, ) { - return NULL; + return nullptr; } // Fake image function used by GUI2 portraits until // Mordante gets rid of it. *tsk* *tsk* REGISTER_MOD_PARSER(RIGHT, ) { - return NULL; + return nullptr; } // Add a bright overlay. @@ -1236,7 +1236,7 @@ REGISTER_MOD_PARSER(SWAP, args) // accept 3 arguments (rgb) or 4 (rgba) if (params.size() != 3 && params.size() != 4) { ERR_DP << "incorrect number of arguments in ~SWAP() function, they must be 3 or 4" << std::endl; - return NULL; + return nullptr; } channel redValue, greenValue, blueValue, alphaValue; @@ -1251,7 +1251,7 @@ REGISTER_MOD_PARSER(SWAP, args) redValue = ALPHA; } else { ERR_DP << "unsupported argument value in ~SWAP() function: " << params[0] << std::endl; - return NULL; + return nullptr; } // wash, rinse and repeat for the other three channels @@ -1265,7 +1265,7 @@ REGISTER_MOD_PARSER(SWAP, args) greenValue = ALPHA; } else { ERR_DP << "unsupported argument value in ~SWAP() function: " << params[0] << std::endl; - return NULL; + return nullptr; } if (params[2] == "red") { @@ -1278,7 +1278,7 @@ REGISTER_MOD_PARSER(SWAP, args) blueValue = ALPHA; } else { ERR_DP << "unsupported argument value in ~SWAP() function: " << params[0] << std::endl; - return NULL; + return nullptr; } // additional check: the params vector may not have a fourth elementh @@ -1297,7 +1297,7 @@ REGISTER_MOD_PARSER(SWAP, args) alphaValue = ALPHA; } else { ERR_DP << "unsupported argument value in ~SWAP() function: " << params[3] << std::endl; - return NULL; + return nullptr; } } diff --git a/src/key.cpp b/src/key.cpp index f9418f8b7c2d..1a489832fba8 100644 --- a/src/key.cpp +++ b/src/key.cpp @@ -20,7 +20,7 @@ #include CKey::CKey() : - key_list(SDL_GetKeyState(NULL)) + key_list(SDL_GetKeyState(nullptr)) { } diff --git a/src/language.cpp b/src/language.cpp index 92bcdb20992f..61bbbd0a86cd 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -157,7 +157,7 @@ static void wesnoth_setlocale(int category, std::string const &slocale, locale = win_locale; #endif - char *res = NULL; + char *res = nullptr; std::vector::const_iterator i; if (alternates) i = alternates->begin(); @@ -205,8 +205,8 @@ static void wesnoth_setlocale(int category, std::string const &slocale, #endif done: - DBG_G << "Numeric locale: " << std::setlocale(LC_NUMERIC, NULL) << '\n'; - DBG_G << "Full locale: " << std::setlocale(LC_ALL, NULL) << '\n'; + DBG_G << "Numeric locale: " << std::setlocale(LC_NUMERIC, nullptr) << '\n'; + DBG_G << "Full locale: " << std::setlocale(LC_ALL, nullptr) << '\n'; } void set_language(const language_def& locale) @@ -259,7 +259,7 @@ const language_def& get_locale() const std::string& prefs_locale = preferences::language(); if(prefs_locale.empty() == false) { - translation::set_language(prefs_locale, NULL); + translation::set_language(prefs_locale, nullptr); for(language_list::const_iterator i = known_languages.begin(); i != known_languages.end(); ++i) { if (prefs_locale == i->localename) @@ -276,7 +276,7 @@ const language_def& get_locale() #include "language_win32.ii" return win_locale; #endif - if(locale != NULL && strlen(locale) >= 2) { + if(locale != nullptr && strlen(locale) >= 2) { //we can't pass pointers into the string to the std::string //constructor because some STL implementations don't support //it (*cough* MSVC++6) diff --git a/src/log.cpp b/src/log.cpp index d5521883fec3..b426915d03a0 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -50,7 +50,7 @@ static bool timestamp = true; static bool precise_timestamp = false; static boost::posix_time::time_facet facet("%Y%m%d %H:%M:%S%F "); -static std::ostream *output_stream = NULL; +static std::ostream *output_stream = nullptr; static std::ostream& output() { @@ -110,7 +110,7 @@ log_domain& general() } log_domain::log_domain(char const *name) - : domain_(NULL) + : domain_(nullptr) { // Indirection to prevent initialization depending on link order. if (!domains) domains = new domain_map; @@ -219,7 +219,7 @@ std::ostream &logger::operator()(log_domain const &domain, bool show_names, bool if(precise_timestamp) { print_precise_timestamp(stream); } else { - stream << get_timestamp(time(NULL)); + stream << get_timestamp(time(nullptr)); } } if (show_names) { @@ -243,7 +243,7 @@ void scope_logger::do_log_exit() const int ticks = SDL_GetTicks() - ticks_; --indent; do_indent(); - if (timestamp) (*output_) << get_timestamp(time(NULL)); + if (timestamp) (*output_) << get_timestamp(time(nullptr)); (*output_) << "} END: " << str_ << " (took " << ticks << "ms)\n"; } diff --git a/src/log.hpp b/src/log.hpp index c38e7e7b22d8..f40cc1d4119c 100644 --- a/src/log.hpp +++ b/src/log.hpp @@ -146,14 +146,14 @@ class scope_logger public: scope_logger(log_domain const &domain, const char* str) : ticks_(0), - output_(NULL), + output_(nullptr), str_() { if (!debug().dont_log(domain)) do_log_entry(domain, str); } scope_logger(log_domain const &domain, const std::string& str) : ticks_(0), - output_(NULL), + output_(nullptr), str_() { if (!debug().dont_log(domain)) do_log_entry(domain, str); diff --git a/src/log_windows.cpp b/src/log_windows.cpp index c261aac92e47..9b77eb5fb1dd 100644 --- a/src/log_windows.cpp +++ b/src/log_windows.cpp @@ -108,7 +108,7 @@ std::string unique_log_filename() o << log_file_prefix; - const time_t cur = time(NULL); + const time_t cur = time(nullptr); const tm* const lt = localtime(&cur); if(lt) { @@ -147,7 +147,7 @@ void log_init_panic(const std::string& msg) // It may not be useful to write to stderr at this point, so warn the user // in a failsafe fashion via Windows UI API. - MessageBox(NULL, + MessageBox(nullptr, unicode_cast(full_msg).c_str(), L"Battle for Wesnoth", MB_ICONEXCLAMATION | MB_OK); @@ -383,7 +383,7 @@ void log_file_manager::do_redirect_single_stream(const std::string& file_path, throw libc_error(); } - //setbuf(crts, NULL); + //setbuf(crts, nullptr); DBG_LS << stream << ' ' << cur_path_ << " -> " << file_path << " [side B]\n"; } @@ -395,7 +395,7 @@ bool log_file_manager::console_enabled() const bool log_file_manager::console_attached() const { - return GetConsoleWindow() != NULL; + return GetConsoleWindow() != nullptr; } void log_file_manager::enable_native_console_output() diff --git a/src/lua_jailbreak_exception.cpp b/src/lua_jailbreak_exception.cpp index 8844f886f36b..fb89959ed8a1 100644 --- a/src/lua_jailbreak_exception.cpp +++ b/src/lua_jailbreak_exception.cpp @@ -15,9 +15,8 @@ #include "lua_jailbreak_exception.hpp" #include -#include // Needed for NULL. -tlua_jailbreak_exception *tlua_jailbreak_exception::jailbreak_exception = NULL; +tlua_jailbreak_exception *tlua_jailbreak_exception::jailbreak_exception = nullptr; void tlua_jailbreak_exception::store() const throw() { @@ -58,6 +57,6 @@ void tlua_jailbreak_exception::rethrow() void tlua_jailbreak_exception::clear() throw() { delete jailbreak_exception; - jailbreak_exception = NULL; + jailbreak_exception = nullptr; } diff --git a/src/lua_jailbreak_exception.hpp b/src/lua_jailbreak_exception.hpp index 02ec3e01af45..a71515eb77f3 100644 --- a/src/lua_jailbreak_exception.hpp +++ b/src/lua_jailbreak_exception.hpp @@ -70,7 +70,7 @@ class tlua_jailbreak_exception * * @note it's implemented by the subclass to avoid slicing. * - * @pre jailbreak_exception != NULL + * @pre jailbreak_exception != nullptr */ virtual void execute() = 0; }; diff --git a/src/map/label.cpp b/src/map/label.cpp index ced1d742899f..4225ba7284eb 100644 --- a/src/map/label.cpp +++ b/src/map/label.cpp @@ -104,7 +104,7 @@ const terrain_label* map_labels::get_label(const map_location& loc, const std::s if (itor != label_map->second.end()) return itor->second; } - return NULL; + return nullptr; } const terrain_label* map_labels::get_label(const map_location& loc) const @@ -112,7 +112,7 @@ const terrain_label* map_labels::get_label(const map_location& loc) const const terrain_label* res = get_label(loc, team_name()); // no such team label, we try global label, except if it's what we just did // NOTE: This also avoid infinite recursion - if (res == NULL && team_name() != "") { + if (res == nullptr && team_name() != "") { return get_label(loc, ""); } return res; @@ -155,7 +155,7 @@ const terrain_label* map_labels::set_label(const map_location& loc, const std::string& category, const t_string& tooltip ) { - terrain_label* res = NULL; + terrain_label* res = nullptr; // See if there is already a label in this location for this team. // (We do not use get_label_private() here because we might need @@ -203,7 +203,7 @@ const terrain_label* map_labels::set_label(const map_location& loc, add_label(loc, res); // Hide the old label. - if ( global_label != NULL ) + if ( global_label != nullptr ) global_label->recalculate(); } categories_dirty = true; diff --git a/src/map/location.hpp b/src/map/location.hpp index bf8055b7f30c..d573d5260992 100644 --- a/src/map/location.hpp +++ b/src/map/location.hpp @@ -59,7 +59,7 @@ struct map_location { map_location() : x(-1000), y(-1000) {} map_location(int x, int y) : x(x), y(y) {} - map_location(const config& cfg, const variable_set *variables = NULL); + map_location(const config& cfg, const variable_set *variables = nullptr); static const map_location & ZERO(); static const map_location & null_location(); diff --git a/src/map/map.cpp b/src/map/map.cpp index bb1d4dc8ceac..61d8a41cef6c 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -349,7 +349,7 @@ void gamemap::overlay(const gamemap& m, const config& rules_cfg, int xpos, int y } // See if there is a matching rule - const overlay_rule* rule = NULL; + const overlay_rule* rule = nullptr; BOOST_FOREACH(const overlay_rule& current_rule, rules) { if(!current_rule.old_.empty() && !t_translation::terrain_matches(current, current_rule.old_)) { diff --git a/src/marked-up_text.cpp b/src/marked-up_text.cpp index 50f4dd092614..410a6123ea2f 100644 --- a/src/marked-up_text.cpp +++ b/src/marked-up_text.cpp @@ -156,7 +156,7 @@ std::string del_tags(const std::string& text){ for(line = lines.begin(); line != lines.end(); ++line) { std::string::const_iterator i1 = line->begin(), i2 = line->end(); - *line = std::string(parse_markup(i1,i2,NULL,NULL,NULL),i2); + *line = std::string(parse_markup(i1,i2,nullptr,nullptr,nullptr),i2); } return utils::join(lines, "\n"); } @@ -188,7 +188,7 @@ std::string span_color(const SDL_Color &color) SDL_Rect text_area(const std::string& text, int size, int style) { const SDL_Rect area = {0,0,10000,10000}; - return draw_text(NULL, area, size, font::NORMAL_COLOR, text, 0, 0, false, style); + return draw_text(nullptr, area, size, font::NORMAL_COLOR, text, 0, 0, false, style); } SDL_Rect draw_text(surface& dst, const SDL_Rect& area, int size, @@ -242,9 +242,9 @@ SDL_Rect draw_text(CVideo* gui, const SDL_Rect& area, int size, const SDL_Color& color, const std::string& txt, int x, int y, bool use_tooltips, int style) { - surface null_surf = surface(NULL); + surface null_surf = surface(nullptr); - return draw_text(gui != NULL ? gui->getSurface() : null_surf, area, size, color, txt, x, y, use_tooltips, style); + return draw_text(gui != nullptr ? gui->getSurface() : null_surf, area, size, color, txt, x, y, use_tooltips, style); } bool is_format_char(char c) @@ -571,7 +571,7 @@ sdl::timage draw_text_to_texture(const SDL_Rect &area, int size, const SDL_Color 0x00ff0000, 0x0000ff00, 0x000000ff); - SDL_FillRect(surf, NULL, 0x000000ff); + SDL_FillRect(surf, nullptr, 0x000000ff); draw_text(surf, area, size, color, text, 0, 0, use_tooltips, style); return sdl::timage(surf); diff --git a/src/marked-up_text.hpp b/src/marked-up_text.hpp index 5e4971f00eb7..6d5bb961487a 100644 --- a/src/marked-up_text.hpp +++ b/src/marked-up_text.hpp @@ -73,14 +73,14 @@ std::string::const_iterator parse_markup(std::string::const_iterator i1, * * The above special characters can be quoted using a C-style backslash. * - * A bounding rectangle of the text is returned. If dst is NULL, then the + * A bounding rectangle of the text is returned. If dst is nullptr, then the * text will not be drawn, and a bounding rectangle only will be returned. */ SDL_Rect draw_text(surface& dst, const SDL_Rect& area, int size, const SDL_Color& color, const std::string& text, int x, int y, bool use_tooltips = false, int style = 0); -/** wrapper of the previous function, gui can also be NULL */ +/** wrapper of the previous function, gui can also be nullptr */ SDL_Rect draw_text(CVideo* gui, const SDL_Rect& area, int size, const SDL_Color& color, const std::string& text, int x, int y, bool use_tooltips = false, int style = 0); diff --git a/src/md5.cpp b/src/md5.cpp index a538a34e4937..f33acae16bd4 100644 --- a/src/md5.cpp +++ b/src/md5.cpp @@ -163,7 +163,7 @@ MD5::uint1 *MD5::raw_digest() if (!finalized){ std::cerr << "MD5::raw_digest: Can't get digest if you haven't "<< "finalized the digest!" <video()); //std::string text = resources::recorder->build_chat_log(); - //gui::show_dialog(*gui_,NULL,_("Chat Log"),"",gui::CLOSE_ONLY,NULL,NULL,"",&text); + //gui::show_dialog(*gui_,nullptr,_("Chat Log"),"",gui::CLOSE_ONLY,nullptr,nullptr,"",&text); } void menu_handler::show_help() @@ -894,7 +894,7 @@ namespace { // Helpers for create_unit() * (Intended for use when a unit is created in debug mode via hotkey or * context menu.) * @returns the selected type and gender. If this is canceled, the - * returned type is NULL. + * returned type is nullptr. */ type_and_gender choose_unit(game_display& gui) { @@ -908,14 +908,14 @@ namespace { // Helpers for create_unit() if(create_dlg.no_choice()) { // the static cast fixes http://connect.microsoft.com/VisualStudio/feedback/details/520043/ // c++11's nullptr would be a better solution as soon as we support it. - return type_and_gender(static_cast(NULL), unit_race::NUM_GENDERS); + return type_and_gender(static_cast(nullptr), unit_race::NUM_GENDERS); } const std::string& ut_id = create_dlg.choice(); const unit_type *utp = unit_types.find(ut_id); if (!utp) { ERR_NG << "Create unit dialog returned nonexistent or unusable unit_type id '" << ut_id << "'." << std::endl; - return type_and_gender(static_cast(NULL), unit_race::NUM_GENDERS); + return type_and_gender(static_cast(nullptr), unit_race::NUM_GENDERS); } const unit_type &ut = *utp; @@ -952,11 +952,11 @@ void menu_handler::create_unit(mouse_handler& mousehandler) // Save the current mouse location before popping up the choice menu (which // gives time for the mouse to move, changing the location). const map_location destination = mousehandler.get_last_hex(); - assert(gui_ != NULL); + assert(gui_ != nullptr); // Let the user select the kind of unit to create. type_and_gender selection = choose_unit(*gui_); - if ( selection.first != NULL ) + if ( selection.first != nullptr ) // Make it so. create_and_place(*gui_, map(), units(), destination, *selection.first, selection.second); @@ -1082,7 +1082,7 @@ void menu_handler::move_unit_to_loc(const unit_map::iterator &ui, LOG_NG << "move_unit_to_loc " << route.steps.front() << " to " << route.steps.back() << "\n"; actions::move_unit_and_record(route.steps, &pc_.get_undo_stack(), continue_move); } - gui_->set_route(NULL); + gui_->set_route(nullptr); gui_->invalidate_game_status(); } @@ -1171,7 +1171,7 @@ void menu_handler::execute_gotos(mouse_handler &mousehandler, int side) } while(change && blocked_unit); // erase the footsteps after movement - gui_->set_route(NULL); + gui_->set_route(nullptr); gui_->invalidate_game_status(); } @@ -1236,7 +1236,7 @@ void menu_handler::search() void menu_handler::do_speak(){ //None of the two parameters really needs to be passed since the information belong to members of the class. //But since it makes the called method more generic, it is done anyway. - chat_handler::do_speak(textbox_info_.box()->text(),textbox_info_.check() != NULL ? textbox_info_.check()->checked() : false); + chat_handler::do_speak(textbox_info_.box()->text(),textbox_info_.check() != nullptr ? textbox_info_.check()->checked() : false); } @@ -1693,7 +1693,7 @@ class chat_command_handler : public map_command_handler void print(const std::string& title, const std::string& message) { - chat_handler_.add_chat_message(time(NULL), title, 0, message); + chat_handler_.add_chat_message(time(nullptr), title, 0, message); } void init_map() { @@ -1896,7 +1896,7 @@ class console_handler : public map_command_handler, private cha } void print(const std::string& title, const std::string& message) { - menu_handler_.add_chat_message(time(NULL), title, 0, message); + menu_handler_.add_chat_message(time(nullptr), title, 0, message); } void init_map() { @@ -2050,7 +2050,7 @@ void chat_handler::change_logging(const std::string& data) { const std::string& msg = vgettext("Unknown debug level: '$level'.", symbols); ERR_NG << msg << std::endl; - add_chat_message(time(NULL), _("error"), 0, msg); + add_chat_message(time(nullptr), _("error"), 0, msg); return; } if (!lg::set_log_domain_severity(domain, severity)) { @@ -2059,7 +2059,7 @@ void chat_handler::change_logging(const std::string& data) { const std::string& msg = vgettext("Unknown debug domain: '$domain'.", symbols); ERR_NG << msg << std::endl; - add_chat_message(time(NULL), _("error"), 0, msg); + add_chat_message(time(nullptr), _("error"), 0, msg); return; } else { utils::string_map symbols; @@ -2068,7 +2068,7 @@ void chat_handler::change_logging(const std::string& data) { const std::string& msg = vgettext("Switched domain: '$domain' to level: '$level'.", symbols); LOG_NG << msg << "\n"; - add_chat_message(time(NULL), "log", 0, msg); + add_chat_message(time(nullptr), "log", 0, msg); } } @@ -2082,7 +2082,7 @@ void chat_handler::send_command(const std::string& cmd, const std::string& args || cmd == "mute" || cmd == "unmute") { data.add_child(cmd)["username"] = args; } else if (cmd == "ping") { - data[cmd] = std::to_string(time(NULL)); + data[cmd] = std::to_string(time(nullptr)); } else if (cmd == "green") { data.add_child("query")["type"] = "lobbymsg @" + args; } else if (cmd == "red") { @@ -2137,14 +2137,14 @@ void chat_handler::add_whisper_sent(const std::string& receiver, const std::stri { utils::string_map symbols; symbols["receiver"] = receiver; - add_chat_message(time(NULL), VGETTEXT("whisper to $receiver", symbols), 0, message); + add_chat_message(time(nullptr), VGETTEXT("whisper to $receiver", symbols), 0, message); } void chat_handler::add_whisper_received(const std::string& sender, const std::string& message) { utils::string_map symbols; symbols["sender"] = sender; - add_chat_message(time(NULL), VGETTEXT("whisper: $sender", symbols), 0, message); + add_chat_message(time(nullptr), VGETTEXT("whisper: $sender", symbols), 0, message); } void chat_handler::send_chat_room_message(const std::string& room, @@ -2166,7 +2166,7 @@ void chat_handler::add_chat_room_message_sent(const std::string &room, const std void chat_handler::add_chat_room_message_received(const std::string &room, const std::string &speaker, const std::string &message) { - add_chat_message(time(NULL), room + ": " + speaker, 0, message, events::chat_handler::MESSAGE_PRIVATE); + add_chat_message(time(nullptr), room + ": " + speaker, 0, message, events::chat_handler::MESSAGE_PRIVATE); } @@ -2374,7 +2374,7 @@ void menu_handler::send_chat_message(const std::string& message, bool allies_onl config cfg; cfg["id"] = preferences::login(); cfg["message"] = message; - const time_t time = ::time(NULL); + const time_t time = ::time(nullptr); std::stringstream ss; ss << time; cfg["time"] = ss.str(); @@ -3057,10 +3057,10 @@ void menu_handler::do_ai_formula(const std::string& str, int side_num, mouse_handler& /*mousehandler*/) { try { - add_chat_message(time(NULL), _("wfl"), 0, ai::manager::evaluate_command(side_num, str)); + add_chat_message(time(nullptr), _("wfl"), 0, ai::manager::evaluate_command(side_num, str)); } catch(game_logic::formula_error&) { } catch(...) { - add_chat_message(time(NULL), _("wfl"), 0, "UNKNOWN ERROR IN FORMULA"); + add_chat_message(time(nullptr), _("wfl"), 0, "UNKNOWN ERROR IN FORMULA"); } } diff --git a/src/minimap.cpp b/src/minimap.cpp index 4572d5e1a3d3..9289753fc41c 100644 --- a/src/minimap.cpp +++ b/src/minimap.cpp @@ -58,7 +58,7 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: const size_t map_width = map.w()*scale*3/4; const size_t map_height = map.h()*scale; if(map_width == 0 || map_height == 0) { - return surface(NULL); + return surface(nullptr); } if(!preferences_minimap_draw_villages && !preferences_minimap_draw_terrain) @@ -70,8 +70,8 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: } surface minimap(create_neutral_surface(map_width, map_height)); - if(minimap == NULL) - return surface(NULL); + if(minimap == nullptr) + return surface(nullptr); typedef mini_terrain_cache_map cache_map; cache_map *normal_cache = &mini_terrain_cache; @@ -87,9 +87,9 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: const bool highlighted = reach_map && reach_map->count(loc) != 0; - const bool shrouded = (resources::screen != NULL && resources::screen->is_blindfolded()) || (vw != NULL && vw->shrouded(loc)); + const bool shrouded = (resources::screen != nullptr && resources::screen->is_blindfolded()) || (vw != nullptr && vw->shrouded(loc)); // shrouded hex are not considered fogged (no need to fog a black image) - const bool fogged = (vw != NULL && !shrouded && vw->fogged(loc)); + const bool fogged = (vw != nullptr && !shrouded && vw->fogged(loc)); const t_translation::t_terrain terrain = shrouded ? t_translation::VOID_TERRAIN : map[loc]; @@ -111,7 +111,7 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: if (preferences_minimap_terrain_coding) { - surface surf(NULL); + surface surf(nullptr); bool need_fogging = false; bool need_highlighting = false; @@ -144,20 +144,20 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: //Compose images of base and overlay if necessary // NOTE we also skip overlay when base is missing (to avoid hiding the error) - if(tile != NULL && tdata.get_terrain_info(terrain).is_combined() && !terrain_info.minimap_image_overlay().empty()) { + if(tile != nullptr && tdata.get_terrain_info(terrain).is_combined() && !terrain_info.minimap_image_overlay().empty()) { std::string overlay_file = "terrain/" + terrain_info.minimap_image_overlay() + ".png"; surface overlay = get_image(overlay_file,image::HEXED); - if(overlay != NULL && overlay != tile) { + if(overlay != nullptr && overlay != tile) { surface combined = create_neutral_surface(tile->w, tile->h); SDL_Rect r = sdl::create_rect(0,0,0,0); - sdl_blit(tile, NULL, combined, &r); + sdl_blit(tile, nullptr, combined, &r); r.x = std::max(0, (tile->w - overlay->w)/2); r.y = std::max(0, (tile->h - overlay->h)/2); //blit_surface needs neutral surface surface overlay_neutral = make_neutral_surface(overlay); - blit_surface(overlay_neutral, NULL, combined, &r); + blit_surface(overlay_neutral, nullptr, combined, &r); tile = combined; } } @@ -179,8 +179,8 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: highlight_cache->insert(cache_map::value_type(terrain,surf)); } - if(surf != NULL) - sdl_blit(surf, NULL, minimap, &maprect); + if(surf != nullptr) + sdl_blit(surf, nullptr, minimap, &maprect); } else { @@ -307,9 +307,9 @@ SDL_Rect draw_minimap(CVideo &video, const SDL_Rect &area, const gamemap &map, c continue; const bool highlighted = reach_map && reach_map->count(loc) != 0; - const bool shrouded = (resources::screen != NULL && resources::screen->is_blindfolded()) || (vw != NULL && vw->shrouded(loc)); + const bool shrouded = (resources::screen != nullptr && resources::screen->is_blindfolded()) || (vw != nullptr && vw->shrouded(loc)); // shrouded hex are not considered fogged (no need to fog a black image) - const bool fogged = (vw != NULL && !shrouded && vw->fogged(loc)); + const bool fogged = (vw != nullptr && !shrouded && vw->fogged(loc)); const t_translation::t_terrain terrain = shrouded ? t_translation::VOID_TERRAIN : map[loc]; diff --git a/src/minimap.hpp b/src/minimap.hpp index a84e8f07cea2..0aa308143088 100644 --- a/src/minimap.hpp +++ b/src/minimap.hpp @@ -31,9 +31,9 @@ namespace image { ///function to create the minimap for a given map ///the surface returned must be freed by the user #ifdef SDL_GPU - SDL_Rect draw_minimap(CVideo &video, const SDL_Rect &area, const gamemap &map, const team *vw = NULL, const std::map *reach_map = NULL); + SDL_Rect draw_minimap(CVideo &video, const SDL_Rect &area, const gamemap &map, const team *vw = nullptr, const std::map *reach_map = nullptr); #endif - surface getMinimap(int w, int h, const gamemap &map_, const team *vm = NULL, const std::map *reach_map = NULL); + surface getMinimap(int w, int h, const gamemap &map_, const team *vm = nullptr, const std::map *reach_map = nullptr); } #endif diff --git a/src/mouse_events.cpp b/src/mouse_events.cpp index 796639eeeb38..675d65e48f90 100644 --- a/src/mouse_events.cpp +++ b/src/mouse_events.cpp @@ -58,7 +58,6 @@ #include // for intrusive_ptr #include // for shared_ptr #include // for assert -#include // for NULL #include // for bad_alloc #include // for operator<<, basic_ostream, etc #include // for string, operator<<, etc @@ -96,7 +95,7 @@ mouse_handler::mouse_handler(game_display* gui, play_controller & pc) : mouse_handler::~mouse_handler() { - singleton_ = NULL; + singleton_ = nullptr; } void mouse_handler::set_side(int side_number) @@ -168,7 +167,7 @@ void mouse_handler::mouse_motion(int x, int y, const bool browse, bool update, m // we do it before cursor selection, because it uses current_paths_ if( !pc_.get_map_const().on_board(new_hex) ) { current_route_.steps.clear(); - gui().set_route(NULL); + gui().set_route(nullptr); pc_.get_whiteboard()->erase_temp_move(); } @@ -179,7 +178,7 @@ void mouse_handler::mouse_motion(int x, int y, const bool browse, bool update, m } else if(over_route_) { over_route_ = false; current_route_.steps.clear(); - gui().set_route(NULL); + gui().set_route(nullptr); pc_.get_whiteboard()->erase_temp_move(); } @@ -257,7 +256,7 @@ void mouse_handler::mouse_motion(int x, int y, const bool browse, bool update, m if(dest == selected_hex_ || dest_un) { current_route_.steps.clear(); - gui().set_route(NULL); + gui().set_route(nullptr); pc_.get_whiteboard()->erase_temp_move(); } else if (!current_paths_.destinations.empty() && @@ -289,7 +288,7 @@ void mouse_handler::mouse_motion(int x, int y, const bool browse, bool update, m } } else if (!selected_unit) { current_route_.steps.clear(); - gui().set_route(NULL); + gui().set_route(nullptr); pc_.get_whiteboard()->erase_temp_move(); } @@ -695,7 +694,7 @@ void mouse_handler::move_action(bool browse) selected_hex_ = map_location(); gui().select_hex(map_location()); gui().clear_attack_indicator(); - gui().set_route(NULL); + gui().set_route(nullptr); show_partial_move_ = false; gui().unhighlight_reach(); current_paths_ = pathfind::paths(); @@ -733,7 +732,7 @@ void mouse_handler::select_hex(const map_location& hex, const bool browse, const gui().select_hex(selected_hex_); gui().clear_attack_indicator(); - gui().set_route(NULL); + gui().set_route(nullptr); show_partial_move_ = false; wb::future_map_if_active planned_unit_map; //lasts for whole method @@ -754,7 +753,7 @@ void mouse_handler::select_hex(const map_location& hex, const bool browse, const // the highlight now comes from selection // and not from the mouseover on an enemy unselected_paths_ = false; - gui().set_route(NULL); + gui().set_route(nullptr); // selection have impact only if we are not observing and it's our unit if ((!commands_disabled || pc_.get_whiteboard()->is_active()) && u->side() == gui().viewing_side()) { @@ -827,7 +826,7 @@ bool mouse_handler::move_unit_along_current_route() const std::vector steps = current_route_.steps; // do not show footsteps during movement - gui().set_route(NULL); + gui().set_route(nullptr); gui().unhighlight_reach(); // do not keep the hex highlighted that we started from @@ -927,7 +926,7 @@ void mouse_handler::save_whiteboard_attack(const map_location& attacker_loc, con gui().clear_attack_indicator(); // remove footsteps if any - useless for whiteboard as of now - gui().set_route(NULL); + gui().set_route(nullptr); // do not keep the hex that we started from highlighted selected_hex_ = map_location(); @@ -1171,7 +1170,7 @@ void mouse_handler::set_current_paths(const pathfind::paths & new_paths) { gui().unhighlight_reach(); current_paths_ = new_paths; current_route_.steps.clear(); - gui().set_route(NULL); + gui().set_route(nullptr); pc_.get_whiteboard()->erase_temp_move(); } @@ -1187,5 +1186,5 @@ team & mouse_handler::current_team() { return pc_.gamestate().board_.teams_[side_num_ - 1]; } -mouse_handler *mouse_handler::singleton_ = NULL; +mouse_handler *mouse_handler::singleton_ = nullptr; } diff --git a/src/mouse_handler_base.cpp b/src/mouse_handler_base.cpp index f0c6fdc5c86f..63cc2710fbf2 100644 --- a/src/mouse_handler_base.cpp +++ b/src/mouse_handler_base.cpp @@ -94,7 +94,7 @@ bool mouse_handler_base::mouse_motion_default(int x, int y, bool /*update*/) //if the game is run in a window, we could miss a LMB/MMB up event // if it occurs outside our window. // thus, we need to check if the LMB/MMB is still down - minimap_scrolling_ = ((SDL_GetMouseState(NULL,NULL) & (SDL_BUTTON(1) | SDL_BUTTON(2))) != 0); + minimap_scrolling_ = ((SDL_GetMouseState(nullptr,nullptr) & (SDL_BUTTON(1) | SDL_BUTTON(2))) != 0); if(minimap_scrolling_) { const map_location& loc = gui().minimap_location_on(x,y); if(loc.valid()) { @@ -308,7 +308,7 @@ bool mouse_handler_base::right_click(int x, int y, const bool browse) if (right_click_show_menu(x, y, browse)) { gui().draw(); // redraw highlight (and maybe some more) const theme::menu* const m = gui().get_theme().context_menu(); - if (m != NULL) { + if (m != nullptr) { show_menu_ = true; } else { WRN_DP << "no context menu found..." << std::endl; diff --git a/src/movetype.cpp b/src/movetype.cpp index 7dccf959b6c5..0e83b4e8dc1d 100644 --- a/src/movetype.cpp +++ b/src/movetype.cpp @@ -63,12 +63,12 @@ struct movetype::terrain_info::parameters int max_value; /// The largest allowable value. int default_value; /// The default value (if no data is available). - int (*eval)(int); /// Converter for values taken from a config. May be NULL. + int (*eval)(int); /// Converter for values taken from a config. May be nullptr. bool use_move; /// Whether to look at underlying movement or defense terrains. bool high_is_good; /// Whether we are looking for highest or lowest (unless inverted by the underlying terrain). - parameters(int min, int max, int (*eval_fun)(int)=NULL, bool move=true, bool high=false) : + parameters(int min, int max, int (*eval_fun)(int)=nullptr, bool move=true, bool high=false) : min_value(min), max_value(max), default_value(high ? min : max), eval(eval_fun), use_move(move), high_is_good(high) {} @@ -248,7 +248,7 @@ void movetype::terrain_info::data::write( * @param[out] out_cfg The config that will receive the data. * @param[in] child_name If not empty, create and write to a child config with this tag. * This *will* be created even if there is no data to write. - * @param[in] fallback If not NULL, its data will be merged with ours for the write. + * @param[in] fallback If not nullptr, its data will be merged with ours for the write. */ void movetype::terrain_info::data::write( config & out_cfg, const std::string & child_name, const terrain_info * fallback) const @@ -306,10 +306,10 @@ int movetype::terrain_info::data::calc_value( if (const config::attribute_value *val = cfg_.get(id)) { // Read the value from our config. result = val->to_int(params_.default_value); - if ( params_.eval != NULL ) + if ( params_.eval != nullptr ) result = params_.eval(result); } - else if ( fallback != NULL ) { + else if ( fallback != nullptr ) { // Get the value from our fallback. result = fallback->value(terrain); } @@ -699,9 +699,9 @@ void movetype::resistances::write(config & out_cfg, const std::string & child_na * Default constructor */ movetype::movetype() : - movement_(NULL, &vision_), // This is not access before initialization; the address is merely stored at this point. + movement_(nullptr, &vision_), // This is not access before initialization; the address is merely stored at this point. vision_(&movement_, &jamming_), // This is not access before initialization; the address is merely stored at this point. - jamming_(&vision_, NULL), + jamming_(&vision_, nullptr), defense_(), resist_(), flying_(false) @@ -713,9 +713,9 @@ movetype::movetype() : * Constructor from a config */ movetype::movetype(const config & cfg) : - movement_(cfg.child_or_empty("movement_costs"), NULL, &vision_), // This is not access before initialization; the address is merely stored at this point. + movement_(cfg.child_or_empty("movement_costs"), nullptr, &vision_), // This is not access before initialization; the address is merely stored at this point. vision_(cfg.child_or_empty("vision_costs"), &movement_, &jamming_), // This is not access before initialization; the address is merely stored at this point. - jamming_(cfg.child_or_empty("jamming_costs"), &vision_, NULL), + jamming_(cfg.child_or_empty("jamming_costs"), &vision_, nullptr), defense_(cfg.child_or_empty("defense")), resist_(cfg.child_or_empty("resistance")), flying_(cfg["flies"].to_bool(false)) @@ -727,9 +727,9 @@ movetype::movetype(const config & cfg) : * Copy constructor */ movetype::movetype(const movetype & that) : - movement_(that.movement_, NULL, &vision_), // This is not access before initialization; the address is merely stored at this point. + movement_(that.movement_, nullptr, &vision_), // This is not access before initialization; the address is merely stored at this point. vision_(that.vision_, &movement_, &jamming_), // This is not access before initialization; the address is merely stored at this point. - jamming_(that.jamming_, &vision_, NULL), + jamming_(that.jamming_, &vision_, nullptr), defense_(that.defense_), resist_(that.resist_), flying_(that.flying_) diff --git a/src/movetype.hpp b/src/movetype.hpp index 04358b76975e..1503b2f46f0e 100644 --- a/src/movetype.hpp +++ b/src/movetype.hpp @@ -39,14 +39,14 @@ class movetype struct parameters; explicit terrain_info(const parameters & params, - const terrain_info * fallback=NULL, - const terrain_info * cascade=NULL); + const terrain_info * fallback=nullptr, + const terrain_info * cascade=nullptr); terrain_info(const config & cfg, const parameters & params, - const terrain_info * fallback=NULL, - const terrain_info * cascade=NULL); + const terrain_info * fallback=nullptr, + const terrain_info * cascade=nullptr); terrain_info(const terrain_info & that, - const terrain_info * fallback=NULL, - const terrain_info * cascade=NULL); + const terrain_info * fallback=nullptr, + const terrain_info * cascade=nullptr); ~terrain_info(); terrain_info & operator=(const terrain_info & that); @@ -72,7 +72,7 @@ class movetype void make_unique_fallback() const; private: - boost::shared_ptr data_; /// Never NULL + boost::shared_ptr data_; /// Never nullptr mutable boost::shared_ptr merged_data_; /// Created as needed. const terrain_info * const fallback_; const terrain_info * const cascade_; @@ -89,18 +89,18 @@ class movetype { static const parameters params_; public: - explicit terrain_costs(const terrain_costs * fallback=NULL, - const terrain_costs * cascade=NULL) : + explicit terrain_costs(const terrain_costs * fallback=nullptr, + const terrain_costs * cascade=nullptr) : terrain_info(params_, fallback, cascade) {} explicit terrain_costs(const config & cfg, - const terrain_costs * fallback=NULL, - const terrain_costs * cascade=NULL) : + const terrain_costs * fallback=nullptr, + const terrain_costs * cascade=nullptr) : terrain_info(cfg, params_, fallback, cascade) {} terrain_costs(const terrain_costs & that, - const terrain_costs * fallback=NULL, - const terrain_costs * cascade=NULL) : + const terrain_costs * fallback=nullptr, + const terrain_costs * cascade=nullptr) : terrain_info(that, fallback, cascade) {} diff --git a/src/nacl/plugin.cc b/src/nacl/plugin.cc index fcea550afc1f..066dae658a36 100644 --- a/src/nacl/plugin.cc +++ b/src/nacl/plugin.cc @@ -64,7 +64,7 @@ class PluginInstance : public pp::Instance { ~PluginInstance() { if (sdl_main_thread_) { - pthread_join(sdl_main_thread_, NULL); + pthread_join(sdl_main_thread_, nullptr); } } @@ -85,7 +85,7 @@ class PluginInstance : public pp::Instance { // Perhaps it must be called from the main thread? int lval = SDL_Init(SDL_INIT_AUDIO); assert(lval >= 0); - if (0 == pthread_create(&sdl_main_thread_, NULL, sdl_thread_static, this)) { + if (0 == pthread_create(&sdl_main_thread_, nullptr, sdl_thread_static, this)) { sdl_thread_started_ = true; } } @@ -182,10 +182,10 @@ class PluginInstance : public pp::Instance { // Finally, launch the game. char res_s[100]; snprintf(res_s, sizeof(res_s), "%dx%d", width_, height_); - static char const * argv[] = {"wesnoth", "-r", res_s, NULL}; + static char const * argv[] = {"wesnoth", "-r", res_s, nullptr}; printf("starting game thread: %s\n", res_s); wesnoth_main(sizeof(argv) / sizeof(*argv) - 1, (char**)argv); - return NULL; + return nullptr; } class ProgressHandler : public HTTP2ProgressHandler { diff --git a/src/network.cpp b/src/network.cpp index a870be2ee22a..bea6080af17f 100644 --- a/src/network.cpp +++ b/src/network.cpp @@ -157,7 +157,7 @@ static void check_timeout() last_ping = 0; return; } - const time_t& now = time(NULL); + const time_t& now = time(nullptr); DBG_NW << "Last ping: '" << last_ping << "' Current time: '" << now << "' Time since last ping: " << now - last_ping << "s\n"; // Reset last_ping if we didn't check for the last 10s. @@ -203,7 +203,7 @@ TCPsocket server_socket; std::deque disconnection_queue; std::set bad_sockets; -network_worker_pool::manager* worker_pool_man = NULL; +network_worker_pool::manager* worker_pool_man = nullptr; } // end anon namespace @@ -267,7 +267,7 @@ manager::~manager() if(free_) { disconnect(); delete worker_pool_man; - worker_pool_man = NULL; + worker_pool_man = nullptr; SDLNet_FreeSocketSet(socket_set); socket_set = 0; waiting_sockets.clear(); @@ -342,7 +342,7 @@ void server_manager::stop() bool server_manager::is_running() const { - return server_socket != NULL; + return server_socket != nullptr; } size_t nconnections() @@ -394,7 +394,7 @@ namespace { void connect_operation::run() { - char* const hostname = host_.empty() ? NULL : const_cast(host_.c_str()); + char* const hostname = host_.empty() ? nullptr : const_cast(host_.c_str()); IPaddress ip; if(SDLNet_ResolveHost(&ip,hostname,port_) == -1) { error_ = N_("Could not connect to host."); @@ -403,7 +403,7 @@ void connect_operation::run() TCPsocket sock = SDLNet_TCP_Open(&ip); if(!sock) { - error_ = hostname == NULL + error_ = hostname == nullptr ? "Could not bind to port" : N_("Could not connect to host."); return; @@ -442,7 +442,7 @@ void connect_operation::run() #endif // If this is a server socket - if(hostname == NULL) { + if(hostname == nullptr) { const threading::lock l(get_mutex()); connect_ = create_connection(sock,"",port_); return; @@ -786,7 +786,7 @@ connection receive_data(config& cfg, connection connection_num, bandwidth_in_ptr sock = network_worker_pool::get_received_data(sock,cfg, *bandwidth_in); } catch(const config::error& e) { TCPsocket const * err_sock = boost::get_error_info(e); - if(err_sock == NULL) + if(err_sock == nullptr) throw; connection err_connection = 0; for(connection_map::const_iterator i = connections.begin(); i != connections.end(); ++i) { @@ -799,7 +799,7 @@ connection receive_data(config& cfg, connection connection_num, bandwidth_in_ptr } throw; } - if (sock == NULL) { + if (sock == nullptr) { if (!is_server() && last_ping != 0 && ping_timeout != 0) { if (connection_num == 0) @@ -836,7 +836,7 @@ connection receive_data(config& cfg, connection connection_num, bandwidth_in_ptr assert(result != 0); waiting_sockets.insert(result); if(!is_server()) { - const time_t& now = time(NULL); + const time_t& now = time(nullptr); if (cfg.has_attribute("ping")) { LOG_NW << "Lag: " << (now - lexical_cast(cfg["ping"])) << "\n"; last_ping = now; @@ -903,7 +903,7 @@ connection receive_data(std::vector& buf, bandwidth_in_ptr* bandwidth_in) TCPsocket sock = network_worker_pool::get_received_data(buf); - if (sock == NULL) { + if (sock == nullptr) { return 0; } @@ -1178,7 +1178,7 @@ std::string ip_address(connection connection_num) { std::stringstream str; const IPaddress* const ip = SDLNet_TCP_GetPeerAddress(get_socket(connection_num)); - if(ip != NULL) { + if(ip != nullptr) { const unsigned char* buf = reinterpret_cast(&ip->host); for(int i = 0; i != sizeof(ip->host); ++i) { str << int(buf[i]); diff --git a/src/network_worker.cpp b/src/network_worker.cpp index 151f1decfd87..6a23cb4f2cbe 100644 --- a/src/network_worker.cpp +++ b/src/network_worker.cpp @@ -147,8 +147,8 @@ socket_stats_map transfer_stats; // stats_mutex int socket_errors[NUM_SHARDS]; threading::mutex* shard_mutexes[NUM_SHARDS]; -threading::mutex* stats_mutex = NULL; -threading::mutex* received_mutex = NULL; +threading::mutex* stats_mutex = nullptr; +threading::mutex* received_mutex = nullptr; threading::condition* cond[NUM_SHARDS]; std::map threads[NUM_SHARDS]; @@ -260,7 +260,7 @@ bool receive_with_timeout(TCPsocket s, char* buf, size_t nbytes, struct timeval tv; tv.tv_sec = select_timeout/1000; tv.tv_usec = select_timeout % 1000 * 1000; - retval = select(((_TCPsocket*)s)->channel + 1, &readfds, NULL, NULL, &tv); + retval = select(((_TCPsocket*)s)->channel + 1, &readfds, nullptr, nullptr, &tv); DBG_NW << "select retval: " << retval << ", timeout idle " << timeout_ms << " total " << total_timeout_ms << " (ms)\n"; if(retval == 0) { @@ -417,7 +417,7 @@ static SOCKET_STATE send_buffer(TCPsocket sock, std::vector& buf, int in_s tv.tv_usec = 0; do { - retval = select(((_TCPsocket*)sock)->channel + 1, NULL, &writefds, NULL, &tv); + retval = select(((_TCPsocket*)sock)->channel + 1, nullptr, &writefds, nullptr, &tv); } while(retval == -1 && errno == EINTR); if(retval > 0) @@ -624,10 +624,10 @@ static int process_queue(void* shard_num) DBG_NW << "thread started...\n"; for(;;) { - //if we find a socket to send data to, sent_buf will be non-NULL. If we find a socket - //to receive data from, sent_buf will be NULL. 'sock' will always refer to the socket + //if we find a socket to send data to, sent_buf will be non-nullptr. If we find a socket + //to receive data from, sent_buf will be nullptr. 'sock' will always refer to the socket //that data is being sent to/received from - TCPsocket sock = NULL; + TCPsocket sock = nullptr; buffer* sent_buf = 0; { @@ -661,7 +661,7 @@ static int process_queue(void* shard_num) } } - if(sock == NULL) { + if(sock == nullptr) { receive_list::iterator itor = pending_receives[shard].begin(), itor_end = pending_receives[shard].end(); for(; itor != itor_end; ++itor) { socket_state_map::iterator lock_it = sockets_locked[shard].find(*itor); @@ -675,7 +675,7 @@ static int process_queue(void* shard_num) } } - if(sock != NULL) { + if(sock != nullptr) { break; } @@ -816,9 +816,9 @@ manager::~manager() // Have to clean up to_clear so no bogus clearing of threads to_clear[shard].clear(); delete cond[shard]; - cond[shard] = NULL; + cond[shard] = nullptr; delete shard_mutexes[shard]; - shard_mutexes[shard] = NULL; + shard_mutexes[shard] = nullptr; } delete stats_mutex; @@ -880,7 +880,7 @@ TCPsocket get_received_data(TCPsocket sock, config& cfg, network::bandwidth_in_p assert(!raw_data_only); const threading::lock lock_received(*received_mutex); received_queue::iterator itor = received_data_queue.begin(); - if(sock != NULL) { + if(sock != nullptr) { for(; itor != received_data_queue.end(); ++itor) { if((*itor)->sock == sock) { break; @@ -889,7 +889,7 @@ TCPsocket get_received_data(TCPsocket sock, config& cfg, network::bandwidth_in_p } if(itor == received_data_queue.end()) { - return NULL; + return nullptr; } else if (!(*itor)->config_error.empty()){ // throw the error in parent thread std::string error = (*itor)->config_error; @@ -914,7 +914,7 @@ TCPsocket get_received_data(std::vector& out) assert(raw_data_only); const threading::lock lock_received(*received_mutex); if(received_data_queue.empty()) { - return NULL; + return nullptr; } buffer* buf = received_data_queue.front(); diff --git a/src/pathfind/astarsearch.cpp b/src/pathfind/astarsearch.cpp index 661ba42882e2..6e9603a16306 100644 --- a/src/pathfind/astarsearch.cpp +++ b/src/pathfind/astarsearch.cpp @@ -148,7 +148,7 @@ plain_route a_star_search(const map_location& src, const map_location& dst, //----------------- PRE_CONDITIONS ------------------ assert(src.valid(width, height, border)); assert(dst.valid(width, height, border)); - assert(calc != NULL); + assert(calc != nullptr); assert(stop_at <= calc->getNoPathValue()); //--------------------------------------------------- diff --git a/src/pathfind/pathfind.cpp b/src/pathfind/pathfind.cpp index 86b2bab47a4e..378e2fd4c700 100644 --- a/src/pathfind/pathfind.cpp +++ b/src/pathfind/pathfind.cpp @@ -123,7 +123,7 @@ map_location find_vacant_tile(const map_location& loc, VACANT_TILE_TYPE vacancy, map_location find_vacant_castle(const unit & leader) { return find_vacant_tile(leader.get_location(), VACANT_CASTLE, - NULL, &(*resources::teams)[leader.side()-1]); + nullptr, &(*resources::teams)[leader.side()-1]); } @@ -244,24 +244,24 @@ namespace { * destinations. (It is permissible for this to contain * some hexes that are also in destinations.) * - * @param[in] teleporter If not NULL, teleportaion will be considered, using + * @param[in] teleporter If not nullptr, teleportaion will be considered, using * this unit's abilities. - * @param[in] current_team If not NULL, enemies of this team can obstruct routes + * @param[in] current_team If not nullptr, enemies of this team can obstruct routes * both by occupying hexes and by exerting zones of control. * In addition, the presence of units can affect * teleportation options. - * @param[in] skirmisher If not NULL, use this to determine where ZoC can and + * @param[in] skirmisher If not nullptr, use this to determine where ZoC can and * cannot be ignored (due to this unit having or not * having the skirmisher ability). - * If NULL, then ignore all zones of control. - * (No effect if current_team is NULL). - * @param[in] viewing_team If not NULL, use this team's vision when detecting + * If nullptr, then ignore all zones of control. + * (No effect if current_team is nullptr). + * @param[in] viewing_team If not nullptr, use this team's vision when detecting * enemy units and teleport destinations. - * If NULL, then "see all". - * (No effect if teleporter and current_team are both NULL.) + * If nullptr, then "see all". + * (No effect if teleporter and current_team are both nullptr.) * @param[in] jamming_map The relevant "jamming" of the costs being used * (currently only used with vision costs). - * @param[out] full_cost_map If not NULL, build a cost_map instead of destinations. + * @param[out] full_cost_map If not nullptr, build a cost_map instead of destinations. * Destinations is ignored. * full_cost_map is a vector of pairs. The first entry is the * cost itself, the second how many units already visited this hex @@ -272,20 +272,20 @@ static void find_routes( paths::dest_vect & destinations, std::set * edges, const unit * teleporter, const team * current_team, const unit * skirmisher, const team * viewing_team, - const std::map * jamming_map=NULL, - std::vector > * full_cost_map=NULL) + const std::map * jamming_map=nullptr, + std::vector > * full_cost_map=nullptr) { const gamemap& map = resources::gameboard->map(); - const bool see_all = viewing_team == NULL; + const bool see_all = viewing_team == nullptr; // When see_all is true, the viewing team never matters, but we still // need to supply one to some functions. - if ( viewing_team == NULL ) + if ( viewing_team == nullptr ) viewing_team = &resources::teams->front(); // Build a teleport map, if needed. const teleport_map teleports = teleporter ? - get_teleport_locations(*teleporter, *viewing_team, see_all, current_team == NULL) : + get_teleport_locations(*teleporter, *viewing_team, see_all, current_team == nullptr) : teleport_map(); // Since this is called so often, keep memory reserved for the node list. @@ -307,7 +307,7 @@ static void find_routes( // If not, ignore it. If yes, initialize the start position. if ( full_cost_map ) { if ( full_cost_map->size() != static_cast(map.w() * map.h()) ) - full_cost_map = NULL; + full_cost_map = nullptr; else { if ( (*full_cost_map)[index(origin)].second == 0 ) (*full_cost_map)[index(origin)].first = 0; @@ -350,7 +350,7 @@ static void find_routes( const int next_index = index(next_hex); if ( next_index < 0 ) { // Off the map. - if ( edges != NULL ) + if ( edges != nullptr ) edges->insert(next_hex); continue; } @@ -386,7 +386,7 @@ static void find_routes( } if ( next.moves_left < 0 || next.turns_left < 0 ) { // Either can never enter this hex or out of turns. - if ( edges != NULL ) + if ( edges != nullptr ) edges->insert(next_hex); continue; } @@ -396,7 +396,7 @@ static void find_routes( const unit *v = resources::gameboard->get_visible_unit(next_hex, *viewing_team, see_all); if ( v && current_team->is_enemy(v->side()) ) { // Cannot enter enemy hexes. - if ( edges != NULL ) + if ( edges != nullptr ) edges->insert(next_hex); continue; } @@ -539,11 +539,11 @@ paths::paths(const unit& u, bool force_ignore_zoc, find_routes(u.get_location(), u.movement_type().get_movement(), u.get_state(unit::STATE_SLOWED), u.movement_left(), - u.total_movement(), additional_turns, destinations, NULL, - allow_teleport ? &u : NULL, - ignore_units ? NULL : &teams[u.side()-1], - force_ignore_zoc ? NULL : &u, - see_all ? NULL : &viewing_team); + u.total_movement(), additional_turns, destinations, nullptr, + allow_teleport ? &u : nullptr, + ignore_units ? nullptr : &teams[u.side()-1], + force_ignore_zoc ? nullptr : &u, + see_all ? nullptr : &viewing_team); } /** @@ -570,11 +570,11 @@ vision_path::vision_path(const unit& viewer, map_location const &loc, { const int sight_range = viewer.vision(); - // The four NULL parameters indicate (in order): no teleports, + // The four nullptr parameters indicate (in order): no teleports, // ignore units, ignore ZoC (no effect), and see all (no effect). find_routes(loc, viewer.movement_type().get_vision(), viewer.get_state(unit::STATE_SLOWED), sight_range, sight_range, - 0, destinations, &edges, NULL, NULL, NULL, NULL, &jamming_map); + 0, destinations, &edges, nullptr, nullptr, nullptr, nullptr, &jamming_map); } /** @@ -593,10 +593,10 @@ vision_path::vision_path(const movetype::terrain_costs & view_costs, bool slowed const std::map& jamming_map) : paths(), edges() { - // The four NULL parameters indicate (in order): no teleports, + // The four nullptr parameters indicate (in order): no teleports, // ignore units, ignore ZoC (no effect), and see all (no effect). find_routes(loc, view_costs, slowed, sight_range, sight_range, 0, - destinations, &edges, NULL, NULL, NULL, NULL, &jamming_map); + destinations, &edges, nullptr, nullptr, nullptr, nullptr, &jamming_map); } /// Default destructor @@ -619,11 +619,11 @@ jamming_path::jamming_path(const unit& jammer, map_location const &loc) { const int jamming_range = jammer.jamming(); - // The five NULL parameters indicate (in order): no edges, no teleports, + // The five nullptr parameters indicate (in order): no edges, no teleports, // ignore units, ignore ZoC (no effect), and see all (no effect). find_routes(loc, jammer.movement_type().get_jamming(), jammer.get_state(unit::STATE_SLOWED), jamming_range, jamming_range, - 0, destinations, NULL, NULL, NULL, NULL, NULL); + 0, destinations, nullptr, nullptr, nullptr, nullptr, nullptr); } /// Default destructor @@ -891,12 +891,12 @@ void full_cost_map::add_unit(const unit& u, bool use_max_moves) find_routes(u.get_location(), u.movement_type().get_movement(), u.get_state(unit::STATE_SLOWED), (use_max_moves) ? u.total_movement() : u.movement_left(), - u.total_movement(), 99, dummy, NULL, - allow_teleport_ ? &u : NULL, - ignore_units_ ? NULL : &teams[u.side()-1], - force_ignore_zoc_ ? NULL : &u, - see_all_ ? NULL : &viewing_team_, - NULL, &cost_map); + u.total_movement(), 99, dummy, nullptr, + allow_teleport_ ? &u : nullptr, + ignore_units_ ? nullptr : &teams[u.side()-1], + force_ignore_zoc_ ? nullptr : &u, + see_all_ ? nullptr : &viewing_team_, + nullptr, &cost_map); } /** diff --git a/src/pathfind/pathfind.hpp b/src/pathfind/pathfind.hpp index f63ae0f21987..edd5c4f3c073 100644 --- a/src/pathfind/pathfind.hpp +++ b/src/pathfind/pathfind.hpp @@ -42,9 +42,9 @@ enum VACANT_TILE_TYPE { VACANT_CASTLE, VACANT_ANY }; /// to @a loc as possible, but which is unoccupied by any units. map_location find_vacant_tile(const map_location& loc, VACANT_TILE_TYPE vacancy=VACANT_ANY, - const unit* pass_check=NULL, - const team* shroud_check=NULL, - const game_board* board=NULL); + const unit* pass_check=nullptr, + const team* shroud_check=nullptr, + const game_board* board=nullptr); /// Wrapper for find_vacant_tile() when looking for a vacant castle tile /// near a leader. map_location find_vacant_castle(const unit & leader); @@ -193,7 +193,7 @@ struct marked_route plain_route a_star_search(map_location const &src, map_location const &dst, double stop_at, const cost_calculator* costCalculator, const size_t parWidth, const size_t parHeight, - const teleport_map* teleports = NULL, bool border = false); + const teleport_map* teleports = nullptr, bool border = false); /** * Add marks on a route @a rt assuming that the unit located at the first hex of diff --git a/src/persist_context.cpp b/src/persist_context.cpp index 8dbf8e6dadbb..382799fbf7fc 100644 --- a/src/persist_context.cpp +++ b/src/persist_context.cpp @@ -66,7 +66,7 @@ bool persist_file_context::clear_var(const std::string &global, bool immediate) load(); } config *active = get_node(cfg_, namespace_); - if (active == NULL) + if (active == nullptr) return false; bool ret = active->has_child("variables"); @@ -115,7 +115,7 @@ bool persist_file_context::clear_var(const std::string &global, bool immediate) ret = save_context(); cfg_ = bak; active = get_node(cfg_, namespace_); - if (active != NULL) { + if (active != nullptr) { active->clear_children("variables"); active->remove_attribute("variables"); if (!bactive.empty()) @@ -128,7 +128,7 @@ bool persist_file_context::clear_var(const std::string &global, bool immediate) if (immediate) { cfg_ = bak; config *active = get_node(cfg_, namespace_); - if (active != NULL) { + if (active != nullptr) { active->clear_children("variables"); active->remove_attribute("variables"); if (!bactive.empty()) @@ -146,7 +146,7 @@ bool persist_file_context::clear_var(const std::string &global, bool immediate) while (active && active->empty() && !namespace_.lineage_.empty()) { name_space prev = namespace_.prev(); active = get_node(cfg_, prev); - if (active == NULL) { + if (active == nullptr) { break; } active->clear_children(namespace_.node_); diff --git a/src/persist_context.hpp b/src/persist_context.hpp index 584e3c05414c..bf5bfa045797 100644 --- a/src/persist_context.hpp +++ b/src/persist_context.hpp @@ -126,7 +126,7 @@ class persist_context { else if (cfg.has_child(next.root_)) return get_node(cfg.child(next.root_), next); else - return NULL; + return nullptr; } else return &cfg; @@ -138,7 +138,7 @@ class persist_context { if (cfg.has_child(next.root_)) return get_node(cfg.child(next.root_), next); else - return NULL; + return nullptr; } else return &cfg; diff --git a/src/play_controller.cpp b/src/play_controller.cpp index 8cf181213c44..dcab465da53d 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -125,24 +125,24 @@ static void copy_persistent(const config& src, config& dst) static void clear_resources() { - resources::controller = NULL; - resources::filter_con = NULL; - resources::gameboard = NULL; - resources::gamedata = NULL; - resources::game_events = NULL; - resources::lua_kernel = NULL; - resources::persist = NULL; - resources::screen = NULL; - resources::soundsources = NULL; - resources::teams = NULL; - resources::tod_manager = NULL; - resources::tunnels = NULL; - resources::undo_stack = NULL; - resources::recorder = NULL; - resources::units = NULL; + resources::controller = nullptr; + resources::filter_con = nullptr; + resources::gameboard = nullptr; + resources::gamedata = nullptr; + resources::game_events = nullptr; + resources::lua_kernel = nullptr; + resources::persist = nullptr; + resources::screen = nullptr; + resources::soundsources = nullptr; + resources::teams = nullptr; + resources::tod_manager = nullptr; + resources::tunnels = nullptr; + resources::undo_stack = nullptr; + resources::recorder = nullptr; + resources::units = nullptr; resources::whiteboard.reset(); - resources::classification = NULL; - resources::mp_settings = NULL; + resources::classification = nullptr; + resources::mp_settings = nullptr; } play_controller::play_controller(const config& level, saved_game& state_of_game, @@ -162,8 +162,8 @@ play_controller::play_controller(const config& level, saved_game& state_of_game, , plugins_context_() , labels_manager_() , help_manager_(&game_config) - , mouse_handler_(NULL, *this) - , menu_handler_(NULL, *this, game_config) + , mouse_handler_(nullptr, *this) + , menu_handler_(nullptr, *this, game_config) , hotkey_handler_(new hotkey_handler(*this, saved_game_)) , soundsources_manager_() , persist_() @@ -315,16 +315,16 @@ void play_controller::init(CVideo& video, const config& level) void play_controller::reset_gamestate(const config& level, int replay_pos) { - resources::gameboard = NULL; - resources::gamedata = NULL; - resources::teams = NULL; - resources::tod_manager = NULL; - resources::units = NULL; - resources::filter_con = NULL; - resources::lua_kernel = NULL; - resources::game_events = NULL; - resources::tunnels = NULL; - resources::undo_stack = NULL; + resources::gameboard = nullptr; + resources::gamedata = nullptr; + resources::teams = nullptr; + resources::tod_manager = nullptr; + resources::units = nullptr; + resources::filter_con = nullptr; + resources::lua_kernel = nullptr; + resources::game_events = nullptr; + resources::tunnels = nullptr; + resources::undo_stack = nullptr; gamestate_.reset(new game_state(level, *this, tdata_)); resources::gameboard = &gamestate().board_; diff --git a/src/play_controller.hpp b/src/play_controller.hpp index e76fbba2168a..1778a834a0bb 100644 --- a/src/play_controller.hpp +++ b/src/play_controller.hpp @@ -136,7 +136,7 @@ class play_controller : public controller_base, public events::observer, public gamestate().end_level_data_ = boost::none; } bool is_regular_game_end() const { - return gamestate().end_level_data_.get_ptr() != NULL; + return gamestate().end_level_data_.get_ptr() != nullptr; } const end_level_data& get_end_level_data_const() const { return *gamestate().end_level_data_; diff --git a/src/playmp_controller.cpp b/src/playmp_controller.cpp index 910dbb563fb4..752b88c90c88 100644 --- a/src/playmp_controller.cpp +++ b/src/playmp_controller.cpp @@ -407,7 +407,7 @@ bool playmp_controller::is_host() const void playmp_controller::do_idle_notification() { - gui_->get_chat_manager().add_chat_message(time(NULL), "", 0, + gui_->get_chat_manager().add_chat_message(time(nullptr), "", 0, _("This side is in an idle state. To proceed with the game, it must be assigned to another controller. You may use :droid, :control or :give_control for example."), events::chat_handler::MESSAGE_PUBLIC, false); } diff --git a/src/playsingle_controller.cpp b/src/playsingle_controller.cpp index 0620a71d4f6d..3ea805b7cedc 100644 --- a/src/playsingle_controller.cpp +++ b/src/playsingle_controller.cpp @@ -227,7 +227,7 @@ LEVEL_RESULT playsingle_controller::play_scenario(const config& level) gui_->labels().read(level); // Read sound sources - assert(soundsources_manager_ != NULL); + assert(soundsources_manager_ != nullptr); BOOST_FOREACH(const config &s, level.child_range("sound_source")) { try { soundsource::sourcespec spec(s); @@ -361,7 +361,7 @@ void playsingle_controller::play_side_impl() if (!skip_next_turn_) { end_turn_ = END_TURN_NONE; } - if(replay_.get() != NULL) { + if(replay_.get() != nullptr) { REPLAY_RETURN res = replay_->play_side_impl(); if(res == REPLAY_FOUND_END_TURN) { end_turn_ = END_TURN_SYNCED; @@ -519,7 +519,7 @@ void playsingle_controller::end_turn_enable(bool enable) void playsingle_controller::after_human_turn() { // Clear moves from the GUI. - gui_->set_route(NULL); + gui_->set_route(nullptr); gui_->unhighlight_reach(); } @@ -576,7 +576,7 @@ void playsingle_controller::play_ai_turn() */ void playsingle_controller::do_idle_notification() { - gui_->get_chat_manager().add_chat_message(time(NULL), "Wesnoth", 0, + gui_->get_chat_manager().add_chat_message(time(nullptr), "Wesnoth", 0, "This side is in an idle state. To proceed with the game, the host must assign it to another controller.", events::chat_handler::MESSAGE_PUBLIC, false); } diff --git a/src/playsingle_controller.hpp b/src/playsingle_controller.hpp index d2a36a48a929..bb9be6d4f1c1 100644 --- a/src/playsingle_controller.hpp +++ b/src/playsingle_controller.hpp @@ -61,7 +61,7 @@ class playsingle_controller : public play_controller void set_player_type_changed() { player_type_changed_ = true; } virtual bool should_return_to_play_side(); replay_controller * get_replay_controller() { return replay_.get(); } - bool is_replay() { return get_replay_controller() != NULL; } + bool is_replay() { return get_replay_controller() != nullptr; } void enable_replay(bool is_unit_test = false); void on_replay_end(bool is_unit_test); protected: diff --git a/src/playturn.cpp b/src/playturn.cpp index 79801c1887d8..25ae9b9a0977 100644 --- a/src/playturn.cpp +++ b/src/playturn.cpp @@ -45,7 +45,7 @@ #include // for shared_ptr #include // for assert #include // for atoi -#include // for time, NULL +#include // for time #include // for operator<<, basic_ostream, etc #include // for vector @@ -105,7 +105,7 @@ turn_info::PROCESS_DATA_RESULT turn_info::handle_turn(const config& t) void turn_info::do_save() { - if (resources::controller != NULL) { + if (resources::controller != nullptr) { resources::controller->do_autosave(); } } @@ -139,13 +139,13 @@ turn_info::PROCESS_DATA_RESULT turn_info::process_network_data(const config& cfg if (const config &msg = cfg.child("message")) { - resources::screen->get_chat_manager().add_chat_message(time(NULL), msg["sender"], msg["side"], + resources::screen->get_chat_manager().add_chat_message(time(nullptr), msg["sender"], msg["side"], msg["message"], events::chat_handler::MESSAGE_PUBLIC, preferences::message_bell()); } else if (const config &msg = cfg.child("whisper") /*&& is_observer()*/) { - resources::screen->get_chat_manager().add_chat_message(time(NULL), "whisper: " + msg["sender"].str(), 0, + resources::screen->get_chat_manager().add_chat_message(time(nullptr), "whisper: " + msg["sender"].str(), 0, msg["message"], events::chat_handler::MESSAGE_PRIVATE, preferences::message_bell()); } diff --git a/src/random_new.cpp b/src/random_new.cpp index 0ddbab6ca6ef..15770e976346 100644 --- a/src/random_new.cpp +++ b/src/random_new.cpp @@ -33,7 +33,7 @@ namespace { { public: rng_default() - : gen_(time(NULL)) + : gen_(time(nullptr)) { } protected: diff --git a/src/replay.cpp b/src/replay.cpp index dc61f6cff41f..d5aa937b7a23 100644 --- a/src/replay.cpp +++ b/src/replay.cpp @@ -139,7 +139,7 @@ static time_t get_time(const config &speak) else { //fallback in case sender uses wesnoth that doesn't send timestamps - time = ::time(NULL); + time = ::time(nullptr); } return time; } @@ -599,7 +599,7 @@ void replay::revert_action() config* replay::get_next_action() { if (at_end()) - return NULL; + return nullptr; LOG_REPLAY << "up to replay action " << base_->get_pos() + 1 << '/' << ncommands() << '\n'; @@ -688,7 +688,7 @@ REPLAY_RETURN do_replay_handle(bool one_move) DBG_REPLAY << "in do replay with is_synced=" << is_synced << "\n"; - if (cfg != NULL) + if (cfg != nullptr) { DBG_REPLAY << "Replay data:\n" << *cfg << "\n"; } diff --git a/src/replay_controller.hpp b/src/replay_controller.hpp index 4add7a3eb47a..a150755af78c 100644 --- a/src/replay_controller.hpp +++ b/src/replay_controller.hpp @@ -49,7 +49,7 @@ class replay_controller : public events::observer bool should_stop() const { return stop_condition_->should_stop(); } bool can_execute_command(const hotkey::hotkey_command& cmd, int index) const; bool is_controlling_view() const { return vision_.is_initialized(); } - bool allow_reset_replay() const { return reset_state_.get() != NULL; } + bool allow_reset_replay() const { return reset_state_.get() != nullptr; } const boost::shared_ptr& get_reset_state() { return reset_state_; }; void return_to_play_side(bool r = true) { return_to_play_side_ = r; } void replay_show_everything(); diff --git a/src/replay_helper.cpp b/src/replay_helper.cpp index 37bbeaae18b7..e05e9b1f9fd0 100644 --- a/src/replay_helper.cpp +++ b/src/replay_helper.cpp @@ -146,7 +146,7 @@ config replay_helper::get_event(const std::string& name, const map_location& loc config& source = ev.add_child("source"); loc.write(source); } - if(last_select_loc != NULL && last_select_loc->valid()) + if(last_select_loc != nullptr && last_select_loc->valid()) { config& source = ev.add_child("last_select"); last_select_loc->write(source); diff --git a/src/reports.cpp b/src/reports.cpp index 22f6448b428f..5a5b77eef8e2 100644 --- a/src/reports.cpp +++ b/src/reports.cpp @@ -867,7 +867,7 @@ static config unit_weapons(reports::context & rc, const unit *attacker, const ma for (unsigned int i = 0; i < attacker->attacks().size(); i++) { // skip weapons with attack_weight=0 if (attacker->attacks()[i].attack_weight() > 0) { - battle_context weapon(rc.units(), attacker_pos, defender->get_location(), i, -1, 0.0, NULL, attacker); + battle_context weapon(rc.units(), attacker_pos, defender->get_location(), i, -1, 0.0, nullptr, attacker); weapons.push_back(weapon); } } @@ -1525,7 +1525,7 @@ REPORT_GENERATOR(edit_left_button_function) REPORT_GENERATOR(report_clock, /*rc*/) { - time_t t = std::time(NULL); + time_t t = std::time(nullptr); struct tm *lt = std::localtime(&t); if (!lt) return config(); char temp[15]; diff --git a/src/resources.cpp b/src/resources.cpp index 0bbcc5e1552e..742a38c903e0 100644 --- a/src/resources.cpp +++ b/src/resources.cpp @@ -17,24 +17,24 @@ namespace resources { - game_board *gameboard = NULL; - play_controller *controller = NULL; - game_data *gamedata = NULL; - filter_context *filter_con = NULL; - game_events::manager *game_events = NULL; - game_lua_kernel *lua_kernel = NULL; - persist_manager *persist = NULL; - game_display *screen = NULL; - soundsource::manager *soundsources = NULL; - std::vector *teams = NULL; - replay *recorder = NULL; - ::tod_manager *tod_manager = NULL; - fake_unit_manager *fake_units = NULL; - pathfind::manager *tunnels = NULL; - actions::undo_list *undo_stack = NULL; - unit_map *units = NULL; + game_board *gameboard = nullptr; + play_controller *controller = nullptr; + game_data *gamedata = nullptr; + filter_context *filter_con = nullptr; + game_events::manager *game_events = nullptr; + game_lua_kernel *lua_kernel = nullptr; + persist_manager *persist = nullptr; + game_display *screen = nullptr; + soundsource::manager *soundsources = nullptr; + std::vector *teams = nullptr; + replay *recorder = nullptr; + ::tod_manager *tod_manager = nullptr; + fake_unit_manager *fake_units = nullptr; + pathfind::manager *tunnels = nullptr; + actions::undo_list *undo_stack = nullptr; + unit_map *units = nullptr; boost::shared_ptr whiteboard = boost::shared_ptr(); - game_classification *classification = NULL; - const mp_game_settings *mp_settings = NULL; + game_classification *classification = nullptr; + const mp_game_settings *mp_settings = nullptr; bool simulation_ = false; } diff --git a/src/save_blocker.cpp b/src/save_blocker.cpp index d298367210d1..c948d1a17b67 100644 --- a/src/save_blocker.cpp +++ b/src/save_blocker.cpp @@ -16,8 +16,8 @@ #include #include -play_controller* save_blocker::controller_ = NULL; -void (play_controller::*save_blocker::callback_)() = NULL; +play_controller* save_blocker::controller_ = nullptr; +void (play_controller::*save_blocker::callback_)() = nullptr; SDL_sem* save_blocker::sem_ = SDL_CreateSemaphore(1); save_blocker::save_blocker() { @@ -29,8 +29,8 @@ save_blocker::~save_blocker() { unblock(); if(controller_ && callback_) { (controller_->*callback_)(); - controller_ = NULL; - callback_ = NULL; + controller_ = nullptr; + callback_ = nullptr; } } catch (std::exception & e) { std::cerr << "Save blocker dtor swallowing an exception: " << e.what() << "\n"; diff --git a/src/save_index.cpp b/src/save_index.cpp index 2cbcaeb1f199..3f0b0ce068f6 100644 --- a/src/save_index.cpp +++ b/src/save_index.cpp @@ -297,7 +297,7 @@ void remove_old_auto_saves(const int autosavemax, const int infinite_auto_saves) if (countdown == infinite_auto_saves) return; - std::vector games = get_saves_list(NULL, &auto_save); + std::vector games = get_saves_list(nullptr, &auto_save); for (std::vector::iterator i = games.begin(); i != games.end(); ++i) { if (countdown-- <= 0) { LOG_SAVE << "Deleting savegame '" << i->name() << "'\n"; diff --git a/src/save_index.hpp b/src/save_index.hpp index e03c9bcefc3d..14b8804b3753 100644 --- a/src/save_index.hpp +++ b/src/save_index.hpp @@ -54,7 +54,7 @@ struct save_info_less_time { bool operator()(const save_info& a, const save_info& b) const; }; -std::vector get_saves_list(const std::string* dir = NULL, const std::string* filter = NULL); +std::vector get_saves_list(const std::string* dir = nullptr, const std::string* filter = nullptr); /** Read the complete config information out of a savefile. */ void read_save_file(const std::string& name, config& cfg, std::string* error_log); @@ -68,7 +68,7 @@ void delete_game(const std::string& name); class create_save_info { public: - create_save_info(const std::string* d = NULL) ; + create_save_info(const std::string* d = nullptr) ; save_info operator()(const std::string& filename) const ; const std::string dir; }; diff --git a/src/savegame.cpp b/src/savegame.cpp index 66e5ff6b7106..5ab31822284a 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -466,7 +466,7 @@ bool savegame::save_game(CVideo* video, const std::string& filename) before_save(); write_game_to_disk(filename_); - if (resources::persist != NULL) { + if (resources::persist != nullptr) { resources::persist->end_transaction(); resources::persist ->start_transaction(); } @@ -474,12 +474,12 @@ bool savegame::save_game(CVideo* video, const std::string& filename) end = SDL_GetTicks(); LOG_SAVE << "Milliseconds to save " << filename_ << ": " << end - start << std::endl; - if (video != NULL && show_confirmation_) + if (video != nullptr && show_confirmation_) gui2::show_transient_message(*video, _("Saved"), _("The game has been saved.")); return true; } catch(game::save_game_failed& e) { ERR_SAVE << error_message_ << e.message << std::endl; - if (video != NULL){ + if (video != nullptr){ gui2::show_error_message(*video, error_message_ + e.message); //do not bother retrying, since the user can just try to save the game again //maybe show a yes-no dialog for "disable autosaves now"? diff --git a/src/savegame.hpp b/src/savegame.hpp index 842845f02562..8ed508de1c6e 100644 --- a/src/savegame.hpp +++ b/src/savegame.hpp @@ -128,7 +128,7 @@ class savegame or error messages to appear, you have to provide the gui parameter. The return value denotes, if the save was successful or not. */ - bool save_game(CVideo* video = NULL, const std::string& filename = ""); + bool save_game(CVideo* video = nullptr, const std::string& filename = ""); /** Sets the filename and removes invalid characters. Don't set the filename directly but use this method instead. */ diff --git a/src/scoped_resource.hpp b/src/scoped_resource.hpp index 2c6459478b64..ddd323daf166 100644 --- a/src/scoped_resource.hpp +++ b/src/scoped_resource.hpp @@ -117,19 +117,19 @@ class scoped_resource /** * A helper policy for scoped_ptr. -* It will call the delete operator on a pointer, and assign the pointer to NULL +* It will call the delete operator on a pointer, and assign the pointer to nullptr */ struct delete_item { template - void operator()(T*& p) const { delete p; p = NULL; } + void operator()(T*& p) const { delete p; p = nullptr; } }; /** * A helper policy for scoped_array. -* It will call the delete[] operator on a pointer, and assign the pointer to NULL +* It will call the delete[] operator on a pointer, and assign the pointer to nullptr */ struct delete_array { template - void operator()(T*& p) const { delete [] p; p = NULL; } + void operator()(T*& p) const { delete [] p; p = nullptr; } }; /** @@ -185,7 +185,7 @@ struct scoped_array : public scoped_resource */ struct close_FILE { - void operator()(std::FILE* f) const { if(f != NULL) { std::fclose(f); } } + void operator()(std::FILE* f) const { if(f != nullptr) { std::fclose(f); } } }; typedef scoped_resource scoped_FILE; diff --git a/src/scripting/application_lua_kernel.cpp b/src/scripting/application_lua_kernel.cpp index 4fedf4a196c9..2d70423db1be 100644 --- a/src/scripting/application_lua_kernel.cpp +++ b/src/scripting/application_lua_kernel.cpp @@ -291,7 +291,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( } // Now we resume the function, calling the coroutine with the three arguments (events, context, info). - lua_resume(T_, NULL, 3); + lua_resume(T_, nullptr, 3); started_ = true; diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 266ebde035fe..3939125002b4 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -116,7 +116,7 @@ #include // boost::adaptors::filtered #include // for tuple #include // for assert -#include // for strcmp, NULL +#include // for strcmp #include // for distance, advance #include // for map, map<>::value_type, etc #include // for operator new @@ -182,7 +182,7 @@ void game_lua_kernel::log_error(char const * msg, char const * context) void game_lua_kernel::lua_chat(std::string const &caption, std::string const &msg) { if (game_display_) { - game_display_->get_chat_manager().add_chat_message(time(NULL), caption, 0, msg, + game_display_->get_chat_manager().add_chat_message(time(nullptr), caption, 0, msg, events::chat_handler::MESSAGE_PUBLIC, false); } } @@ -315,10 +315,10 @@ static int impl_unit_get(lua_State *L) if (strcmp(m, "upkeep") == 0) { unit::t_upkeep upkeep = u.upkeep_raw(); - if(boost::get(&upkeep) != NULL){ + if(boost::get(&upkeep) != nullptr){ lua_pushstring(L, "full"); } - if(boost::get(&upkeep) != NULL){ + if(boost::get(&upkeep) != nullptr){ lua_pushstring(L, "loyal"); } else { @@ -534,7 +534,7 @@ static int impl_unit_attacks_get(lua_State *L) if (!u && !ut) { return luaL_argerror(L, 1, "unknown unit"); } - const attack_type* attack = NULL; + const attack_type* attack = nullptr; const std::vector& attacks = u ? u->attacks() : ut->attacks(); if(!lua_isnumber(L,2)) { std::string attack_id = luaL_checkstring(L, 2); @@ -544,7 +544,7 @@ static int impl_unit_attacks_get(lua_State *L) break; } } - if (attack == NULL) { + if (attack == nullptr) { //return nil on invalid index, just like lua tables do. return 0; } @@ -1431,7 +1431,7 @@ int game_lua_kernel::intf_set_village_owner(lua_State *L) teams()[old_side - 1].lose_village(loc); } if (new_side) { - teams()[new_side - 1].get_village(loc, old_side, (luaW_toboolean(L, 4) ? &gamedata() : NULL) ); + teams()[new_side - 1].get_village(loc, old_side, (luaW_toboolean(L, 4) ? &gamedata() : nullptr) ); } return 0; } @@ -1775,7 +1775,7 @@ int game_lua_kernel::intf_find_path(lua_State *L) { int arg = 1; map_location src, dst; - const unit* u = NULL; + const unit* u = nullptr; if (lua_isuserdata(L, arg)) { @@ -1805,7 +1805,7 @@ int game_lua_kernel::intf_find_path(lua_State *L) int viewing_side = 0; bool ignore_units = false, see_all = false, ignore_teleport = false; double stop_at = 10000; - pathfind::cost_calculator *calc = NULL; + pathfind::cost_calculator *calc = nullptr; if (lua_istable(L, arg)) { @@ -1882,7 +1882,7 @@ int game_lua_kernel::intf_find_path(lua_State *L) int game_lua_kernel::intf_find_reach(lua_State *L) { int arg = 1; - const unit* u = NULL; + const unit* u = nullptr; if (lua_isuserdata(L, arg)) { @@ -2306,7 +2306,7 @@ int game_lua_kernel::intf_put_unit(lua_State *L) } int unit_arg = 1; - lua_unit *lu = NULL; + lua_unit *lu = nullptr; unit_ptr u = unit_ptr(); map_location loc; if (lua_isnumber(L, 1)) { @@ -2437,7 +2437,7 @@ int game_lua_kernel::intf_put_recall_unit(lua_State *L) if(map_locked_) { return luaL_error(L, "Attempted to move a unit while the map is locked"); } - lua_unit *lu = NULL; + lua_unit *lu = nullptr; unit_ptr u = unit_ptr(); int side = lua_tointeger(L, 2); if (unsigned(side) > teams().size()) side = 0; @@ -2762,8 +2762,8 @@ static void luaW_pushsimweapon(lua_State *L, const battle_context_unit_stats &bc //if we called simulate_combat without giving an explicit weapon this can be useful. lua_pushnumber(L, bcustats.attack_num); lua_setfield(L, -2, "attack_num"); - //this is NULL when there is no counter weapon - if(bcustats.weapon != NULL) + //this is nullptr when there is no counter weapon + if(bcustats.weapon != nullptr) { lua_pushstring(L, bcustats.weapon->id().c_str()); lua_setfield(L, -2, "name"); @@ -2805,7 +2805,7 @@ int game_lua_kernel::intf_simulate_combat(lua_State *L) } battle_context context(units(), att.get_location(), - def.get_location(), att_w, def_w, 0.0, NULL, &att); + def.get_location(), att_w, def_w, 0.0, nullptr, &att); luaW_pushsimdata(L, context.get_attacker_combatant()); luaW_pushsimdata(L, context.get_defender_combatant()); @@ -3927,11 +3927,11 @@ static int intf_debug_ai(lua_State *L) int side = lua_tointeger(L, 1); lua_pop(L, 1); - ai::component* c = ai::manager::get_active_ai_holder_for_side_dbg(side).get_component(NULL, ""); + ai::component* c = ai::manager::get_active_ai_holder_for_side_dbg(side).get_component(nullptr, ""); // Bad, but works std::vector engines = c->get_children("engine"); - ai::engine_lua* lua_engine = NULL; + ai::engine_lua* lua_engine = nullptr; for (std::vector::const_iterator i = engines.begin(); i != engines.end(); ++i) { if ((*i)->get_name() == "lua") @@ -3944,7 +3944,7 @@ static int intf_debug_ai(lua_State *L) //ai::component* e = ai::manager::get_active_ai_holder_for_side_dbg(side).get_component(c, "engine[lua]"); //ai::engine_lua* lua_engine = dynamic_cast(e); - if (lua_engine == NULL) + if (lua_engine == nullptr) { //no lua engine is defined for this side. //so set up a dummy engine @@ -4075,7 +4075,7 @@ namespace { { lua_State *L = mState; config cfg; - if (!luaW_getglobal(L, "wesnoth", "theme_items", name.c_str(), NULL)) + if (!luaW_getglobal(L, "wesnoth", "theme_items", name.c_str(), nullptr)) return cfg; if (!luaW_pcall(L, 0, 1)) return cfg; luaW_toconfig(L, -1, cfg); @@ -4149,7 +4149,7 @@ int game_lua_kernel::intf_teleport(lua_State *L) if (dst == u->get_location() || !resources::gameboard->map().on_board(dst)) { return 0; } - const map_location vacant_dst = find_vacant_tile(dst, pathfind::VACANT_ANY, check_passability ? u.get() : NULL); + const map_location vacant_dst = find_vacant_tile(dst, pathfind::VACANT_ANY, check_passability ? u.get() : nullptr); if (!resources::gameboard->map().on_board(vacant_dst)) { return 0; } @@ -4238,7 +4238,7 @@ int dispatch2(lua_State *L) { game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controller & pc, reports & reports_object) : lua_kernel_base(video) - , game_display_(NULL) + , game_display_(nullptr) , game_state_(gs) , play_controller_(pc) , reports_(reports_object) @@ -4363,10 +4363,10 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "view_locked", &dispatch<&game_lua_kernel::intf_view_locked > }, { "place_shroud", &dispatch2<&game_lua_kernel::intf_shroud_op, true > }, { "remove_shroud", &dispatch2<&game_lua_kernel::intf_shroud_op, false > }, - { NULL, NULL } + { nullptr, nullptr } }; lua_cpp::Reg const cpp_callbacks[] = { - { NULL, NULL } + {} }; lua_getglobal(L, "wesnoth"); if (!lua_istable(L,-1)) { @@ -4545,7 +4545,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { set_wml_action(handler.first, handler.second); } - luaW_getglobal(L, "wesnoth", "effects", NULL); + luaW_getglobal(L, "wesnoth", "effects", nullptr); BOOST_FOREACH(const std::string& effect, unit::builtin_effects) { lua_pushstring(L, effect.c_str()); push_builtin_effect(); @@ -4677,7 +4677,7 @@ void game_lua_kernel::load_game(const config& level) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_load", NULL)) + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_load", nullptr)) return; lua_newtable(L); @@ -4704,7 +4704,7 @@ void game_lua_kernel::save_game(config &cfg) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_save", NULL)) + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_save", nullptr)) return; if (!luaW_pcall(L, 0, 1, false)) @@ -4742,7 +4742,7 @@ bool game_lua_kernel::run_event(game_events::queued_event const &ev) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_event", NULL)) + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_event", nullptr)) return false; queued_event_context dummy(&ev, queued_events_); @@ -4846,7 +4846,7 @@ bool game_lua_kernel::run_wml_action(std::string const &cmd, vconfig const &cfg, lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "wml_actions", cmd.c_str(), NULL)) + if (!luaW_getglobal(L, "wesnoth", "wml_actions", cmd.c_str(), nullptr)) return false; queued_event_context dummy(&ev, queued_events_); @@ -4867,7 +4867,7 @@ bool game_lua_kernel::run_wml_conditional(std::string const &cmd, vconfig const lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "wml_conditionals", cmd.c_str(), NULL)) { + if (!luaW_getglobal(L, "wesnoth", "wml_conditionals", cmd.c_str(), nullptr)) { std::string err_msg = "unknown conditional wml: ["; err_msg += cmd; err_msg += "]"; @@ -4895,7 +4895,7 @@ bool game_lua_kernel::run_filter(char const *name, unit const &u) if (!ui.valid()) return false; // Get the user filter by name. - if(!luaW_getglobal(L, name, NULL)) + if(!luaW_getglobal(L, name, nullptr)) { std::string message = std::string() + "function " + name + " not found"; log_error(message.c_str(), "Lua SUF Error"); @@ -4927,7 +4927,7 @@ std::string game_lua_kernel::apply_effect(const std::string& name, unit& u, cons // (Note: The unit needs to be on the stack twice to prevent untimely GC.) luaW_pushconfig(L, cfg); // Stack: unit, cfg - if(luaW_getglobal(L, "wesnoth", "effects", name.c_str(), NULL)) { + if(luaW_getglobal(L, "wesnoth", "effects", name.c_str(), nullptr)) { map_locker(this); // Stack: unit, cfg, effect if(lua_istable(L, -1)) { @@ -4996,7 +4996,7 @@ void game_lua_kernel::mouse_over_hex_callback(const map_location& loc) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_move", NULL)) { + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_move", nullptr)) { return; } lua_push(L, loc.x + 1); @@ -5009,7 +5009,7 @@ void game_lua_kernel::select_hex_callback(const map_location& loc) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_action", NULL)) { + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_action", nullptr)) { return; } lua_push(L, loc.x + 1); diff --git a/src/scripting/lua_api.cpp b/src/scripting/lua_api.cpp index e1909559dafb..d9985aa7964d 100644 --- a/src/scripting/lua_api.cpp +++ b/src/scripting/lua_api.cpp @@ -49,7 +49,7 @@ static lg::log_domain log_scripting_lua("scripting/lua"); void chat_message(std::string const &caption, std::string const &msg) { if (!resources::screen) return; - resources::screen->get_chat_manager().add_chat_message(time(NULL), caption, 0, msg, + resources::screen->get_chat_manager().add_chat_message(time(nullptr), caption, 0, msg, events::chat_handler::MESSAGE_PUBLIC, false); } @@ -77,7 +77,7 @@ bool luaW_pcall(lua_State *L { /* * When an exception is thrown which doesn't derive from - * std::exception m will be NULL pointer. + * std::exception m will be nullptr pointer. */ char const *m = lua_tostring(L, -1); if(m) { @@ -87,7 +87,7 @@ bool luaW_pcall(lua_State *L lg::wml_error() << std::string(m, e ? e - m : strlen(m)); } else if (allow_wml_error && strncmp(m, "~lua:", 5) == 0) { m += 5; - char const *e = NULL, *em = m; + char const *e = nullptr, *em = m; while (em[0] && ((em = strstr(em + 1, "stack traceback")))) #ifdef _MSC_VER #pragma warning (pop) @@ -123,7 +123,7 @@ unit* lua_unit::get() return (*resources::teams)[side - 1].recall_list().find_if_matches_underlying_id(uid).get(); } unit_map::unit_iterator ui = resources::units->find(uid); - if (!ui.valid()) return NULL; + if (!ui.valid()) return nullptr; return ui.get_shared_ptr().get(); //&*ui would not be legal, must get new shared_ptr by copy ctor because the unit_map itself is holding a boost shared pointer. } unit_ptr lua_unit::get_shared() @@ -183,9 +183,9 @@ bool lua_unit::put_map(const map_location &loc) unit* luaW_tounit(lua_State *L, int index, bool only_on_map) { - if (!luaW_hasmetatable(L, index, getunitKey)) return NULL; + if (!luaW_hasmetatable(L, index, getunitKey)) return nullptr; lua_unit *lu = static_cast(lua_touserdata(L, index)); - if (only_on_map && !lu->on_map()) return NULL; + if (only_on_map && !lu->on_map()) return nullptr; return lu->get(); } diff --git a/src/scripting/lua_api.hpp b/src/scripting/lua_api.hpp index d03d674f4b5c..dfa4ed2758d1 100644 --- a/src/scripting/lua_api.hpp +++ b/src/scripting/lua_api.hpp @@ -78,7 +78,7 @@ class lua_unit unit* get(); unit_ptr get_shared(); - void clear_ref() { uid = 0; ptr = unit_ptr(); side = 0; c_ptr = NULL; } + void clear_ref() { uid = 0; ptr = unit_ptr(); side = 0; c_ptr = nullptr; } // Clobbers loc bool put_map(const map_location &loc); }; diff --git a/src/scripting/lua_common.cpp b/src/scripting/lua_common.cpp index 97d64011cbf7..9f4df5738d9e 100644 --- a/src/scripting/lua_common.cpp +++ b/src/scripting/lua_common.cpp @@ -380,7 +380,7 @@ std::string register_gettext_metatable(lua_State *L) static luaL_Reg const callbacks[] = { { "__call", &impl_gettext}, - { NULL, NULL } + { nullptr, nullptr } }; luaL_setfuncs(L, callbacks, 0); @@ -404,7 +404,7 @@ std::string register_tstring_metatable(lua_State *L) { "__lt", &impl_tstring_lt}, { "__le", &impl_tstring_le}, { "__eq", &impl_tstring_eq}, - { NULL, NULL } + { nullptr, nullptr } }; luaL_setfuncs(L, callbacks, 0); @@ -427,7 +427,7 @@ std::string register_vconfig_metatable(lua_State *L) { "__len", &impl_vconfig_size}, { "__pairs", &impl_vconfig_pairs}, { "__ipairs", &impl_vconfig_ipairs}, - { NULL, NULL } + { nullptr, nullptr } }; luaL_setfuncs(L, callbacks, 0); diff --git a/src/scripting/lua_cpp_function.cpp b/src/scripting/lua_cpp_function.cpp index aa2bae78f8cb..87d510a8e3df 100644 --- a/src/scripting/lua_cpp_function.cpp +++ b/src/scripting/lua_cpp_function.cpp @@ -46,7 +46,7 @@ static int intf_dispatcher ( lua_State* L ) static int intf_cleanup ( lua_State* L ) { lua_function * d = static_cast< lua_function *> (luaL_testudata(L, 1, cpp_function)); - if (d == NULL) { + if (d == nullptr) { ERR_LUA << "lua_cpp::intf_cleanup called on data of type: " << lua_typename( L, lua_type( L, 1 ) ) << std::endl; ERR_LUA << "This may indicate a memory leak, please report at bugs.wesnoth.org" << std::endl; lua_pushstring(L, "C++ function object garbage collection failure"); @@ -92,7 +92,7 @@ void push_function( lua_State* L, const lua_function & f ) void set_functions( lua_State* L, const lua_cpp::Reg * l) { luaL_checkversion(L); - for (; l->name != NULL; l++) { /* fill the table with given functions */ + for (; l->name != nullptr; l++) { /* fill the table with given functions */ push_function(L, l->func); lua_setfield(L, -2, l->name); } @@ -115,7 +115,7 @@ void set_functions( lua_State* L, const lua_cpp::Reg * l, int nup ) { luaL_checkversion(L); luaL_checkstack(L, nup+1, "too many upvalues"); - for (; l->name != NULL; l++) { /* fill the table with given functions */ + for (; l->name != nullptr; l++) { /* fill the table with given functions */ int i; for (i = 0; i < nup; ++i) /* copy upvalues to the top */ lua_pushvalue(L, -nup); diff --git a/src/scripting/lua_fileops.cpp b/src/scripting/lua_fileops.cpp index f7bf79473b87..ac128155cfdf 100644 --- a/src/scripting/lua_fileops.cpp +++ b/src/scripting/lua_fileops.cpp @@ -182,7 +182,7 @@ class lua_filestream //lua uses '@' to know that this is a file (as opposed to something loaded via loadstring ) std::string chunkname = '@' + relativename; LOG_LUA << "starting to read from " << fname << "\n"; - return lua_load(L, &lua_filestream::lua_read_data, &lfs, chunkname.c_str(), NULL); + return lua_load(L, &lua_filestream::lua_read_data, &lfs, chunkname.c_str(), nullptr); } private: char buff_[LUAL_BUFFERSIZE]; diff --git a/src/scripting/lua_gui2.cpp b/src/scripting/lua_gui2.cpp index 051b0bded154..659a0ec52ba6 100644 --- a/src/scripting/lua_gui2.cpp +++ b/src/scripting/lua_gui2.cpp @@ -79,7 +79,7 @@ namespace { scoped_dialog(const scoped_dialog &); // not implemented; not allowed. }; - scoped_dialog *scoped_dialog::current = NULL; + scoped_dialog *scoped_dialog::current = nullptr; scoped_dialog::scoped_dialog(lua_State *l, gui2::twindow *w) : L(l), prev(current), window(w), callbacks() @@ -118,7 +118,7 @@ static gui2::twidget *find_widget(lua_State *L, int i, bool readonly) luaL_typerror(L, i, "string"); error_call_destructors_3: luaL_argerror(L, i, "widget not found"); - return NULL; + return nullptr; } gui2::twidget *w = scoped_dialog::current->window; diff --git a/src/scripting/lua_kernel_base.cpp b/src/scripting/lua_kernel_base.cpp index 46bb69536674..0e32061c6acb 100644 --- a/src/scripting/lua_kernel_base.cpp +++ b/src/scripting/lua_kernel_base.cpp @@ -150,7 +150,7 @@ int lua_kernel_base::intf_show_lua_console(lua_State *L) return 0; } - if (cmd_log_.external_log_ != NULL) { + if (cmd_log_.external_log_ != nullptr) { std::string message = "There is already an external logger attached to this lua kernel, you cannot open the lua console right now."; log_error(message.c_str()); cmd_log_ << message << "\n"; @@ -194,7 +194,7 @@ lua_kernel_base::lua_kernel_base(CVideo * video) { "debug", luaopen_debug }, { "os", luaopen_os }, { "bit32", luaopen_bit32 }, // added in Lua 5.2 - { NULL, NULL } + { nullptr, nullptr } }; for (luaL_Reg const *lib = safe_libs; lib->func; ++lib) { @@ -283,7 +283,7 @@ lua_kernel_base::lua_kernel_base(CVideo * video) { "show_message_dialog", &dispatch<&lua_kernel_base::intf_show_message_dialog> }, { "show_popup_dialog", &dispatch<&lua_kernel_base::intf_show_popup_dialog> }, { "show_lua_console", &dispatch<&lua_kernel_base::intf_show_lua_console> }, - { NULL, NULL } + { nullptr, nullptr } }; @@ -292,7 +292,7 @@ lua_kernel_base::lua_kernel_base(CVideo * video) { "require", boost::bind(&lua_kernel_base::intf_require, this, _1)}, { "show_dialog", boost::bind(&lua_kernel_base::intf_show_dialog, this, _1)}, { "show_lua_console", boost::bind(&lua_kernel_base::intf_show_lua_console, this, _1)}, -*/ { NULL, NULL } +*/ {} }; lua_getglobal(L, "wesnoth"); @@ -335,7 +335,7 @@ lua_kernel_base::lua_kernel_base(CVideo * video) { "get_relative_dir", &lua_map_location::intf_get_relative_dir }, { "parse_direction", &lua_map_location::intf_parse_direction }, { "write_direction", &lua_map_location::intf_write_direction }, - { NULL, NULL } + { nullptr, nullptr } }; // Create the map_location table. diff --git a/src/scripting/lua_kernel_base.hpp b/src/scripting/lua_kernel_base.hpp index d9de37bb9581..3d14657bbd47 100644 --- a/src/scripting/lua_kernel_base.hpp +++ b/src/scripting/lua_kernel_base.hpp @@ -75,7 +75,7 @@ class lua_kernel_base { command_log() : log_() - , external_log_(NULL) + , external_log_(nullptr) {} inline command_log & operator<< (const std::string & str) { @@ -87,7 +87,7 @@ class lua_kernel_base { } inline command_log & operator<< (char const* str) { - if (str != NULL) { + if (str != nullptr) { log_ << str; if (external_log_) { (*external_log_) << str; diff --git a/src/scripting/lua_race.cpp b/src/scripting/lua_race.cpp index 768c3d5f7074..4e05a19c037d 100644 --- a/src/scripting/lua_race.cpp +++ b/src/scripting/lua_race.cpp @@ -84,7 +84,7 @@ namespace lua_race { static luaL_Reg const callbacks[] = { { "__index", &impl_race_get}, - { NULL, NULL } + { nullptr, nullptr } }; luaL_setfuncs(L, callbacks, 0); diff --git a/src/scripting/lua_rng.cpp b/src/scripting/lua_rng.cpp index 8c5b130e28d9..79ae0c17275c 100644 --- a/src/scripting/lua_rng.cpp +++ b/src/scripting/lua_rng.cpp @@ -46,7 +46,7 @@ int impl_rng_create(lua_State* L) int impl_rng_destroy(lua_State* L) { mt_rng * d = static_cast< mt_rng *> (luaL_testudata(L, 1, Rng)); - if (d == NULL) { + if (d == nullptr) { ERR_LUA << "rng_destroy called on data of type: " << lua_typename( L, lua_type( L, 1 ) ) << std::endl; ERR_LUA << "This may indicate a memory leak, please report at bugs.wesnoth.org" << std::endl; lua_pushstring(L, "Rng object garbage collection failure"); @@ -85,7 +85,7 @@ void load_tables(lua_State* L) { "__gc", &impl_rng_destroy}, { "seed", &impl_rng_seed}, { "draw", &impl_rng_draw}, - { NULL, NULL } + { nullptr, nullptr } }; luaL_setfuncs(L, callbacks, 0); diff --git a/src/scripting/lua_team.cpp b/src/scripting/lua_team.cpp index 1e36727bab73..3a5c5aede767 100644 --- a/src/scripting/lua_team.cpp +++ b/src/scripting/lua_team.cpp @@ -158,7 +158,7 @@ namespace lua_team { static luaL_Reg const callbacks[] = { { "__index", &impl_side_get}, { "__newindex", &impl_side_set}, - { NULL, NULL } + { nullptr, nullptr } }; luaL_setfuncs(L, callbacks, 0); diff --git a/src/scripting/mapgen_lua_kernel.cpp b/src/scripting/mapgen_lua_kernel.cpp index b3821d1dfd9f..aceda06cf90f 100644 --- a/src/scripting/mapgen_lua_kernel.cpp +++ b/src/scripting/mapgen_lua_kernel.cpp @@ -99,7 +99,7 @@ static int intf_find_path(lua_State *L) if(lua_isboolean(L, 8)) { border = luaW_toboolean(L, 8); } - pathfind::plain_route res = pathfind::a_star_search(src, dst, 10000, &calc, width, height, NULL, border); + pathfind::plain_route res = pathfind::a_star_search(src, dst, 10000, &calc, width, height, nullptr, border); int nb = res.steps.size(); lua_createtable(L, nb, 0); @@ -119,7 +119,7 @@ static int intf_find_path(lua_State *L) mapgen_lua_kernel::mapgen_lua_kernel() - : lua_kernel_base(NULL) + : lua_kernel_base(nullptr) , random_seed_() , default_rng_() { @@ -129,7 +129,7 @@ mapgen_lua_kernel::mapgen_lua_kernel() static luaL_Reg const callbacks[] = { { "find_path", &intf_find_path }, { "random", &intf_random }, - { NULL, NULL } + { nullptr, nullptr } }; lua_getglobal(L, "wesnoth"); diff --git a/src/scripting/plugins/context.cpp b/src/scripting/plugins/context.cpp index 43a61e1a8fb6..27a542be36aa 100644 --- a/src/scripting/plugins/context.cpp +++ b/src/scripting/plugins/context.cpp @@ -33,10 +33,10 @@ plugins_context::plugins_context(const std::string & name, const Reg * l, const , accessors_() , name_(name) { - for (; l->name != NULL; l++) { /* fill the table with given functions */ + for (; l->name != nullptr; l++) { /* fill the table with given functions */ callbacks_.insert(std::make_pair(l->name, l->func)); } - for (; r->name != NULL; r++) { /* fill the table with given functions */ + for (; r->name != nullptr; r++) { /* fill the table with given functions */ accessors_.insert(std::make_pair(r->name, r->func)); } } diff --git a/src/scripting/plugins/manager.cpp b/src/scripting/plugins/manager.cpp index eab36a53dec4..a267133fd575 100644 --- a/src/scripting/plugins/manager.cpp +++ b/src/scripting/plugins/manager.cpp @@ -42,7 +42,7 @@ struct plugin { std::vector queue; }; -static plugins_manager * singleton = NULL; +static plugins_manager * singleton = nullptr; plugins_manager::plugins_manager(application_lua_kernel * kernel) : plugins_() diff --git a/src/sdl/image.cpp b/src/sdl/image.cpp index b7a1e6df89df..8fc0fe682e2b 100644 --- a/src/sdl/image.cpp +++ b/src/sdl/image.cpp @@ -28,7 +28,7 @@ namespace sdl { timage::timage(Uint16 w, Uint16 h) - : image_(NULL) + : image_(nullptr) , rotation_(0) , hscale_(1) , vscale_(1) @@ -43,7 +43,7 @@ timage::timage(Uint16 w, Uint16 h) { clip_ = create_gpu_rect(0, 0, w, h); image_ = GPU_CreateImage(w, h, GPU_FORMAT_RGBA); - if (image_ == NULL) { + if (image_ == nullptr) { throw tgpu_exception("Failed to construct timage object.", true); } else { image_->refcount = 1; @@ -66,7 +66,7 @@ timage::timage(const std::string &file) , vwrap_(GPU_WRAP_NONE) , effects_(0) { - if (image_ == NULL) { + if (image_ == nullptr) { throw tgpu_exception("Failed to construct timage object.", true); } else { clip_ = create_gpu_rect(0, 0, image_->w, image_->h); @@ -92,8 +92,8 @@ timage::timage(const surface &source) , submerge_(0) , effects_(0) { - if (image_ == NULL) { - if (!source.null()) { + if (image_ == nullptr) { + if (!source.nullptr()) { throw tgpu_exception("Failed to construct timage object.", true); } } else { @@ -120,8 +120,8 @@ timage::timage(SDL_Surface *source) , submerge_(0) , effects_(0) { - if (image_ == NULL) { - if (source != NULL) { + if (image_ == nullptr) { + if (source != nullptr) { throw tgpu_exception("Failed to construct timage object.", true); } } else { @@ -133,7 +133,7 @@ timage::timage(SDL_Surface *source) } timage::timage() - : image_(NULL) + : image_(nullptr) , rotation_(0) , hscale_(1) , vscale_(1) @@ -152,7 +152,7 @@ timage::timage() sdl::timage::~timage() { - if (image_ != NULL) { + if (image_ != nullptr) { image_->refcount -= 1; if (image_->refcount == 0) { GPU_FreeImage(image_); @@ -176,7 +176,7 @@ timage::timage(const timage &texture) , submerge_(texture.submerge_) , effects_(texture.effects_) { - if (image_ != NULL) { + if (image_ != nullptr) { image_->refcount += 1; } } @@ -365,9 +365,9 @@ int timage::effects() const return effects_; } -bool timage::null() const +bool timage::nullptr() const { - return image_ == NULL; + return image_ == nullptr; } timage timage::clone() const diff --git a/src/sdl/image.hpp b/src/sdl/image.hpp index 980a5ff324e2..85e992950dba 100644 --- a/src/sdl/image.hpp +++ b/src/sdl/image.hpp @@ -248,9 +248,9 @@ class timage int effects() const; /** - * Returns true if the managed texture is NULL. + * Returns true if the managed texture is nullptr. */ - bool null() const; + bool nullptr() const; timage clone() const; diff --git a/src/sdl/rect.cpp b/src/sdl/rect.cpp index 0ee77caf3782..b78419c86af7 100644 --- a/src/sdl/rect.cpp +++ b/src/sdl/rect.cpp @@ -90,14 +90,14 @@ void fill_rect_alpha(SDL_Rect &rect, Uint32 color, Uint8 alpha, surface target) } surface tmp(create_compatible_surface(target,rect.w,rect.h)); - if(tmp == NULL) { + if(tmp == nullptr) { return; } SDL_Rect r = {0,0,rect.w,rect.h}; sdl::fill_rect(tmp,&r,color); SDL_SetAlpha(tmp,SDL_SRCALPHA,alpha); - sdl_blit(tmp,NULL,target,&rect); + sdl_blit(tmp,nullptr,target,&rect); } void draw_rectangle(int x, int y, int w, int h, Uint32 color, surface target) diff --git a/src/sdl/utils.cpp b/src/sdl/utils.cpp index 5ef0bec56150..1d4086a927d1 100644 --- a/src/sdl/utils.cpp +++ b/src/sdl/utils.cpp @@ -126,7 +126,7 @@ static SDL_PixelFormat& get_neutral_pixel_format() first_time = false; surface surf(SDL_CreateRGBSurface(SDL_SWSURFACE,1,1,32,0xFF0000,0xFF00,0xFF,0xFF000000)); format = *surf->format; - format.palette = NULL; + format.palette = nullptr; } return format; @@ -134,13 +134,13 @@ static SDL_PixelFormat& get_neutral_pixel_format() surface make_neutral_surface(const surface &surf) { - if(surf == NULL) { + if(surf == nullptr) { std::cerr << "null neutral surface...\n"; - return NULL; + return nullptr; } surface const result = SDL_ConvertSurface(surf,&get_neutral_pixel_format(),SDL_SWSURFACE); - if(result != NULL) { + if(result != nullptr) { SDL_SetAlpha(result,SDL_SRCALPHA,SDL_ALPHA_OPAQUE); } @@ -151,7 +151,7 @@ surface create_neutral_surface(int w, int h) { if (w < 0 || h < 0) { std::cerr << "error : neutral surface with negative dimensions\n"; - return NULL; + return nullptr; } SDL_PixelFormat format = get_neutral_pixel_format(); @@ -167,8 +167,8 @@ surface create_neutral_surface(int w, int h) surface create_optimized_surface(const surface &surf) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; SDL_SetAlpha(surf,SDL_SRCALPHA|SDL_RLEACCEL,SDL_ALPHA_OPAQUE); @@ -181,8 +181,8 @@ surface stretch_surface_horizontal( // Since SDL version 1.1.5 0 is transparent, before 255 was transparent. assert(SDL_ALPHA_TRANSPARENT==0); - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if(static_cast(w) == surf->w) { return surf; @@ -194,9 +194,9 @@ surface stretch_surface_horizontal( surface src(make_neutral_surface(surf)); // Now both surfaces are always in the "neutral" pixel format - if(src == NULL || dst == NULL) { + if(src == nullptr || dst == nullptr) { std::cerr << "Could not create surface to scale onto\n"; - return NULL; + return nullptr; } { @@ -226,8 +226,8 @@ surface stretch_surface_vertical( // Since SDL version 1.1.5 0 is transparent, before 255 was transparent. assert(SDL_ALPHA_TRANSPARENT==0); - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if(static_cast(h) == surf->h) { return surf; @@ -239,9 +239,9 @@ surface stretch_surface_vertical( surface src(make_neutral_surface(surf)); // Now both surfaces are always in the "neutral" pixel format - if(src == NULL || dst == NULL) { + if(src == nullptr || dst == nullptr) { std::cerr << "Could not create surface to scale onto\n"; - return NULL; + return nullptr; } { @@ -365,8 +365,8 @@ Uint32 blend_rgba(const surface& surf, unsigned char r, unsigned char g, unsigne surface scale_surface_xbrz(const surface & surf, size_t z) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if (z > 5) { std::cerr << "Cannot use xbrz scaling with zoom factor > 5." << std::endl; @@ -387,9 +387,9 @@ surface scale_surface_xbrz(const surface & surf, size_t z) surface src(make_neutral_surface(surf)); - if(src == NULL || dst == NULL) { + if(src == nullptr || dst == nullptr) { std::cerr << "Could not create surface to scale onto\n"; - return NULL; + return nullptr; } { @@ -406,8 +406,8 @@ surface scale_surface_nn (const surface & surf, int w, int h) // Since SDL version 1.1.5 0 is transparent, before 255 was transparent. assert(SDL_ALPHA_TRANSPARENT==0); - if (surf == NULL) - return NULL; + if (surf == nullptr) + return nullptr; if(w == surf->w && h == surf->h) { return surf; @@ -425,9 +425,9 @@ surface scale_surface_nn (const surface & surf, int w, int h) surface src(make_neutral_surface(surf)); // Now both surfaces are always in the "neutral" pixel format - if(src == NULL || dst == NULL) { + if(src == nullptr || dst == nullptr) { std::cerr << "Could not create surface to scale onto\n"; - return NULL; + return nullptr; } { @@ -449,8 +449,8 @@ surface scale_surface(const surface &surf, int w, int h, bool optimize) // Since SDL version 1.1.5 0 is transparent, before 255 was transparent. assert(SDL_ALPHA_TRANSPARENT==0); - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if(w == surf->w && h == surf->h) { return surf; @@ -468,9 +468,9 @@ surface scale_surface(const surface &surf, int w, int h, bool optimize) surface src(make_neutral_surface(surf)); // Now both surfaces are always in the "neutral" pixel format - if(src == NULL || dst == NULL) { + if(src == nullptr || dst == nullptr) { std::cerr << "Could not create surface to scale onto\n"; - return NULL; + return nullptr; } { @@ -579,8 +579,8 @@ surface scale_surface_sharp(const surface& surf, int w, int h, bool optimize) // Since SDL version 1.1.5 0 is transparent, before 255 was transparent. assert(SDL_ALPHA_TRANSPARENT==0); - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if(w == surf->w && h == surf->h) { return surf; @@ -598,9 +598,9 @@ surface scale_surface_sharp(const surface& surf, int w, int h, bool optimize) surface src(make_neutral_surface(surf)); // Now both surfaces are always in the "neutral" pixel format - if(src == NULL || dst == NULL) { + if(src == nullptr || dst == nullptr) { std::cerr << "Could not create surface to scale onto\n"; - return NULL; + return nullptr; } #ifdef PANDORA @@ -680,9 +680,9 @@ surface tile_surface(const surface& surf, int w, int h, bool optimize) surface dest(create_neutral_surface(w, h)); surface src(make_neutral_surface(surf)); - if (src == NULL || dest == NULL) { + if (src == nullptr || dest == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -717,17 +717,17 @@ surface tile_surface(const surface& surf, int w, int h, bool optimize) surface adjust_surface_color(const surface &surf, int red, int green, int blue, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if((red == 0 && green == 0 && blue == 0)) return optimize ? create_optimized_surface(surf) : surf; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -760,13 +760,13 @@ surface adjust_surface_color(const surface &surf, int red, int green, int blue, surface greyscale_image(const surface &surf, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -805,13 +805,13 @@ surface greyscale_image(const surface &surf, bool optimize) surface monochrome_image(const surface &surf, const int threshold, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -845,13 +845,13 @@ surface monochrome_image(const surface &surf, const int threshold, bool optimize surface sepia_image(const surface &surf, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -887,13 +887,13 @@ surface sepia_image(const surface &surf, bool optimize) surface negative_image(const surface &surf, const int thresholdR, const int thresholdG, const int thresholdB, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -930,13 +930,13 @@ surface negative_image(const surface &surf, const int thresholdR, const int thre surface alpha_to_greyscale(const surface &surf, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -958,13 +958,13 @@ surface alpha_to_greyscale(const surface &surf, bool optimize) surface wipe_alpha(const surface &surf, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -986,15 +986,15 @@ surface wipe_alpha(const surface &surf, bool optimize) surface shadow_image(const surface &surf, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; // we blur it, and reuse the neutral surface created by the blur function (optimized = false) surface nsurf (blur_alpha_surface(surf, 2, false)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to blur the shadow surface\n"; - return NULL; + return nullptr; } { @@ -1022,13 +1022,13 @@ surface shadow_image(const surface &surf, bool optimize) } surface swap_channels_image(const surface& surf, channel r, channel g, channel b, channel a, bool optimize) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } { @@ -1059,7 +1059,7 @@ surface swap_channels_image(const surface& surf, channel r, channel g, channel b newRed = alpha; break; default: - return NULL; + return nullptr; } switch (g) { @@ -1076,7 +1076,7 @@ surface swap_channels_image(const surface& surf, channel r, channel g, channel b newGreen = alpha; break; default: - return NULL; + return nullptr; } switch (b) { @@ -1093,7 +1093,7 @@ surface swap_channels_image(const surface& surf, channel r, channel g, channel b newBlue = alpha; break; default: - return NULL; + return nullptr; } switch (a) { @@ -1110,7 +1110,7 @@ surface swap_channels_image(const surface& surf, channel r, channel g, channel b newAlpha = alpha; break; default: - return NULL; + return nullptr; } *beg = (newAlpha << 24) | (newRed << 16) | (newGreen << 8) | newBlue; @@ -1124,14 +1124,14 @@ surface swap_channels_image(const surface& surf, channel r, channel g, channel b } surface recolor_image(surface surf, const std::map& map_rgb, bool optimize){ - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if(!map_rgb.empty()){ surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; - return NULL; + return nullptr; } surface_lock lock(nsurf); @@ -1159,15 +1159,15 @@ surface recolor_image(surface surf, const std::map& map_rgb, boo surface brighten_image(const surface &surf, fixed_t amount, bool optimize) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } { @@ -1201,15 +1201,15 @@ surface brighten_image(const surface &surf, fixed_t amount, bool optimize) surface adjust_surface_alpha(const surface &surf, fixed_t amount, bool optimize) { - if(surf== NULL) { - return NULL; + if(surf== nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } { @@ -1240,15 +1240,15 @@ surface adjust_surface_alpha(const surface &surf, fixed_t amount, bool optimize) surface adjust_surface_alpha_add(const surface &surf, int amount, bool optimize) { - if(surf== NULL) { - return NULL; + if(surf== nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } { @@ -1278,19 +1278,19 @@ surface adjust_surface_alpha_add(const surface &surf, int amount, bool optimize) surface mask_surface(const surface &surf, const surface &mask, bool* empty_result, const std::string& filename) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } - if(mask == NULL) { + if(mask == nullptr) { return surf; } surface nsurf = make_neutral_surface(surf); surface nmask(make_neutral_surface(mask)); - if(nsurf == NULL || nmask == NULL) { + if(nsurf == nullptr || nmask == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } if (nsurf->w != nmask->w) { // we don't support efficiently different width. @@ -1348,10 +1348,10 @@ surface mask_surface(const surface &surf, const surface &mask, bool* empty_resul bool in_mask_surface(const surface &surf, const surface &mask) { - if(surf == NULL) { + if(surf == nullptr) { return false; } - if(mask == NULL){ + if(mask == nullptr){ return true; } @@ -1363,7 +1363,7 @@ bool in_mask_surface(const surface &surf, const surface &mask) surface nsurf = make_neutral_surface(surf); surface nmask(make_neutral_surface(mask)); - if(nsurf == NULL || nmask == NULL) { + if(nsurf == nullptr || nmask == nullptr) { std::cerr << "could not make neutral surface...\n"; return false; } @@ -1394,8 +1394,8 @@ bool in_mask_surface(const surface &surf, const surface &mask) surface submerge_alpha(const surface &surf, int depth, float alpha_base, float alpha_delta, bool optimize) { - if(surf== NULL) { - return NULL; + if(surf== nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); @@ -1457,18 +1457,18 @@ surface submerge_alpha(const surface &surf, int depth, float alpha_base, float a surface light_surface(const surface &surf, const surface &lightmap, bool optimize) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } - if(lightmap == NULL) { + if(lightmap == nullptr) { return surf; } surface nsurf = make_neutral_surface(surf); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } if (nsurf->w != lightmap->w) { // we don't support efficiently different width. @@ -1523,15 +1523,15 @@ surface light_surface(const surface &surf, const surface &lightmap, bool optimiz surface blur_surface(const surface &surf, int depth, bool optimize) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } surface res = make_neutral_surface(surf); - if(res == NULL) { + if(res == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } SDL_Rect rect = sdl::create_rect(0, 0, surf->w, surf->h); @@ -1542,7 +1542,7 @@ surface blur_surface(const surface &surf, int depth, bool optimize) void blur_surface(surface& surf, SDL_Rect rect, int depth) { - if(surf == NULL) { + if(surf == nullptr) { return; } @@ -1658,15 +1658,15 @@ void blur_surface(surface& surf, SDL_Rect rect, int depth) surface blur_alpha_surface(const surface &surf, int depth, bool optimize) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } surface res = make_neutral_surface(surf); - if(res == NULL) { + if(res == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } const int max_blur = 256; @@ -1781,14 +1781,14 @@ surface blur_alpha_surface(const surface &surf, int depth, bool optimize) surface cut_surface(const surface &surf, SDL_Rect const &r) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; surface res = create_compatible_surface(surf, r.w, r.h); - if(res == NULL) { + if(res == nullptr) { std::cerr << "Could not create a new surface in cut_surface()\n"; - return NULL; + return nullptr; } size_t sbpp = surf->format->BytesPerPixel; @@ -1843,15 +1843,15 @@ surface blend_surface( , const Uint32 color , const bool optimize) { - if(surf== NULL) { - return NULL; + if(surf== nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } { @@ -2028,15 +2028,15 @@ Uint32 get_pixel(const surface& surf, const const_surface_lock& surf_lock, int x // Rotates a surface 180 degrees. surface rotate_180_surface(const surface &surf, bool optimize) { - if ( surf == NULL ) - return NULL; + if ( surf == nullptr ) + return nullptr; // Work with a "neutral" (unoptimized) surface. surface nsurf(make_neutral_surface(surf)); - if ( nsurf == NULL ) { + if ( nsurf == nullptr ) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } {// Code block to limit the scope of the surface lock. @@ -2070,16 +2070,16 @@ surface rotate_180_surface(const surface &surf, bool optimize) // Rotates a surface 90 degrees, either clockwise or counter-clockwise. surface rotate_90_surface(const surface &surf, bool clockwise, bool optimize) { - if ( surf == NULL ) - return NULL; + if ( surf == nullptr ) + return nullptr; // Work with "neutral" (unoptimized) surfaces. surface dst(create_neutral_surface(surf->h, surf->w)); // Flipped dimensions. surface src(make_neutral_surface(surf)); - if ( src == NULL || dst == NULL ) { + if ( src == nullptr || dst == nullptr ) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } {// Code block to limit the scope of the surface locks. @@ -2107,15 +2107,15 @@ surface rotate_90_surface(const surface &surf, bool clockwise, bool optimize) surface flip_surface(const surface &surf, bool optimize) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } { @@ -2136,15 +2136,15 @@ surface flip_surface(const surface &surf, bool optimize) surface flop_surface(const surface &surf, bool optimize) { - if(surf == NULL) { - return NULL; + if(surf == nullptr) { + return nullptr; } surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "could not make neutral surface...\n"; - return NULL; + return nullptr; } { @@ -2165,8 +2165,8 @@ surface flop_surface(const surface &surf, bool optimize) surface create_compatible_surface(const surface &surf, int width, int height) { - if(surf == NULL) - return NULL; + if(surf == nullptr) + return nullptr; if(width == -1) width = surf->w; @@ -2334,13 +2334,13 @@ void blit_surface(const surface& surf, surface get_surface_portion(const surface &src, SDL_Rect &area) { - if (src == NULL) { - return NULL; + if (src == nullptr) { + return nullptr; } // Check if there is something in the portion if(area.x >= src->w || area.y >= src->h || area.x + area.w < 0 || area.y + area.h < 0) { - return NULL; + return nullptr; } if(area.x + area.w > src->w) { @@ -2353,12 +2353,12 @@ surface get_surface_portion(const surface &src, SDL_Rect &area) // use same format as the source (almost always the screen) surface dst = create_compatible_surface(src, area.w, area.h); - if(dst == NULL) { + if(dst == nullptr) { std::cerr << "Could not create a new surface in get_surface_portion()\n"; - return NULL; + return nullptr; } - sdl_copy_portion(src, &area, dst, NULL); + sdl_copy_portion(src, &area, dst, nullptr); return dst; } @@ -2382,7 +2382,7 @@ SDL_Rect get_non_transparent_portion(const surface &surf) { SDL_Rect res = {0,0,0,0}; surface nsurf(make_neutral_surface(surf)); - if(nsurf == NULL) { + if(nsurf == nullptr) { std::cerr << "failed to make neutral surface\n"; return res; } @@ -2464,12 +2464,12 @@ SDL_Color inverse(const SDL_Color& color) { return inverse; } -surface_restorer::surface_restorer() : target_(NULL), rect_(sdl::empty_rect), surface_(NULL) +surface_restorer::surface_restorer() : target_(nullptr), rect_(sdl::empty_rect), surface_(nullptr) { } surface_restorer::surface_restorer(CVideo* target, const SDL_Rect& rect) -: target_(target), rect_(rect), surface_(NULL) +: target_(target), rect_(rect), surface_(nullptr) { update(); } @@ -2498,21 +2498,21 @@ void surface_restorer::restore() const if (surface_.null()) return; SDL_Rect dst = rect_; - sdl_blit(surface_, NULL, target_->getSurface(), &dst); + sdl_blit(surface_, nullptr, target_->getSurface(), &dst); update_rect(rect_); } void surface_restorer::update() { if(rect_.w <= 0 || rect_.h <= 0) - surface_.assign(NULL); + surface_.assign(nullptr); else surface_.assign(::get_surface_portion(target_->getSurface(),rect_)); } void surface_restorer::cancel() { - surface_.assign(NULL); + surface_.assign(nullptr); } void draw_centered_on_background(surface surf, const SDL_Rect& rect, const SDL_Color& color, surface target) @@ -2524,10 +2524,10 @@ void draw_centered_on_background(surface surf, const SDL_Rect& rect, const SDL_C SDL_Rect r = rect; sdl::fill_rect(target, &r, col); - if (surf != NULL) { + if (surf != nullptr) { r.x = rect.x + (rect.w-surf->w)/2; r.y = rect.y + (rect.h-surf->h)/2; - sdl_blit(surf, NULL, target, &r); + sdl_blit(surf, nullptr, target, &r); } update_rect(rect); } diff --git a/src/sdl/utils.hpp b/src/sdl/utils.hpp index e77f01a5a851..c79ffadd722c 100644 --- a/src/sdl/utils.hpp +++ b/src/sdl/utils.hpp @@ -55,21 +55,21 @@ struct surface private: static void sdl_add_ref(SDL_Surface *surf) { - if (surf != NULL) + if (surf != nullptr) ++surf->refcount; } struct free_sdl_surface { void operator()(SDL_Surface *surf) const { - if (surf != NULL) + if (surf != nullptr) SDL_FreeSurface(surf); } }; typedef util::scoped_resource scoped_sdl_surface; public: - surface() : surface_(NULL) + surface() : surface_(nullptr) {} surface(SDL_Surface *surf) : surface_(surf) @@ -101,7 +101,7 @@ struct surface void assign(SDL_Surface* surf) { surface_.assign(surf); } - bool null() const { return surface_.get() == NULL; } + bool null() const { return surface_.get() == nullptr; } private: scoped_sdl_surface surface_; @@ -269,7 +269,7 @@ surface recolor_image(surface surf, const std::map& map_rgb, surface brighten_image(const surface &surf, fixed_t amount, bool optimize=true); /** Get a portion of the screen. - * Send NULL if the portion is outside of the screen. + * Send nullptr if the portion is outside of the screen. * @param surf The source surface. * @param rect The portion of the source surface to copy. * @return A surface containing the portion of the source. @@ -282,7 +282,7 @@ surface adjust_surface_alpha(const surface &surf, fixed_t amount, bool optimize= surface adjust_surface_alpha_add(const surface &surf, int amount, bool optimize=true); /** Applies a mask on a surface. */ -surface mask_surface(const surface &surf, const surface &mask, bool* empty_result = NULL, const std::string& filename = std::string()); +surface mask_surface(const surface &surf, const surface &mask, bool* empty_result = nullptr, const std::string& filename = std::string()); /** Check if a surface fit into a mask */ bool in_mask_surface(const surface &surf, const surface &mask); @@ -491,7 +491,7 @@ struct surface_restorer struct clip_rect_setter { - // if r is NULL, clip to the full size of the surface. + // if r is nullptr, clip to the full size of the surface. clip_rect_setter(const surface &surf, const SDL_Rect* r, bool operate = true) : surface_(surf), rect_(), operate_(operate) { if(operate_){ diff --git a/src/serialization/parser.cpp b/src/serialization/parser.cpp index ed90de51c38f..db3d33a29ad1 100644 --- a/src/serialization/parser.cpp +++ b/src/serialization/parser.cpp @@ -55,7 +55,7 @@ class parser parser& operator=(const parser&); public: parser(config& cfg, std::istream& in, - abstract_validator * validator = NULL); + abstract_validator * validator = nullptr); ~parser(); void operator()(); @@ -155,7 +155,7 @@ void parser::parse_element() { tok_.next_token(); std::string elname; - config* current_element = NULL; + config* current_element = nullptr; switch(tok_.current_token().type) { case token::STRING: // [element] elname = tok_.current_token().value; diff --git a/src/serialization/parser.hpp b/src/serialization/parser.hpp index 239288c229b6..2fce1432d93d 100644 --- a/src/serialization/parser.hpp +++ b/src/serialization/parser.hpp @@ -25,13 +25,13 @@ class abstract_validator; // Read data in, clobbering existing data. void read(config &cfg, std::istream &in, - abstract_validator * validator = NULL); // Throws config::error + abstract_validator * validator = nullptr); // Throws config::error void read(config &cfg, const std::string &in, - abstract_validator * validator = NULL); // Throws config::error + abstract_validator * validator = nullptr); // Throws config::error void read_gz(config &cfg, std::istream &in, - abstract_validator * validator = NULL); + abstract_validator * validator = nullptr); void read_bz2(config &cfg, std::istream &in, - abstract_validator * validator = NULL); + abstract_validator * validator = nullptr); void write(std::ostream &out, config const &cfg, unsigned int level=0); void write_gz(std::ostream &out, config const &cfg); diff --git a/src/serialization/preprocessor.cpp b/src/serialization/preprocessor.cpp index a8dd60fcb0cf..0899960a3b57 100644 --- a/src/serialization/preprocessor.cpp +++ b/src/serialization/preprocessor.cpp @@ -272,7 +272,7 @@ preprocessor_streambuf::preprocessor_streambuf(preproc_map *def) : streambuf(), out_buffer_(""), buffer_(), - current_(NULL), + current_(nullptr), defines_(def), default_defines_(), textdomain_(PACKAGE), @@ -287,7 +287,7 @@ preprocessor_streambuf::preprocessor_streambuf(preprocessor_streambuf const &t) streambuf(), out_buffer_(""), buffer_(), - current_(NULL), + current_(nullptr), defines_(t.defines_), default_defines_(), textdomain_(PACKAGE), @@ -556,7 +556,7 @@ preprocessor_file::preprocessor_file(preprocessor_streambuf &t, std::string cons { if (filesystem::is_directory(name)) { - filesystem::get_files_in_dir(name, &files_, NULL, filesystem::ENTIRE_FILE_PATH, filesystem::SKIP_MEDIA_DIR, filesystem::DO_REORDER); + filesystem::get_files_in_dir(name, &files_, nullptr, filesystem::ENTIRE_FILE_PATH, filesystem::SKIP_MEDIA_DIR, filesystem::DO_REORDER); BOOST_FOREACH(std::string fname, files_) { size_t cpos = fname.rfind(" "); @@ -577,7 +577,7 @@ preprocessor_file::preprocessor_file(preprocessor_streambuf &t, std::string cons } else new preprocessor_data(t, file_stream, "", filesystem::get_short_wml_path(name), - 1, filesystem::directory_name(name), t.textdomain_, NULL); + 1, filesystem::directory_name(name), t.textdomain_, nullptr); } pos_ = files_.begin(); end_ = files_.end(); @@ -1230,7 +1230,7 @@ preprocessor_deleter::~preprocessor_deleter() { clear(std::ios_base::goodbit); exceptions(std::ios_base::goodbit); - rdbuf(NULL); + rdbuf(nullptr); delete buf_; delete defines_; } @@ -1238,7 +1238,7 @@ preprocessor_deleter::~preprocessor_deleter() std::istream *preprocess_file(std::string const &fname, preproc_map *defines) { log_scope("preprocessing file " + fname + " ..."); - preproc_map *owned_defines = NULL; + preproc_map *owned_defines = nullptr; if (!defines) { // If no preproc_map has been given, create a new one, // and ensure it is destroyed when the stream is diff --git a/src/serialization/preprocessor.hpp b/src/serialization/preprocessor.hpp index d2434044c743..031bbd8009ce 100644 --- a/src/serialization/preprocessor.hpp +++ b/src/serialization/preprocessor.hpp @@ -71,7 +71,7 @@ std::ostream& operator<<(std::ostream& stream, const preproc_map::value_type& de * * @returns The resulting preprocessed file data. */ -std::istream *preprocess_file(std::string const &fname, preproc_map *defines = NULL); +std::istream *preprocess_file(std::string const &fname, preproc_map *defines = nullptr); void preprocess_resource(const std::string& res_name, preproc_map *defines_map, bool write_cfg=false, bool write_plain_cfg=false, std::string target_directory=""); diff --git a/src/serialization/schema_validator.cpp b/src/serialization/schema_validator.cpp index 854279b54b8d..214660a6fd5f 100644 --- a/src/serialization/schema_validator.cpp +++ b/src/serialization/schema_validator.cpp @@ -179,7 +179,7 @@ void schema_validator::open_tag(const std::string & name, const std::string &file, bool addittion){ if (! stack_.empty()){ - const class_tag * tag = NULL; + const class_tag * tag = nullptr; if (stack_.top()){ tag = stack_.top()->find_tag(name,root_); if (! tag){ @@ -194,7 +194,7 @@ void schema_validator::open_tag(const std::string & name, } stack_.push(tag); }else{ - stack_.push(NULL); + stack_.push(nullptr); } counter_.push(cnt_map()); cache_.push(message_map()); @@ -249,7 +249,7 @@ void schema_validator::validate(const config & cfg, const std::string & name, for (class_tag::const_key_iterator key = k.first; key != k.second ; ++key){ if (key->second.is_mandatory()){ - if (cfg.get(key->first) == NULL){ + if (cfg.get(key->first) == nullptr){ cache_.top()[&cfg].push_back( message_info(MISSING_KEY,file,start_line,0, name,key->first )); diff --git a/src/serialization/tokenizer.cpp b/src/serialization/tokenizer.cpp index 5e8a6b470f34..2a8dc1631e1c 100644 --- a/src/serialization/tokenizer.cpp +++ b/src/serialization/tokenizer.cpp @@ -179,7 +179,7 @@ void tokenizer::skip_comment() { next_char_fast(); if (current_ == '\n' || current_ == EOF) return; - std::string *dst = NULL; + std::string *dst = nullptr; if (current_ == 't') { diff --git a/src/server/ban.cpp b/src/server/ban.cpp index 97a53c90833c..d7b32752d012 100644 --- a/src/server/ban.cpp +++ b/src/server/ban.cpp @@ -237,7 +237,7 @@ static lg::log_domain log_server("server"); { return "permanent"; } - return lg::get_timespan(end_time_ - time(NULL)); + return lg::get_timespan(end_time_ - time(nullptr)); } bool banned::operator>(const banned& b) const diff --git a/src/server/forum_user_handler.cpp b/src/server/forum_user_handler.cpp index 0a5a155ad91d..3e6ca8a33ecc 100644 --- a/src/server/forum_user_handler.cpp +++ b/src/server/forum_user_handler.cpp @@ -40,9 +40,9 @@ fuh::fuh(const config& c) , db_password_(c["db_password"].str()) , db_users_table_(c["db_users_table"].str()) , db_extra_table_(c["db_extra_table"].str()) - , conn(mysql_init(NULL)) + , conn(mysql_init(nullptr)) { - if(!conn || !mysql_real_connect(conn, db_host_.c_str(), db_user_.c_str(), db_password_.c_str(), db_name_.c_str(), 0, NULL, 0)) { + if(!conn || !mysql_real_connect(conn, db_host_.c_str(), db_user_.c_str(), db_password_.c_str(), db_name_.c_str(), 0, nullptr, 0)) { ERR_UH << "Could not connect to database: " << mysql_errno(conn) << ": " << mysql_error(conn) << std::endl; } } @@ -108,7 +108,7 @@ std::string fuh::create_pepper(const std::string& name) { } void fuh::user_logged_in(const std::string& name) { - set_lastlogin(name, time(NULL)); + set_lastlogin(name, time(nullptr)); } bool fuh::user_exists(const std::string& name) { @@ -259,7 +259,7 @@ fuh::mysql_result fuh::db_query(const std::string& sql) { if(mysql_query(conn, sql.c_str())) { WRN_UH << "not connected to database, reconnecting..." << std::endl; //Try to reconnect and execute query again - if(!mysql_real_connect(conn, db_host_.c_str(), db_user_.c_str(), db_password_.c_str(), db_name_.c_str(), 0, NULL, 0) + if(!mysql_real_connect(conn, db_host_.c_str(), db_user_.c_str(), db_password_.c_str(), db_name_.c_str(), 0, nullptr, 0) || mysql_query(conn, sql.c_str())) { ERR_UH << "Could not connect to database: " << mysql_errno(conn) << ": " << mysql_error(conn) << std::endl; throw error("Error querying database."); diff --git a/src/server/game.cpp b/src/server/game.cpp index 4469583ec063..11bb230749ab 100644 --- a/src/server/game.cpp +++ b/src/server/game.cpp @@ -96,7 +96,7 @@ game::game(player_map& players, const network::connection host, started_(false), level_(), history_(), - description_(NULL), + description_(nullptr), end_turn_(0), num_turns_(0), all_observers_muted_(false), @@ -600,7 +600,7 @@ void game::notify_new_host(){ } bool game::describe_slots() { - if(started_ || description_ == NULL) + if(started_ || description_ == nullptr) return false; int available_slots = 0; @@ -956,7 +956,7 @@ bool game::process_turn(simple_wml::document& data, const player_map::const_iter } for (command = commands.begin(); command != commands.end(); ++command) { simple_wml::node* const speak = (**command).child("speak"); - if (speak == NULL) { + if (speak == nullptr) { simple_wml::document* mdata = new simple_wml::document; simple_wml::node& turn = mdata->root().add_child("turn"); (**command).copy_into(turn.add_child("command")); @@ -1149,7 +1149,7 @@ bool game::end_turn() { } if (!turn_ended) return false; - if (description_ == NULL) { + if (description_ == nullptr) { return false; } @@ -1322,7 +1322,7 @@ bool game::remove_player(const network::connection player, const bool disconnect void game::send_user_list(const network::connection exclude) const { //if the game hasn't started yet, then send all players a list //of the users in the game - if (started_ || description_ == NULL) return; + if (started_ || description_ == nullptr) return; /** @todo Should be renamed to userlist. */ simple_wml::document cfg; cfg.root().add_child("gamelist"); @@ -1533,7 +1533,7 @@ void game::save_replay() { //level_.set_attr_dup("label", name.str().c_str()); //TODO: comment where mp_game_title= is used. level_.set_attr_dup("mp_game_title", name_.c_str()); - const bool has_old_replay = level_.child("replay") != NULL; + const bool has_old_replay = level_.child("replay") != nullptr; //If there is already a replay in the level_, which means this is a reloaded game, //then we dont need to add the [start] in the replay. replay_data << level_.output() @@ -1679,7 +1679,7 @@ void game::send_server_message_to_all(const char* message, network::connection e void game::send_server_message(const char* message, network::connection sock, simple_wml::document* docptr) const { simple_wml::document docbuf; - if(docptr == NULL) { + if(docptr == nullptr) { docptr = &docbuf; } diff --git a/src/server/game.hpp b/src/server/game.hpp index 6db914336b09..33b7fa8c3374 100644 --- a/src/server/game.hpp +++ b/src/server/game.hpp @@ -41,7 +41,6 @@ class game MAKE_ENUM(CONTROLLER, (HUMAN, "human") (AI, "ai") - /* NULL is alreaddy the name of a standart c++ macro */ (EMPTY, "null") ) @@ -194,8 +193,8 @@ class game send_server_message_to_all(message.c_str(), exclude); } - void send_server_message(const char* message, network::connection sock=0, simple_wml::document* doc=NULL) const; - void send_server_message(const std::string& message, network::connection sock=0, simple_wml::document* doc=NULL) const + void send_server_message(const char* message, network::connection sock=0, simple_wml::document* doc=nullptr) const; + void send_server_message(const std::string& message, network::connection sock=0, simple_wml::document* doc=nullptr) const { send_server_message(message.c_str(), sock, doc); } diff --git a/src/server/metrics.cpp b/src/server/metrics.cpp index e4571bb54124..5fcbe8133d4b 100644 --- a/src/server/metrics.cpp +++ b/src/server/metrics.cpp @@ -44,7 +44,7 @@ metrics::metrics() : current_requests_(0), nrequests_(0), nrequests_waited_(0), - started_at_(time(NULL)), + started_at_(time(nullptr)), terminations_() {} @@ -152,7 +152,7 @@ std::ostream& metrics::requests(std::ostream& out) const std::ostream& operator<<(std::ostream& out, metrics& met) { - const time_t time_up = time(NULL) - met.started_at_; + const time_t time_up = time(nullptr) - met.started_at_; const int seconds = time_up%60; const int minutes = (time_up/60)%60; const int hours = (time_up/(60*60))%24; diff --git a/src/server/player.cpp b/src/server/player.cpp index 7d3cf5464864..8925376be4a6 100644 --- a/src/server/player.cpp +++ b/src/server/player.cpp @@ -80,7 +80,7 @@ void wesnothd::player::mark_registered(bool registered) bool wesnothd::player::is_message_flooding() { - const time_t now = time(NULL); + const time_t now = time(nullptr); if (flood_start_ == 0) { flood_start_ = now; return false; diff --git a/src/server/player.hpp b/src/server/player.hpp index b37653cb609a..c698d0a039e3 100644 --- a/src/server/player.hpp +++ b/src/server/player.hpp @@ -58,10 +58,10 @@ class player /** * @return true iff the player is in a game */ - bool in_game() const { return get_game() != NULL; } + bool in_game() const { return get_game() != nullptr; } /** - * @return a pointer to the game the player is in, or NULL if he/she is not + * @return a pointer to the game the player is in, or nullptr if he/she is not * in a game at the moment */ const game* get_game() const; diff --git a/src/server/room.cpp b/src/server/room.cpp index 958888c39389..4034acd209cc 100644 --- a/src/server/room.cpp +++ b/src/server/room.cpp @@ -130,7 +130,7 @@ void room::send_server_message(const char* message, network::connection sock, simple_wml::document* docptr) const { simple_wml::document docbuf; - if(docptr == NULL) { + if(docptr == nullptr) { docptr = &docbuf; } simple_wml::document& doc = *docptr; diff --git a/src/server/room.hpp b/src/server/room.hpp index 02e0fc5942c2..250dd82cf6c7 100644 --- a/src/server/room.hpp +++ b/src/server/room.hpp @@ -157,10 +157,10 @@ class room { * @param docptr the wml document to store the message in, if nonnull */ void send_server_message(const char* message, network::connection sock, - simple_wml::document* docptr = NULL) const; + simple_wml::document* docptr = nullptr) const; void send_server_message(const std::string& message, network::connection sock, - simple_wml::document* docptr = NULL) const + simple_wml::document* docptr = nullptr) const { send_server_message(message.c_str(), sock, docptr); } diff --git a/src/server/room_manager.cpp b/src/server/room_manager.cpp index 7387fca84c95..087c959202ba 100644 --- a/src/server/room_manager.cpp +++ b/src/server/room_manager.cpp @@ -42,7 +42,7 @@ const char* const room_manager::lobby_name_ = "lobby"; room_manager::room_manager(player_map &all_players) : all_players_(all_players) - , lobby_(NULL) + , lobby_(nullptr) , rooms_by_name_() , rooms_by_player_() , player_stored_rooms_() @@ -109,7 +109,7 @@ void room_manager::read_rooms() } } lobby_ = get_room(lobby_name_); - if (lobby_ == NULL) { + if (lobby_ == nullptr) { lobby_ = create_room(lobby_name_); lobby_->set_persistent(true); lobby_->set_logged(true); @@ -144,7 +144,7 @@ room* room_manager::get_room(const std::string &name) if (i != rooms_by_name_.end()) { return i->second; } else { - return NULL; + return nullptr; } } @@ -157,7 +157,7 @@ room* room_manager::create_room(const std::string &name) { if (room_exists(name)) { DBG_LOBBY << "Requested creation of already existing room '" << name << "'\n"; - return NULL; + return nullptr; } room* r = new room(name); rooms_by_name_.insert(std::make_pair(name, r)); @@ -167,7 +167,7 @@ room* room_manager::create_room(const std::string &name) room* room_manager::get_create_room(const std::string &name, network::connection player) { room* r = get_room(name); - if (r == NULL) { + if (r == nullptr) { bool can_create = false; switch (new_room_policy_) { case PP_EVERYONE: @@ -197,7 +197,7 @@ room* room_manager::get_create_room(const std::string &name, network::connection r = create_room(name); } else { lobby_->send_server_message("The room does not exist", player); - return NULL; + return nullptr; } } return r; @@ -257,13 +257,13 @@ room* room_manager::require_room(const std::string& room_name, const char *log_string) { room* r = get_room(room_name); - if (r == NULL) { + if (r == nullptr) { lobby_->send_server_message("The room does not exist", user->first); WRN_LOBBY << "Player " << user->second.name() << " (conn " << user->first << ")" << " attempted to " << log_string << "a nonexistent room '" << room_name << "'\n"; - return NULL; + return nullptr; } return r; } @@ -273,14 +273,14 @@ room* room_manager::require_member(const std::string& room_name, const char *log_string) { room* r = require_room(room_name, user, log_string); - if (r == NULL) return NULL; + if (r == nullptr) return nullptr; if (!r->is_member(user->first)) { lobby_->send_server_message("You are not a member of this room", user->first); WRN_LOBBY << "Player " << user->second.name() << " (conn " << user->first << ")" << " attempted to " << log_string << "room '" << room_name << "', but is not a member of that room\n"; - return NULL; + return nullptr; } return r; } @@ -339,7 +339,7 @@ void room_manager::unstore_player_rooms(const player_map::iterator user) join_msg.set_attr_dup("player", user->second.name().c_str()); BOOST_FOREACH(const std::string& room_name, it->second) { room* r = get_create_room(room_name, user->first); - if (r == NULL) { + if (r == nullptr) { LOG_LOBBY << "Player " << user->second.name() << " unable to rejoin room " << room_name << "\n"; continue; } @@ -361,7 +361,7 @@ void room_manager::process_message(simple_wml::document &data, const player_map: std::string room_name = message->attr("room").to_string(); if (room_name.empty()) room_name = lobby_name_; room* r = require_member(room_name, user, "message"); - if (r == NULL) { + if (r == nullptr) { std::stringstream ss; ss << "You are not a member of the room '" << room_name << "'. " << "Your message has not been relayed."; @@ -396,7 +396,7 @@ void room_manager::process_room_join(simple_wml::document &data, const player_ma assert(msg); std::string room_name = msg->attr("room").to_string(); room* r = get_create_room(room_name, user->first); - if (r == NULL) { + if (r == nullptr) { return; } if (!player_enters_room(user->first, r)) { @@ -421,7 +421,7 @@ void room_manager::process_room_part(simple_wml::document &data, const player_ma return; } room* r = require_member(room_name, user, "quit"); - if (r == NULL) return; + if (r == nullptr) return; player_exits_room(user->first, r); msg->set_attr_dup("player", user->second.name().c_str()); r->send_data(data); @@ -441,7 +441,7 @@ void room_manager::process_room_query(simple_wml::document& data, const player_m simple_wml::node& resp = doc.root().add_child("room_query_response"); simple_wml::node* q; q = msg->child("rooms"); - if (q != NULL) { + if (q != nullptr) { fill_room_list(resp); send_to_one(doc, user->first); return; @@ -451,16 +451,16 @@ void room_manager::process_room_query(simple_wml::document& data, const player_m /* room-specific queries */ room* r = require_room(room_name, user, "query"); - if (r == NULL) return; + if (r == nullptr) return; resp.set_attr_dup("room", room_name.c_str()); q = msg->child("names"); - if (q != NULL) { + if (q != nullptr) { fill_member_list(r, resp); send_to_one(doc, user->first); return; } q = msg->child("persist"); - if (q != NULL) { + if (q != nullptr) { if (user->second.is_moderator()) { WRN_LOBBY << "Attempted room set persistent by non-moderator"; } else { @@ -484,7 +484,7 @@ void room_manager::process_room_query(simple_wml::document& data, const player_m return; } q = msg->child("logged"); - if (q != NULL) { + if (q != nullptr) { if (user->second.is_moderator()) { WRN_LOBBY << "Attempted room set logged by non-moderator."; } else { @@ -508,7 +508,7 @@ void room_manager::process_room_query(simple_wml::document& data, const player_m return; } q = msg->child("topic"); - if (q != NULL) { + if (q != nullptr) { if (q->attr("value").empty()) { resp.set_attr_dup("topic", r->topic().c_str()); send_to_one(doc, user->first); diff --git a/src/server/room_manager.hpp b/src/server/room_manager.hpp index 572cb409d8e9..5d2b2212462d 100644 --- a/src/server/room_manager.hpp +++ b/src/server/room_manager.hpp @@ -75,7 +75,7 @@ class room_manager : private boost::noncopyable bool dirty() const { return dirty_; } /** - * Get a room by name, or NULL if it does not exist + * Get a room by name, or nullptr if it does not exist */ room* get_room(const std::string& name); @@ -93,7 +93,7 @@ class room_manager : private boost::noncopyable /** * Get a room by name or create that room if it does not exist and * creating rooms is allowed. - * @return a valid pointer to a room or NULL if the room did not exist and + * @return a valid pointer to a room or nullptr if the room did not exist and * could not be created. */ room* get_create_room(const std::string& name, network::connection player); @@ -126,14 +126,14 @@ class room_manager : private boost::noncopyable /** * Check if the room exists, log failures. - * @return non-NULL iff the room exists and the player is a member + * @return non-nullptr iff the room exists and the player is a member */ room* require_room(const std::string& room_name, const player_map::iterator user, const char* log_string = "use"); /** * Check if the room exists and if the player is a member, log failures. - * @return non-NULL iff the room exists and the player is a member + * @return non-nullptr iff the room exists and the player is a member */ room* require_member(const std::string& room_name, const player_map::iterator user, const char* log_string = "use"); diff --git a/src/server/sample_user_handler.cpp b/src/server/sample_user_handler.cpp index d5517a4e0a01..943ff51640a7 100644 --- a/src/server/sample_user_handler.cpp +++ b/src/server/sample_user_handler.cpp @@ -185,7 +185,7 @@ void suh::clean_up() { return; } - time_t now = time(NULL); + time_t now = time(nullptr); //A minute has 60 seconds, an hour 60 minutes and //a day 24 hours. @@ -205,7 +205,7 @@ bool suh::login(const std::string& name, const std::string& password, const std: } void suh::user_logged_in(const std::string& name) { - set_lastlogin(name, time(NULL)); + set_lastlogin(name, time(nullptr)); } void suh::password_reminder(const std::string& name) { diff --git a/src/server/sample_user_handler.hpp b/src/server/sample_user_handler.hpp index 81049c5f6594..b138ef8ea201 100644 --- a/src/server/sample_user_handler.hpp +++ b/src/server/sample_user_handler.hpp @@ -53,8 +53,8 @@ class suh : public user_handler { password(), realname(), mail(), - lastlogin(time(NULL)), - registrationdate(time(NULL)), + lastlogin(time(nullptr)), + registrationdate(time(nullptr)), is_moderator(false) {} std::string password; std::string realname; diff --git a/src/server/server.cpp b/src/server/server.cpp index 97c5d65f066d..e06d35b9c084 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -327,7 +327,7 @@ server::server(int port, const std::string& config_file, size_t min_threads, ban_manager_(), ip_log_(), failed_logins_(), - user_handler_(NULL), + user_handler_(nullptr), seeds_(), players_(), ghost_players_(), @@ -349,8 +349,8 @@ server::server(int port, const std::string& config_file, size_t min_threads, default_time_period_(0), concurrent_connections_(0), graceful_restart(false), - lan_server_(time(NULL)), - last_user_seen_time_(time(NULL)), + lan_server_(time(nullptr)), + last_user_seen_time_(time(nullptr)), restart_command(), max_ip_log_size_(0), uh_name_(), @@ -367,7 +367,7 @@ server::server(int port, const std::string& config_file, size_t min_threads, join_lobby_response_("[join_lobby]\n[/join_lobby]\n", simple_wml::INIT_COMPRESSED), games_and_users_list_("[gamelist]\n[/gamelist]\n", simple_wml::INIT_STATIC), metrics_(), - last_ping_(time(NULL)), + last_ping_(time(nullptr)), last_stats_(last_ping_), last_uh_clean_(last_ping_), cmd_handlers_() @@ -579,8 +579,8 @@ void server::load_config() { // If there is a [user_handler] tag in the config file // allow nick registration, otherwise we set user_handler_ - // to NULL. Thus we must check user_handler_ for not being - // NULL everytime we want to use it. + // to nullptr. Thus we must check user_handler_ for not being + // nullptr everytime we want to use it. user_handler_.reset(); if (const config &user_handler = cfg_.child("user_handler")) { @@ -673,7 +673,7 @@ void server::run() { } } - time_t now = time(NULL); + time_t now = time(nullptr); if (last_ping_ + network::ping_interval <= now) { if (lan_server_ && players_.empty() && last_user_seen_time_ + lan_server_ < now) { @@ -851,7 +851,7 @@ void server::run() { const size_t index = std::find(users.begin(), users.end(), pl_it->second.config_address()) - users.begin(); if (index < users.size()) { simple_wml::document diff; - if(make_delete_diff(games_and_users_list_.root(), NULL, "user", + if(make_delete_diff(games_and_users_list_.root(), nullptr, "user", pl_it->second.config_address(), diff)) { for (t_games::const_iterator g = games_.begin(); g != games_.end(); ++g) { // Note: This string is parsed by the client to identify lobby leave messages! @@ -895,7 +895,7 @@ void server::run() { connection_log ip_name = connection_log(pl_it->second.name(), ip, 0); std::deque::iterator i = std::find(ip_log_.begin(), ip_log_.end(), ip_name); if(i != ip_log_.end()) { - i->log_off = time(NULL); + i->log_off = time(nullptr); } players_.erase(pl_it); @@ -1037,7 +1037,7 @@ void server::process_login(const network::connection sock, const simple_wml::node* const login = data.child("login"); // Client must send a login first. - if (login == NULL) { + if (login == nullptr) { send_error(sock, "You must login first.", MP_MUST_LOGIN); return; } @@ -1149,7 +1149,7 @@ void server::process_login(const network::connection sock, } // This name is registered and an incorrect password provided else if(!(user_handler_->login(username, password, seeds_[sock]))) { - const time_t now = time(NULL); + const time_t now = time(nullptr); // Reset the random seed seeds_.erase(sock); @@ -1251,7 +1251,7 @@ void server::process_login(const network::connection sock, // Send other players in the lobby the update that the player has joined simple_wml::document diff; - make_add_diff(games_and_users_list_.root(), NULL, "user", diff); + make_add_diff(games_and_users_list_.root(), nullptr, "user", diff); rooms_.lobby().send_data(diff, sock); LOG_SERVER << network::ip_address(sock) << "\t" << username @@ -1423,7 +1423,7 @@ std::string server::process_command(std::string query, std::string issuer_name) // Shutdown, restart and sample commands can only be issued via the socket. void server::shut_down_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (issuer_name != "*socket*" && !allow_remote_shutdown_) { *out << denied_msg; @@ -1442,7 +1442,7 @@ void server::shut_down_handler(const std::string& issuer_name, const std::string } void server::restart_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (issuer_name != "*socket*" && !allow_remote_shutdown_) { *out << denied_msg; @@ -1464,7 +1464,7 @@ void server::restart_handler(const std::string& issuer_name, const std::string& } void server::sample_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters.empty()) { *out << "Current sample frequency: " << request_sample_frequency; @@ -1482,12 +1482,12 @@ void server::sample_handler(const std::string& issuer_name, const std::string& / } void server::help_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); *out << help_msg; } void server::stats_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); *out << "Number of games = " << games_.size() << "\nTotal number of users = " << players_.size() @@ -1495,27 +1495,27 @@ void server::stats_handler(const std::string& /*issuer_name*/, const std::string } void server::metrics_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); *out << metrics_; } void server::requests_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); metrics_.requests(*out); } void server::games_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); metrics_.games(*out); } void server::wml_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); *out << simple_wml::document::stats(); } void server::netstats_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); network::pending_statistics stats = network::get_pending_stats(); *out << "Network stats:\nPending send buffers: " @@ -1536,7 +1536,7 @@ void server::netstats_handler(const std::string& /*issuer_name*/, const std::str } void server::adminmsg_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { *out << "You must type a message."; @@ -1570,7 +1570,7 @@ void server::adminmsg_handler(const std::string& issuer_name, const std::string& } void server::pm_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); std::string::iterator first_space = std::find(parameters.begin(), parameters.end(), ' '); if (first_space == parameters.end()) { @@ -1605,7 +1605,7 @@ void server::pm_handler(const std::string& issuer_name, const std::string& /*que } void server::msg_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { *out << "You must type a message."; @@ -1625,7 +1625,7 @@ void server::msg_handler(const std::string& /*issuer_name*/, const std::string& } void server::lobbymsg_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { *out << "You must type a message."; @@ -1641,7 +1641,7 @@ void server::lobbymsg_handler(const std::string& /*issuer_name*/, const std::str } void server::status_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); *out << "STATUS REPORT for '" << parameters << "'"; bool found_something = false; @@ -1674,7 +1674,7 @@ void server::status_handler(const std::string& issuer_name, const std::string& / } void server::clones_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& /*parameters*/, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); *out << "CLONES STATUS REPORT"; std::set clones; @@ -1698,7 +1698,7 @@ void server::clones_handler(const std::string& /*issuer_name*/, const std::strin } void server::bans_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); try { @@ -1720,7 +1720,7 @@ void server::bans_handler(const std::string& /*issuer_name*/, const std::string& } void server::ban_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); bool banned = false; std::string::iterator first_space = std::find(parameters.begin(), parameters.end(), ' '); @@ -1734,7 +1734,7 @@ void server::ban_handler(const std::string& issuer_name, const std::string& /*qu const std::string target(parameters.begin(), first_space); const std::string duration(first_space + 1, second_space); - time_t parsed_time = time(NULL); + time_t parsed_time = time(nullptr); if (ban_manager_.parse_time(duration, &parsed_time) == false) { *out << "Failed to parse the ban duration: '" << duration << "'\n" << ban_manager_.get_ban_help(); @@ -1792,7 +1792,7 @@ void server::ban_handler(const std::string& issuer_name, const std::string& /*qu } void server::kickban_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); bool banned = false; std::string::iterator first_space = std::find(parameters.begin(), parameters.end(), ' '); @@ -1803,7 +1803,7 @@ void server::kickban_handler(const std::string& issuer_name, const std::string& std::string::iterator second_space = std::find(first_space + 1, parameters.end(), ' '); const std::string target(parameters.begin(), first_space); const std::string duration(first_space + 1, second_space); - time_t parsed_time = time(NULL); + time_t parsed_time = time(nullptr); if (ban_manager_.parse_time(duration, &parsed_time) == false) { *out << "Failed to parse the ban duration: '" << duration << "'\n" << ban_manager_.get_ban_help(); @@ -1875,7 +1875,7 @@ void server::kickban_handler(const std::string& issuer_name, const std::string& } void server::gban_handler(const std::string& issuer_name, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); bool banned = false; std::string::iterator first_space = std::find(parameters.begin(), parameters.end(), ' '); @@ -1891,7 +1891,7 @@ void server::gban_handler(const std::string& issuer_name, const std::string& /*q second_space = std::find(first_space + 1, parameters.end(), ' '); const std::string duration(first_space + 1, second_space); - time_t parsed_time = time(NULL); + time_t parsed_time = time(nullptr); if (ban_manager_.parse_time(duration, &parsed_time) == false) { *out << "Failed to parse the ban duration: '" << duration << "'\n" << ban_manager_.get_ban_help(); @@ -1947,7 +1947,7 @@ void server::gban_handler(const std::string& issuer_name, const std::string& /*q } void server::unban_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { *out << "You must enter an ipmask to unban."; @@ -1957,7 +1957,7 @@ void server::unban_handler(const std::string& /*issuer_name*/, const std::string } void server::ungban_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { *out << "You must enter an ipmask to ungban."; @@ -1967,7 +1967,7 @@ void server::ungban_handler(const std::string& /*issuer_name*/, const std::strin } void server::kick_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { *out << "You must enter a mask to kick."; @@ -1999,7 +1999,7 @@ void server::kick_handler(const std::string& /*issuer_name*/, const std::string& } void server::motd_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters == "") { if (motd_ != "") { @@ -2016,7 +2016,7 @@ void server::motd_handler(const std::string& /*issuer_name*/, const std::string& } void server::searchlog_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); if (parameters.empty()) { *out << "You must enter a mask to search for."; @@ -2048,7 +2048,7 @@ void server::searchlog_handler(const std::string& /*issuer_name*/, const std::st } void server::dul_handler(const std::string& /*issuer_name*/, const std::string& /*query*/, std::string& parameters, std::ostringstream *out) { - assert(out != NULL); + assert(out != nullptr); try { @@ -2094,7 +2094,7 @@ void server::process_nickserv(const network::connection sock, simple_wml::node& pl->second.mark_registered(); simple_wml::document diff; - make_change_diff(games_and_users_list_.root(), NULL, + make_change_diff(games_and_users_list_.root(), nullptr, "user", pl->second.config_address(), diff); rooms_.lobby().send_data(diff); @@ -2171,7 +2171,7 @@ void server::process_nickserv(const network::connection sock, simple_wml::node& pl->second.mark_registered(false); simple_wml::document diff; - make_change_diff(games_and_users_list_.root(), NULL, + make_change_diff(games_and_users_list_.root(), nullptr, "user", pl->second.config_address(), diff); rooms_.lobby().send_data(diff); } catch (user_handler::error& e) { @@ -2271,7 +2271,7 @@ void server::process_data_lobby(const network::connection sock, create_game->copy_into(g.level().root()); rooms_.exit_lobby(sock); simple_wml::document diff; - if(make_change_diff(games_and_users_list_.root(), NULL, + if(make_change_diff(games_and_users_list_.root(), nullptr, "user", pl->second.config_address(), diff)) { rooms_.lobby().send_data(diff); } @@ -2351,7 +2351,7 @@ void server::process_data_lobby(const network::connection sock, simple_wml::document diff; bool diff1 = make_change_diff(*games_and_users_list_.child("gamelist"), "gamelist", "game", g->description(), diff); - bool diff2 = make_change_diff(games_and_users_list_.root(), NULL, + bool diff2 = make_change_diff(games_and_users_list_.root(), nullptr, "user", pl->second.config_address(), diff); if (diff1 || diff2) { rooms_.lobby().send_data(diff); @@ -2425,7 +2425,7 @@ void server::process_data_game(const network::connection sock, // Update our config object which describes the open games, // and save a pointer to the description in the new game. simple_wml::node* const gamelist = games_and_users_list_.child("gamelist"); - assert(gamelist != NULL); + assert(gamelist != nullptr); simple_wml::node& desc = gamelist->add_child("game"); g.level().root().copy_into(desc); if (const simple_wml::node* m = data.child("multiplayer")) { @@ -2516,7 +2516,7 @@ void server::process_data_game(const network::connection sock, g.level().clear(); scenario->copy_into(g.level().root()); - if (g.description() == NULL) { + if (g.description() == nullptr) { ERR_SERVER << network::ip_address(sock) << "\tERROR: \"" << g.name() << "\" (" << g.id() << ") is initialized but has no description_.\n"; @@ -2597,7 +2597,7 @@ void server::process_data_game(const network::connection sock, simple_wml::document diff; bool diff1 = make_change_diff(*games_and_users_list_.child("gamelist"), "gamelist", "game", g.description(), diff); - bool diff2 = make_change_diff(games_and_users_list_.root(), NULL, + bool diff2 = make_change_diff(games_and_users_list_.root(), nullptr, "user", pl->second.config_address(), diff); if (diff1 || diff2) { rooms_.lobby().send_data(diff, sock); @@ -2653,7 +2653,7 @@ void server::process_data_game(const network::connection sock, return; // The owner is kicking/banning someone from the game. } else if (data.child("kick") || data.child("ban")) { - bool ban = (data.child("ban") != NULL); + bool ban = (data.child("ban") != nullptr); const network::connection user = (ban ? g.ban_user(*data.child("ban"), pl) : g.kick_member(*data.child("kick"), pl)); @@ -2671,7 +2671,7 @@ void server::process_data_game(const network::connection sock, ERR_SERVER << "ERROR: Could not find kicked player in players_." " (socket: " << user << ")\n"; } else { - make_change_diff(games_and_users_list_.root(), NULL, "user", + make_change_diff(games_and_users_list_.root(), nullptr, "user", pl2->second.config_address(), diff); } rooms_.lobby().send_data(diff, sock); @@ -2732,7 +2732,7 @@ void server::delete_game(t_games::iterator game_it) { metrics_.game_terminated(game_it->termination_reason()); simple_wml::node* const gamelist = games_and_users_list_.child("gamelist"); - assert(gamelist != NULL); + assert(gamelist != nullptr); // Send a diff of the gamelist with the game deleted to players in the lobby simple_wml::document diff; @@ -2763,7 +2763,7 @@ void server::delete_game(t_games::iterator game_it) { if (pl != players_.end()) { pl->second.mark_available(); simple_wml::document udiff; - if (make_change_diff(games_and_users_list_.root(), NULL, + if (make_change_diff(games_and_users_list_.root(), nullptr, "user", pl->second.config_address(), udiff)) { rooms_.lobby().send_data(udiff); } @@ -2804,7 +2804,7 @@ int main(int argc, char** argv) { size_t min_threads = 5; size_t max_threads = 0; - srand(static_cast(time(NULL))); + srand(static_cast(time(nullptr))); std::string config_file; diff --git a/src/server/simple_wml.cpp b/src/server/simple_wml.cpp index 28087f9d677b..b0f2a58c8ca8 100644 --- a/src/server/simple_wml.cpp +++ b/src/server/simple_wml.cpp @@ -238,7 +238,7 @@ node::node(document& doc, node* parent, const char** str, int depth) : if(s[1] == '/') { output_cache_ = string_span(begin, s - begin); s = strchr(s, ']'); - if(s == NULL) { + if(s == nullptr) { throw error("end element unterminated"); } @@ -248,7 +248,7 @@ node::node(document& doc, node* parent, const char** str, int depth) : ++s; const char* end = strchr(s, ']'); - if(end == NULL) { + if(end == nullptr) { throw error("unterminated element"); } @@ -270,13 +270,13 @@ node::node(document& doc, node* parent, const char** str, int depth) : break; case '#': s = strchr(s, '\n'); - if(s == NULL) { + if(s == nullptr) { throw error("did not find newline after '#'"); } break; default: { const char* end = strchr(s, '='); - if(end == NULL) { + if(end == nullptr) { ERR_SWML << "attribute: " << s << std::endl; throw error("did not find '=' after attribute"); } @@ -285,7 +285,7 @@ node::node(document& doc, node* parent, const char** str, int depth) : s = end + 1; if(*s == '_') { s = strchr(s, '"'); - if(s == NULL) { + if(s == nullptr) { throw error("did not find '\"' after '_'"); } } @@ -310,7 +310,7 @@ node::node(document& doc, node* parent, const char** str, int depth) : #endif ++end; } - if(end == NULL) + if(end == nullptr) throw error("did not find end of attribute"); // Stop if newline. @@ -613,7 +613,7 @@ node* node::child(const char* name) } } - return NULL; + return nullptr; } const node* node::child(const char* name) const @@ -621,14 +621,14 @@ const node* node::child(const char* name) const for(child_map::const_iterator i = children_.begin(); i != children_.end(); ++i) { if(i->first == name) { if(i->second.empty()) { - return NULL; + return nullptr; } else { return i->second.front(); } } } - return NULL; + return nullptr; } const node::child_list& node::children(const char* name) const @@ -828,7 +828,7 @@ void node::apply_diff(const node& diff) { set_dirty(); const node* inserts = diff.child("insert"); - if(inserts != NULL) { + if(inserts != nullptr) { for(attribute_list::const_iterator i = inserts->attr_.begin(); i != inserts->attr_.end(); ++i) { char* name = i->first.duplicate(); char* value = i->second.duplicate(); @@ -839,7 +839,7 @@ void node::apply_diff(const node& diff) } const node* deletes = diff.child("delete"); - if(deletes != NULL) { + if(deletes != nullptr) { for(attribute_list::const_iterator i = deletes->attr_.begin(); i != deletes->attr_.end(); ++i) { std::pair range = std::equal_range(attr_.begin(), attr_.end(), i->first, string_span_pair_comparer()); @@ -930,18 +930,18 @@ int node::nattributes_recursive() const void node::set_dirty() { - for(node* n = this; n != NULL && n->output_cache_.is_null() == false; n = n->parent_) { + for(node* n = this; n != nullptr && n->output_cache_.is_null() == false; n = n->parent_) { n->output_cache_ = string_span(); } } document::document() : compressed_buf_(), - output_(NULL), + output_(nullptr), buffers_(), - root_(new node(*this, NULL)), - prev_(NULL), - next_(NULL) + root_(new node(*this, nullptr)), + prev_(nullptr), + next_(nullptr) { attach_list(); } @@ -950,15 +950,15 @@ document::document(char* buf, INIT_BUFFER_CONTROL control) : compressed_buf_(), output_(buf), buffers_(), - root_(NULL), - prev_(NULL), - next_(NULL) + root_(nullptr), + prev_(nullptr), + next_(nullptr) { if(control == INIT_TAKE_OWNERSHIP) { buffers_.push_back(buf); } const char* cbuf = buf; - root_ = new node(*this, NULL, &cbuf); + root_ = new node(*this, nullptr, &cbuf); attach_list(); } @@ -967,15 +967,15 @@ document::document(const char* buf, INIT_STATE state) : compressed_buf_(), output_(buf), buffers_(), - root_(NULL), - prev_(NULL), - next_(NULL) + root_(nullptr), + prev_(nullptr), + next_(nullptr) { if(state == INIT_COMPRESSED) { output_compressed(); - output_ = NULL; + output_ = nullptr; } else { - root_ = new node(*this, NULL, &buf); + root_ = new node(*this, nullptr, &buf); } attach_list(); @@ -983,18 +983,18 @@ document::document(const char* buf, INIT_STATE state) : document::document(string_span compressed_buf) : compressed_buf_(compressed_buf), - output_(NULL), + output_(nullptr), buffers_(), - root_(NULL), - prev_(NULL), - next_(NULL) + root_(nullptr), + prev_(nullptr), + next_(nullptr) { string_span uncompressed_buf; buffers_.push_back(uncompress_buffer(compressed_buf, &uncompressed_buf)); output_ = uncompressed_buf.begin(); const char* cbuf = output_; try { - root_ = new node(*this, NULL, &cbuf); + root_ = new node(*this, nullptr, &cbuf); } catch(...) { delete [] buffers_.front(); buffers_.clear(); @@ -1072,7 +1072,7 @@ const char* document::output() string_span document::output_compressed(bool bzip2) { if(compressed_buf_.empty() == false && - (root_ == NULL || root_->is_dirty() == false)) { + (root_ == nullptr || root_->is_dirty() == false)) { assert(*compressed_buf_.begin() == (bzip2 ? 'B' : 31)); return compressed_buf_; } @@ -1087,8 +1087,8 @@ void document::compress() { output_compressed(); debug_delete(root_); - root_ = NULL; - output_ = NULL; + root_ = nullptr; + output_ = nullptr; std::vector new_buffers; for(std::vector::iterator i = buffers_.begin(); i != buffers_.end(); ++i) { if(*i != compressed_buf_.begin()) { @@ -1104,16 +1104,16 @@ void document::compress() void document::generate_root() { - if(output_ == NULL) { + if(output_ == nullptr) { assert(compressed_buf_.empty() == false); string_span uncompressed_buf; buffers_.push_back(uncompress_buffer(compressed_buf_, &uncompressed_buf)); output_ = uncompressed_buf.begin(); } - assert(root_ == NULL); + assert(root_ == nullptr); const char* cbuf = output_; - root_ = new node(*this, NULL, &cbuf); + root_ = new node(*this, nullptr, &cbuf); } document* document::clone() @@ -1137,9 +1137,9 @@ void document::swap(document& o) void document::clear() { compressed_buf_ = string_span(); - output_ = NULL; + output_ = nullptr; debug_delete(root_); - root_ = new node(*this, NULL); + root_ = new node(*this, nullptr); for(std::vector::iterator i = buffers_.begin(); i != buffers_.end(); ++i) { delete [] *i; } @@ -1148,12 +1148,12 @@ void document::clear() } namespace { -document* head_doc = NULL; +document* head_doc = nullptr; } void document::attach_list() { - prev_ = NULL; + prev_ = nullptr; next_ = head_doc; if(next_) { @@ -1175,7 +1175,7 @@ void document::detach_list() if(prev_) { prev_->next_ = next_; } - next_ = prev_ = NULL; + next_ = prev_ = nullptr; } std::string document::stats() @@ -1190,7 +1190,7 @@ std::string document::stats() int nnodes = 0; int ndirty = 0; int nattributes = 0; - for(document* d = head_doc; d != NULL; d = d->next_) { + for(document* d = head_doc; d != nullptr; d = d->next_) { ndocs++; nbuffers += d->buffers_.size(); diff --git a/src/server/simple_wml.hpp b/src/server/simple_wml.hpp index c609fa846386..ba5852cdab16 100644 --- a/src/server/simple_wml.hpp +++ b/src/server/simple_wml.hpp @@ -34,7 +34,7 @@ struct error : public game::error { class string_span { public: - string_span() : str_(NULL), size_(0) + string_span() : str_(nullptr), size_(0) {} string_span(const char* str, int size) : str_(str), size_(size) {} @@ -92,7 +92,7 @@ class string_span int size() const { return size_; } bool empty() const { return size_ == 0; } - bool is_null() const { return str_ == NULL; } + bool is_null() const { return str_ == nullptr; } bool to_bool(bool default_value=false) const; int to_int() const; diff --git a/src/server/user_handler.cpp b/src/server/user_handler.cpp index 3ed360979728..81bdbbb3c276 100644 --- a/src/server/user_handler.cpp +++ b/src/server/user_handler.cpp @@ -38,7 +38,7 @@ void user_handler::init_mailer(const config &) { } std::string user_handler::create_salt(int length) { - srand(static_cast(time(NULL))); + srand(static_cast(time(nullptr))); std::stringstream ss; diff --git a/src/settings.hpp b/src/settings.hpp index 8c1dff7e66c2..57bcbffa409a 100644 --- a/src/settings.hpp +++ b/src/settings.hpp @@ -58,7 +58,7 @@ namespace settings { * * @returns the village gold */ - int get_village_gold(const std::string& value, const game_classification* classification = NULL); + int get_village_gold(const std::string& value, const game_classification* classification = nullptr); /** * Gets the village unit level support. diff --git a/src/show_dialog.cpp b/src/show_dialog.cpp index 9b6aea63388d..0282375a2d14 100644 --- a/src/show_dialog.cpp +++ b/src/show_dialog.cpp @@ -87,7 +87,7 @@ dialog_frame::dialog_frame(CVideo& video, const std::string& title, dialog_style_(style), buttons_(buttons), help_button_(help_button), - restorer_(NULL), + restorer_(nullptr), auto_restore_(auto_restore), dim_(), #ifdef SDL_GPU @@ -111,7 +111,7 @@ dialog_frame::dialog_frame(CVideo& video, const std::string& title, top_right_(image::get_image("dialogs/" + dialog_style_.panel + "-border-topright.png")), bot_right_(image::get_image("dialogs/" + dialog_style_.panel + "-border-botright.png")), bg_(image::get_image("dialogs/" + dialog_style_.panel + "-background.png")), - have_border_(top_ != NULL && bot_ != NULL && left_ != NULL && right_ != NULL), + have_border_(top_ != nullptr && bot_ != nullptr && left_ != nullptr && right_ != nullptr), dirty_(true) #endif { @@ -181,7 +181,7 @@ void dialog_frame::handle_event(const SDL_Event& event) { int dialog_frame::bottom_padding() const { int padding = 0; - if(buttons_ != NULL) { + if(buttons_ != nullptr) { for(std::vector::const_iterator b = buttons_->begin(); b != buttons_->end(); ++b) { padding = std::max((**b).height() + ButtonVPadding, padding); } @@ -199,10 +199,10 @@ int dialog_frame::bottom_padding() const { dialog_frame::dimension_measurements dialog_frame::layout(int x, int y, int w, int h) { dim_ = dimension_measurements(); if(!title_.empty()) { - dim_.title = draw_title(NULL); + dim_.title = draw_title(nullptr); dim_.title.w += title_border_w; } - if(buttons_ != NULL) { + if(buttons_ != nullptr) { for(std::vector::const_iterator b = buttons_->begin(); b != buttons_->end(); ++b) { dim_.button_row.w += (**b).width() + ButtonHPadding; dim_.button_row.h = std::max((**b).height() + ButtonVPadding,dim_.button_row.h); @@ -216,7 +216,7 @@ dialog_frame::dimension_measurements dialog_frame::layout(int x, int y, int w, i size_t buttons_width = dim_.button_row.w; - if(help_button_ != NULL) { + if(help_button_ != nullptr) { buttons_width += help_button_->width() + ButtonHPadding*2; dim_.button_row.y = y + h; } @@ -312,31 +312,31 @@ void dialog_frame::draw_border() #else surface top_image(scale_surface(top_, dim_.interior.w, top_->h)); - if(top_image != NULL) { + if(top_image != nullptr) { video_.blit_surface(dim_.interior.x, dim_.exterior.y, top_image); } surface bot_image(scale_surface(bot_, dim_.interior.w, bot_->h)); - if(bot_image != NULL) { + if(bot_image != nullptr) { video_.blit_surface(dim_.interior.x, dim_.interior.y + dim_.interior.h, bot_image); } surface left_image(scale_surface(left_, left_->w, dim_.interior.h)); - if(left_image != NULL) { + if(left_image != nullptr) { video_.blit_surface(dim_.exterior.x, dim_.interior.y, left_image); } surface right_image(scale_surface(right_, right_->w, dim_.interior.h)); - if(right_image != NULL) { + if(right_image != nullptr) { video_.blit_surface(dim_.interior.x + dim_.interior.w, dim_.interior.y, right_image); } update_rect(dim_.exterior); - if(top_left_ == NULL || bot_left_ == NULL || top_right_ == NULL || bot_right_ == NULL) { + if(top_left_ == nullptr || bot_left_ == nullptr || top_right_ == nullptr || bot_right_ == nullptr) { return; } @@ -350,7 +350,7 @@ void dialog_frame::draw_border() void dialog_frame::clear_background() { delete restorer_; - restorer_ = NULL; + restorer_ = nullptr; } void dialog_frame::draw_background() @@ -363,7 +363,7 @@ void dialog_frame::draw_background() if (dialog_style_.blur_radius) { surface surf = ::get_surface_portion(video_.getSurface(), dim_.exterior); surf = blur_surface(surf, dialog_style_.blur_radius, false); - sdl_blit(surf, NULL, video_.getSurface(), &dim_.exterior); + sdl_blit(surf, nullptr, video_.getSurface(), &dim_.exterior); } #ifdef SDL_GPU @@ -384,7 +384,7 @@ void dialog_frame::draw_background() } } #else - if(bg_ == NULL) { + if(bg_ == nullptr) { ERR_DP << "could not find dialog background '" << dialog_style_.panel << "'" << std::endl; return; } @@ -427,7 +427,7 @@ void dialog_frame::draw() //draw buttons SDL_Rect buttons_area = dim_.button_row; - if(buttons_ != NULL) { + if(buttons_ != nullptr) { #ifdef OK_BUTTON_ON_RIGHT std::reverse(buttons_->begin(),buttons_->end()); #endif @@ -437,7 +437,7 @@ void dialog_frame::draw() } } - if(help_button_ != NULL) { + if(help_button_ != nullptr) { help_button_->set_location(dim_.interior.x+ButtonHPadding, buttons_area.y); } diff --git a/src/show_dialog.hpp b/src/show_dialog.hpp index db87b8c8789c..eb5695940d5d 100644 --- a/src/show_dialog.hpp +++ b/src/show_dialog.hpp @@ -73,8 +73,8 @@ class dialog_frame :public video2::draw_layering { dialog_frame(CVideo &video, const std::string& title="", const style& dialog_style=default_style, - bool auto_restore=true, std::vector* buttons=NULL, - button* help_button=NULL); + bool auto_restore=true, std::vector* buttons=nullptr, + button* help_button=nullptr); ~dialog_frame(); dimension_measurements layout(int x, int y, int w, int h); @@ -119,7 +119,7 @@ class dialog_frame :public video2::draw_layering { bool dirty_; }; -//frame_measurements draw_dialog_frame(int x, int y, int w, int h, CVideo &video, const std::string* dialog_style=NULL, surface_restorer* restorer=NULL); +//frame_measurements draw_dialog_frame(int x, int y, int w, int h, CVideo &video, const std::string* dialog_style=nullptr, surface_restorer* restorer=nullptr); //SDL_Rect draw_dialog_background(int x, int y, int w, int h, CVideo &video, const std::string& dialog_style); @@ -137,11 +137,11 @@ class dialog_frame :public video2::draw_layering { //if 'restorer' is present, it will be set to a restorer that will reset the screen area //to its original state after the dialog is drawn. //void draw_dialog(int x, int y, int w, int h, CVideo &video, const std::string& title, - // const std::string* dialog_style=NULL, std::vector* buttons=NULL, - // surface_restorer* restorer=NULL, button* help_button=NULL, label** label_widget); + // const std::string* dialog_style=nullptr, std::vector* buttons=nullptr, + // surface_restorer* restorer=nullptr, button* help_button=nullptr, label** label_widget); //void draw_dialog(frame_measurements &fm, CVideo &video, const std::string& title, - // const std::string* dialog_style=NULL, std::vector* buttons=NULL, - // surface_restorer* restorer=NULL, button* help_button=NULL, label** label_widget); + // const std::string* dialog_style=nullptr, std::vector* buttons=nullptr, + // surface_restorer* restorer=nullptr, button* help_button=nullptr, label** label_widget); class dialog_button_action { @@ -189,18 +189,18 @@ class preview_pane : public widget { int show_dialog(CVideo& video, surface image, const std::string& caption, const std::string& message, DIALOG_TYPE type=MESSAGE, - const std::vector* menu_items=NULL, - const std::vector* preview_panes=NULL, + const std::vector* menu_items=nullptr, + const std::vector* preview_panes=nullptr, const std::string& text_widget_label="", - std::string* text_widget_text=NULL, + std::string* text_widget_text=nullptr, const int text_widget_max_chars = 256, - std::vector* options=NULL, + std::vector* options=nullptr, int xloc=-1, int yloc=-1, - const dialog_frame::style* dialog_style=NULL, - std::vector* buttons=NULL, - const menu::sorter* sorter=NULL, - menu::style* menu_style=NULL + const dialog_frame::style* dialog_style=nullptr, + std::vector* buttons=nullptr, + const menu::sorter* sorter=nullptr, + menu::style* menu_style=nullptr ); void check_quit(CVideo &video); diff --git a/src/side_filter.cpp b/src/side_filter.cpp index 1cca678cd677..57cf73364e61 100644 --- a/src/side_filter.cpp +++ b/src/side_filter.cpp @@ -48,7 +48,7 @@ side_filter::side_filter() : cfg_(vconfig::unconstructed_vconfig()) , flat_() , side_string_() - , fc_(NULL) + , fc_(nullptr) { assert(false); } diff --git a/src/sound.cpp b/src/sound.cpp index 297ceea01408..28bb4c1fcced 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -97,7 +97,7 @@ static void increment_chunk_usage(Mix_Chunk* mcp) { } static void decrement_chunk_usage(Mix_Chunk* mcp) { - if(mcp == NULL) return; + if(mcp == nullptr) return; std::map< Mix_Chunk*, int >::iterator this_usage = chunk_usage.find(mcp); assert(this_usage != chunk_usage.end()); if(--(this_usage->second) == 0) { @@ -110,7 +110,7 @@ namespace { class sound_cache_chunk { public: - sound_cache_chunk(const std::string& f) : group(sound::NULL_CHANNEL), file(f), data_(NULL) {} + sound_cache_chunk(const std::string& f) : group(sound::NULL_CHANNEL), file(f), data_(nullptr) {} sound_cache_chunk(const sound_cache_chunk& scc) : group(scc.group), file(scc.file), data_(scc.data_) { @@ -309,7 +309,7 @@ namespace sound { // Removes channel-chunk and channel-id mapping static void channel_finished_hook(int channel) { - channel_chunks[channel] = NULL; + channel_chunks[channel] = nullptr; channel_ids[channel] = -1; } @@ -331,7 +331,7 @@ bool init_sound() { Mix_ReserveChannels(n_reserved_channels); channel_chunks.clear(); - channel_chunks.resize(n_of_channels, NULL); + channel_chunks.resize(n_of_channels, nullptr); channel_ids.resize(n_of_channels, -1); Mix_GroupChannel(bell_channel, SOUND_BELL); @@ -510,7 +510,7 @@ static void play_new_music() SDL_RWops *rwops = filesystem::load_RWops(filename); Mix_Music* const music = Mix_LoadMUSType_RW(rwops, MUS_NONE, true); // SDL takes ownership of rwops - if(music == NULL) { + if(music == nullptr) { ERR_AUDIO << "Could not load music file '" << filename << "': " << Mix_GetError() << "\n"; return; @@ -740,7 +740,7 @@ static Mix_Chunk* load_chunk(const std::string& file, channel_group group) throw chunk_load_exception(); } - if (temp_chunk.get_data() == NULL) { + if (temp_chunk.get_data() == nullptr) { ERR_AUDIO << "Could not load sound file '" << filename << "': " << Mix_GetError() << "\n"; throw chunk_load_exception(); diff --git a/src/sound_music_track.cpp b/src/sound_music_track.cpp index b570e64e75a3..8bbf22517e9c 100644 --- a/src/sound_music_track.cpp +++ b/src/sound_music_track.cpp @@ -89,14 +89,14 @@ void music_track::resolve() if (title_.empty()) { FILE* f; f = fopen(file_path_.c_str(), "r"); - if (f == NULL) { + if (f == nullptr) { LOG_AUDIO << "Error opening file '" << file_path_ << "' for track identification\n"; return; } OggVorbis_File vf; - if(ov_open(f, &vf, NULL, 0) < 0) { + if(ov_open(f, &vf, nullptr, 0) < 0) { LOG_AUDIO << "track does not appear to be an Ogg file '" << id_ << "', cannot be identified\n"; ov_clear(&vf); diff --git a/src/statistics.hpp b/src/statistics.hpp index 143fe8ead158..e71c1af8721e 100644 --- a/src/statistics.hpp +++ b/src/statistics.hpp @@ -111,7 +111,7 @@ namespace statistics void reset_turn_stats(const std::string & save_id); stats calculate_stats(const std::string & save_id); - /// Stats (and name) for each scenario. The pointers are never NULL. + /// Stats (and name) for each scenario. The pointers are never nullptr. typedef std::vector< std::pair > levels; /// Returns a list of names and stats for each scenario in the current campaign. levels level_stats(const std::string & save_id); diff --git a/src/statistics_dialog.cpp b/src/statistics_dialog.cpp index 2df4a45a2ce9..9456c88365f9 100644 --- a/src/statistics_dialog.cpp +++ b/src/statistics_dialog.cpp @@ -317,9 +317,9 @@ void statistics_dialog::do_scene_selection() // Let the player choose a scenario. SDL_Rect const &loc = scene_btn_->location(); - size_t new_scenario = gui::show_dialog(get_video(), NULL, "", "", - gui::MESSAGE, &names, NULL, "", NULL, - -1, NULL, loc.x, loc.y + loc.h); + size_t new_scenario = gui::show_dialog(get_video(), nullptr, "", "", + gui::MESSAGE, &names, nullptr, "", nullptr, + -1, nullptr, loc.x, loc.y + loc.h); if ( new_scenario != scenario_index_ && new_scenario < scenarios_.size() ) { diff --git a/src/storyscreen/controller.cpp b/src/storyscreen/controller.cpp index 4a5ccefb4ad1..99614e515264 100644 --- a/src/storyscreen/controller.cpp +++ b/src/storyscreen/controller.cpp @@ -51,7 +51,7 @@ controller::controller(CVideo& video, const vconfig& data, const std::string& sc , segment_index_(segment_index) , parts_() { - ASSERT_LOG(resources::gamedata != NULL, "Ouch: gamedata is NULL when initializing storyscreen controller"); + ASSERT_LOG(resources::gamedata != nullptr, "Ouch: gamedata is nullptr when initializing storyscreen controller"); resolve_wml(data); } @@ -161,7 +161,7 @@ STORY_RESULT controller::show(START_POSITION startpos) #ifndef LOW_MEM std::vector< render_pointer_type > uis_; BOOST_FOREACH(part_pointer_type p, parts_) { - ASSERT_LOG( p != NULL, "Ouch: hit NULL storyscreen part in collection" ); + ASSERT_LOG( p != nullptr, "Ouch: hit nullptr storyscreen part in collection" ); render_pointer_type const rpt(new part_ui(*p, video_, next_button, back_button, play_button)); uis_.push_back(rpt); } diff --git a/src/storyscreen/part.cpp b/src/storyscreen/part.cpp index db338063162c..ce292bacb85a 100644 --- a/src/storyscreen/part.cpp +++ b/src/storyscreen/part.cpp @@ -92,7 +92,7 @@ floating_image::render_input floating_image::get_render_input(double xscale, dou #else render_input ri = { {0,0,0,0}, - file_.empty() ? NULL : image::get_image(file_) + file_.empty() ? nullptr : image::get_image(file_) }; if(!ri.image.null()) { diff --git a/src/storyscreen/render.cpp b/src/storyscreen/render.cpp index a19f80a987b0..e4efb5d069fd 100644 --- a/src/storyscreen/render.cpp +++ b/src/storyscreen/render.cpp @@ -105,7 +105,7 @@ part_ui::part_ui(part &p, CVideo& video, gui::button &next_button, , background_images_() , background_positions_() #else - , background_(NULL) + , background_(nullptr) #endif , imgs_() , has_background_(false) @@ -256,7 +256,7 @@ void part_ui::prepare_background() } blit_surface(layer, &srect, background_, &drect); - ASSERT_LOG(layer.null() == false, "Oops: a storyscreen part background layer got NULL"); + ASSERT_LOG(layer.null() == false, "Oops: a storyscreen part background layer got nullptr"); if (bl.is_base_layer() || no_base_yet) { x_scale_factor_ = x_scale_factor; @@ -314,7 +314,7 @@ void part_ui::render_background() 0, 0, video_.getx(), video_.gety(), 0, 0, 0, 1.0, video_.getSurface() ); - sdl_blit(background_, NULL, video_.getSurface(), NULL); + sdl_blit(background_, nullptr, video_.getSurface(), nullptr); // Render the titlebox over the background render_title_box(); } @@ -364,7 +364,7 @@ bool part_ui::render_floating_images() for (size_t i = 0; i <= fi_n; i++) { floating_image::render_input& old_ri = imgs_[i]; - sdl_blit(old_ri.image, NULL, video_.getSurface(), &old_ri.rect); + sdl_blit(old_ri.image, nullptr, video_.getSurface(), &old_ri.rect); update_rect(old_ri.rect); } } @@ -580,8 +580,8 @@ void part_ui::render_story_box_borders(SDL_Rect& update_area) const part::BLOCK_LOCATION tbl = p_.story_text_location(); if(has_background_) { - surface border_top = NULL; - surface border_bottom = NULL; + surface border_top = nullptr; + surface border_bottom = nullptr; if(tbl == part::BLOCK_BOTTOM || tbl == part::BLOCK_MIDDLE) { border_top = image::get_image(storybox_top_border_path); diff --git a/src/synced_commands.cpp b/src/synced_commands.cpp index 0dfb1b0dbb60..ed7bc64aaae5 100644 --- a/src/synced_commands.cpp +++ b/src/synced_commands.cpp @@ -312,7 +312,7 @@ SYNCED_COMMAND_HANDLER_FUNCTION(move, child, use_undo, show, error_handler) { show_move = show_move && preferences::show_ai_moves(); } - actions::move_unit_from_replay(steps, use_undo ? resources::undo_stack : NULL, skip_sighted, skip_ally_sighted, show_move); + actions::move_unit_from_replay(steps, use_undo ? resources::undo_stack : nullptr, skip_sighted, skip_ally_sighted, show_move); return true; } diff --git a/src/synced_context.cpp b/src/synced_context.cpp index 51444d3e8bcf..0640d399d7ed 100644 --- a/src/synced_context.cpp +++ b/src/synced_context.cpp @@ -529,7 +529,7 @@ leave_synced_context::~leave_synced_context() } set_scontext_unsynced::set_scontext_unsynced() - : leaver_(synced_context::is_synced() ? new leave_synced_context() : NULL) + : leaver_(synced_context::is_synced() ? new leave_synced_context() : nullptr) { } diff --git a/src/team.cpp b/src/team.cpp index 11bb9986fbb5..14cdf1863b9d 100644 --- a/src/team.cpp +++ b/src/team.cpp @@ -439,7 +439,7 @@ int team::minimum_recruit_price() const bool team::calculate_enemies(size_t index) const { - if(teams == NULL || index >= teams->size()) { + if(teams == nullptr || index >= teams->size()) { return false; } @@ -547,7 +547,7 @@ void team::change_team(const std::string &name, const t_string &user_name) void team::clear_caches(){ // Reset the cache of allies for all teams - if(teams != NULL) { + if(teams != nullptr) { for(std::vector::const_iterator i = teams->begin(); i != teams->end(); ++i) { i->enemies_.clear(); i->ally_shroud_.clear(); @@ -655,7 +655,7 @@ void team::remove_fog_override(const std::set &hexes) void validate_side(int side) { - if(teams == NULL) { + if(teams == nullptr) { return; } @@ -840,7 +840,7 @@ std::string team::get_side_color_index(int side) { size_t index = size_t(side-1); - if(teams != NULL && index < teams->size()) { + if(teams != nullptr && index < teams->size()) { const std::string side_map = (*teams)[index].color(); if(!side_map.empty()) { return side_map; diff --git a/src/team.hpp b/src/team.hpp index b27c8bcb7e92..c7d2e76572fd 100644 --- a/src/team.hpp +++ b/src/team.hpp @@ -182,7 +182,7 @@ class team : public savegame::savegame_config void write(config& cfg) const; - bool get_village(const map_location&, const int owner_side, game_data * fire_event); //!< Acquires a village from owner_side. Pointer fire_event should be the game_data for the game if it is desired to fire an event -- a "capture" event with owner_side variable scoped in will be fired. For no event, pass it NULL. Default is the resources::gamedata pointer + bool get_village(const map_location&, const int owner_side, game_data * fire_event); //!< Acquires a village from owner_side. Pointer fire_event should be the game_data for the game if it is desired to fire an event -- a "capture" event with owner_side variable scoped in will be fired. For no event, pass it nullptr. Default is the resources::gamedata pointer void lose_village(const map_location&); void clear_villages() { villages_.clear(); } const std::set& villages() const { return villages_; } diff --git a/src/teambuilder.cpp b/src/teambuilder.cpp index f0e67a70e558..4cdef76e2ac3 100644 --- a/src/teambuilder.cpp +++ b/src/teambuilder.cpp @@ -48,7 +48,7 @@ class team_builder { , seen_ids_() , side_(0) , side_cfg_(side_cfg) - , t_(NULL) + , t_(nullptr) , teams_(teams) , unit_configs_() { @@ -65,7 +65,7 @@ class team_builder { //create a new instance of team and push it to back of resources::teams vector new_team(); - assert(t_!=NULL); + assert(t_!=nullptr); //set team objectives if necessary objectives(); diff --git a/src/terrain/builder.cpp b/src/terrain/builder.cpp index db06492e5204..acca2d1c0e0b 100644 --- a/src/terrain/builder.cpp +++ b/src/terrain/builder.cpp @@ -87,7 +87,7 @@ static map_location legacy_difference(const map_location & me, const map_locatio */ terrain_builder::building_ruleset terrain_builder::building_rules_; -const config* terrain_builder::rules_cfg_ = NULL; +const config* terrain_builder::rules_cfg_ = nullptr; terrain_builder::rule_image::rule_image(int layer, int x, int y, bool global_image, int cx, int cy, bool is_water) : layer(layer), @@ -309,7 +309,7 @@ const terrain_builder::imagelist *terrain_builder::get_terrain_at(const map_loca const std::string &tod, const TERRAIN_TYPE terrain_type) { if(!tile_map_.on_map(loc)) - return NULL; + return nullptr; tile& tile_at = tile_map_[loc]; @@ -325,7 +325,7 @@ const terrain_builder::imagelist *terrain_builder::get_terrain_at(const map_loca return &img_list; } - return NULL; + return nullptr; } bool terrain_builder::update_animation(const map_location &loc) @@ -730,7 +730,7 @@ terrain_builder::terrain_constraint &terrain_builder::add_constraints( const map_location& loc, const t_translation::t_match& type, const config& global_images) { - terrain_constraint *cons = NULL; + terrain_constraint *cons = nullptr; BOOST_FOREACH(terrain_constraint &c, constraints) { if (c.loc == loc) { cons = &c; @@ -1150,7 +1150,7 @@ void terrain_builder::build_terrains() // and later try to apply the rule only on them size_t min_size = INT_MAX; t_translation::t_list min_types = t_translation::t_list(); // <-- This must be explicitly initialized, just as min_constraint is, at start of loop, or we get a null pointer dereference when we go through on later times. - const terrain_constraint *min_constraint = NULL; + const terrain_constraint *min_constraint = nullptr; BOOST_FOREACH(const terrain_constraint &constraint, rule.constraints) { @@ -1207,5 +1207,5 @@ terrain_builder::tile* terrain_builder::get_tile(const map_location &loc) { if(tile_map_.on_map(loc)) return &(tile_map_[loc]); - return NULL; + return nullptr; } diff --git a/src/terrain/builder.hpp b/src/terrain/builder.hpp index 21f7de708d9d..8ec6be5014ff 100644 --- a/src/terrain/builder.hpp +++ b/src/terrain/builder.hpp @@ -114,7 +114,7 @@ class terrain_builder * before, or after the unit sprite. * * @return Returns a pointer list of animated images corresponding - * to the parameters, or NULL if there is none. + * to the parameters, or nullptr if there is none. */ const imagelist *get_terrain_at(const map_location &loc, const std::string &tod, TERRAIN_TYPE const terrain_type); @@ -302,7 +302,7 @@ class terrain_builder * * @param tod The current time-of-day */ - void rebuild_cache(const std::string &tod, logs* log = NULL); + void rebuild_cache(const std::string &tod, logs* log = nullptr); /** Clears all data in this tile, and resets the cache */ void clear(); diff --git a/src/terrain/filter.cpp b/src/terrain/filter.cpp index 8cc94460af7c..12ad44b7d244 100644 --- a/src/terrain/filter.cpp +++ b/src/terrain/filter.cpp @@ -50,7 +50,7 @@ terrain_filter::~terrain_filter() #pragma warning(disable:4413) terrain_filter::terrain_filter(): cfg_(vconfig::unconstructed_vconfig()), - fc_(NULL), + fc_(nullptr), cache_(), max_loop_(), flat_() @@ -102,8 +102,8 @@ terrain_filter& terrain_filter::operator=(const terrain_filter& other) } terrain_filter::terrain_filter_cache::terrain_filter_cache() : - parsed_terrain(NULL), - adjacent_matches(NULL), + parsed_terrain(nullptr), + adjacent_matches(nullptr), adjacent_match_cache(), ufilter_() {} @@ -124,7 +124,7 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x return false; if(cfg_.has_attribute("terrain")) { - if(cache_.parsed_terrain == NULL) { + if(cache_.parsed_terrain == nullptr) { cache_.parsed_terrain = new t_translation::t_match(cfg_["terrain"]); } if(!cache_.parsed_terrain->is_empty) { @@ -149,7 +149,7 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x bool found = false; BOOST_FOREACH(const config &cfg, vi.as_array()) { - if (map_location(cfg, NULL) == loc) { + if (map_location(cfg, nullptr) == loc) { found = true; break; } @@ -214,7 +214,7 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x for (j = dirs.begin(); j != j_end; ++j) { map_location &adj = adjacent[*j]; if (fc_->get_disp_context().map().on_board(adj)) { - if(cache_.adjacent_matches == NULL) { + if(cache_.adjacent_matches == nullptr) { while(index >= std::distance(cache_.adjacent_match_cache.begin(), cache_.adjacent_match_cache.end())) { const vconfig& adj_cfg = adj_cfgs[cache_.adjacent_match_cache.size()]; std::pair > amc_pair( @@ -463,7 +463,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); BOOST_FOREACH(const config& cfg, vi.as_array()) { - map_location test_loc(cfg, NULL); + map_location test_loc(cfg, nullptr); match_set.insert(test_loc); } } @@ -500,7 +500,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); BOOST_FOREACH(const config& cfg, vi.as_array()) { - map_location test_loc(cfg, NULL); + map_location test_loc(cfg, nullptr); if (match_set.count(test_loc)) { findin_locs.insert(test_loc); } @@ -544,7 +544,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); BOOST_FOREACH(const config& cfg, vi.as_array()) { - map_location test_loc(cfg, NULL); + map_location test_loc(cfg, nullptr); if (area.count(test_loc) != 0) match_set.insert(test_loc); } @@ -574,7 +574,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); BOOST_FOREACH(const config &cfg, vi.as_array()) { - map_location test_loc(cfg, NULL); + map_location test_loc(cfg, nullptr); if (area.count(test_loc) != 0 && xy_set.count(test_loc) != 0) match_set.insert(test_loc); } @@ -588,7 +588,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde //handle location filter if(cfg_.has_child("filter_adjacent_location")) { - if(cache_.adjacent_matches == NULL) { + if(cache_.adjacent_matches == nullptr) { cache_.adjacent_matches = new std::vector >(); } const vconfig::child_list& adj_cfgs = cfg_.get_children("filter_adjacent_location"); diff --git a/src/tests/gui/fire_event.cpp b/src/tests/gui/fire_event.cpp index fc6475901371..05d7d8c44c7c 100644 --- a/src/tests/gui/fire_event.cpp +++ b/src/tests/gui/fire_event.cpp @@ -80,7 +80,7 @@ static void add_widget(gui2::tgrid& grid , const unsigned row , const unsigned column) { - BOOST_REQUIRE_NE(widget, static_cast(NULL)); + BOOST_REQUIRE_NE(widget, static_cast(nullptr)); widget->set_id(id); grid.set_child(widget diff --git a/src/tests/gui/iterator.cpp b/src/tests/gui/iterator.cpp index c94f64be4ac1..cb80af6ca291 100644 --- a/src/tests/gui/iterator.cpp +++ b/src/tests/gui/iterator.cpp @@ -109,7 +109,7 @@ static void add_widget(gui2::tgrid& grid , const unsigned row , const unsigned column) { - BOOST_REQUIRE_NE(widget, static_cast(NULL)); + BOOST_REQUIRE_NE(widget, static_cast(nullptr)); widget->set_id(id); grid.set_child(widget diff --git a/src/tests/gui/test_gui2.cpp b/src/tests/gui/test_gui2.cpp index 6b4ec3b31f1f..1d4299289a15 100644 --- a/src/tests/gui/test_gui2.cpp +++ b/src/tests/gui/test_gui2.cpp @@ -209,7 +209,7 @@ namespace { try { dlg->show(video, interact); gui2::twindow* window = gui2::unit_test_window((*dlg.get())); - BOOST_REQUIRE_NE(window, static_cast(NULL)); + BOOST_REQUIRE_NE(window, static_cast(nullptr)); window->draw(); } catch(gui2::tlayout_exception_width_modified&) { exception = "gui2::tlayout_exception_width_modified"; @@ -439,14 +439,14 @@ BOOST_AUTO_TEST_CASE(test_gui2) /* * The unit attack unit test are disabled for now, they calling parameters - * don't allow 'NULL's needs to be fixed. + * don't allow 'nullptr's needs to be fixed. */ list.erase( std::remove(list.begin(), list.end(), "unit_attack") , list.end()); /* * The chat log unit test are disabled for now, they calling parameters - * don't allow 'NULL's needs to be fixed. + * don't allow 'nullptr's needs to be fixed. */ list.erase( std::remove(list.begin(), list.end(), "chat_log") @@ -571,7 +571,7 @@ struct twrapper static config cfg; static vconfig vcfg(cfg); - return new gui2::tchat_log(vcfg, NULL); + return new gui2::tchat_log(vcfg, nullptr); } }; @@ -729,7 +729,7 @@ struct twrapper { static gui2::tmp_change_control* create() { - return new gui2::tmp_change_control(NULL); + return new gui2::tmp_change_control(nullptr); } }; diff --git a/src/tests/gui/visitor.cpp b/src/tests/gui/visitor.cpp index 37719bcbd1f6..78b40a6439c5 100644 --- a/src/tests/gui/visitor.cpp +++ b/src/tests/gui/visitor.cpp @@ -30,7 +30,7 @@ static void add_widget(gui2::tgrid& grid , const unsigned row , const unsigned column) { - BOOST_REQUIRE_NE(widget, static_cast(NULL)); + BOOST_REQUIRE_NE(widget, static_cast(nullptr)); widget->set_id(id); grid.set_child(widget @@ -49,7 +49,7 @@ static void test_control() T control; boost::scoped_ptr visitor(control.create_walker()); - BOOST_REQUIRE_NE(visitor.get(), static_cast(NULL)); + BOOST_REQUIRE_NE(visitor.get(), static_cast(nullptr)); /***** INITIAL STATE *****/ @@ -58,8 +58,8 @@ static void test_control() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), true); BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::widget), &control); - BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::grid), static_cast(NULL)); - BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::grid), static_cast(nullptr)); + BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); /***** VISITING WIDGET *****/ @@ -71,9 +71,9 @@ static void test_control() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::grid), true); BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), true); - BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::widget), static_cast(NULL)); - BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::grid), static_cast(NULL)); - BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::widget), static_cast(nullptr)); + BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::grid), static_cast(nullptr)); + BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); /***** POST END *****/ @@ -107,7 +107,7 @@ static void test_grid() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), false); - BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child)->id(), "(1,1)"); /***** LABEL 2,1 *****/ @@ -116,7 +116,7 @@ static void test_grid() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), false); - BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child)->id(), "(2,1)"); /***** LABEL 1,2 *****/ @@ -125,7 +125,7 @@ static void test_grid() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), false); - BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child)->id(), "(1,2)"); /***** LABEL 2,2 *****/ @@ -134,7 +134,7 @@ static void test_grid() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), false); - BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_REQUIRE_NE(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child)->id(), "(2,2)"); /***** END *****/ @@ -143,7 +143,7 @@ static void test_grid() BOOST_CHECK_EQUAL(visitor->at_end(gui2::iterator::twalker_::child), true); - BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child), static_cast(NULL)); + BOOST_CHECK_EQUAL(visitor->get(gui2::iterator::twalker_::child), static_cast(nullptr)); /***** POST END *****/ diff --git a/src/tests/test_image_modifications.cpp b/src/tests/test_image_modifications.cpp index 3e206731c6af..7c6aafc0c81c 100644 --- a/src/tests/test_image_modifications.cpp +++ b/src/tests/test_image_modifications.cpp @@ -173,8 +173,8 @@ BOOST_AUTO_TEST_CASE(test_tc_modification_decoding) rc_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); const std::vector& old_color = game_config::tc_info("blue"); // The first team color is red @@ -207,8 +207,8 @@ BOOST_AUTO_TEST_CASE(test_rc_modification_decoding) rc_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); const std::vector& old_color = game_config::tc_info("red"); const color_range& new_color = game_config::color_info("blue"); @@ -241,8 +241,8 @@ BOOST_AUTO_TEST_CASE(test_pal_modification_decoding) rc_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); std::vector const& old_palette = game_config::tc_info("000000,005000"); std::vector const& new_palette = game_config::tc_info("FFFFFF,FF00FF"); @@ -281,8 +281,8 @@ BOOST_AUTO_TEST_CASE(test_fl_modification_decoding_default) fl_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(mod->get_horiz()); BOOST_CHECK(!mod->get_vert()); @@ -301,8 +301,8 @@ BOOST_AUTO_TEST_CASE(test_fl_modification_decoding_horiz) fl_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(mod->get_horiz()); BOOST_CHECK(!mod->get_vert()); @@ -321,8 +321,8 @@ BOOST_AUTO_TEST_CASE(test_fl_modification_decoding_vert) fl_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(!mod->get_horiz()); BOOST_CHECK(mod->get_vert()); @@ -341,8 +341,8 @@ BOOST_AUTO_TEST_CASE(test_fl_modification_decoding_horiz_and_vert) fl_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(mod->get_horiz()); BOOST_CHECK(mod->get_vert()); @@ -361,8 +361,8 @@ BOOST_AUTO_TEST_CASE(test_gs_modification_decoding) gs_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_CHECK(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_CHECK(mod != nullptr); delete mod; } @@ -388,8 +388,8 @@ BOOST_AUTO_TEST_CASE(test_crop_modification_decoding_1_arg) crop_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); const SDL_Rect& slice = mod->get_slice(); @@ -412,8 +412,8 @@ BOOST_AUTO_TEST_CASE(test_crop_modification_decoding_2_args) crop_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); const SDL_Rect& slice = mod->get_slice(); @@ -436,8 +436,8 @@ BOOST_AUTO_TEST_CASE(test_crop_modification_decoding_3_args) crop_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); const SDL_Rect& slice = mod->get_slice(); @@ -460,8 +460,8 @@ BOOST_AUTO_TEST_CASE(test_crop_modification_decoding_4_args) crop_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); const SDL_Rect& slice = mod->get_slice(); @@ -487,8 +487,8 @@ BOOST_AUTO_TEST_CASE(test_blit_modification_decoding_1_arg) blit_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(!mod->get_surface().null()); BOOST_CHECK_EQUAL(mod->get_x(), 0); @@ -511,8 +511,8 @@ BOOST_AUTO_TEST_CASE(test_blit_modification_decoding_3_args) blit_modification* mod = dynamic_cast(queue.top()); - BOOST_REQUIRE(mod != NULL); - // The dynamic_cast returns NULL if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); + // The dynamic_cast returns nullptr if the argument doesn't match the type BOOST_CHECK(!mod->get_surface().null()); BOOST_CHECK_EQUAL(mod->get_x(), 1); @@ -549,8 +549,8 @@ BOOST_AUTO_TEST_CASE(test_mask_modification_decoding_1_arg) mask_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(!mod->get_mask().null()); BOOST_CHECK_EQUAL(mod->get_x(), 0); @@ -573,8 +573,8 @@ BOOST_AUTO_TEST_CASE(test_mask_modification_decoding_3_args) mask_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(!mod->get_mask().null()); BOOST_CHECK_EQUAL(mod->get_x(), 3); @@ -621,8 +621,8 @@ BOOST_AUTO_TEST_CASE(test_l_modification_decoding_1_arg) light_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(!mod->get_surface().null()); @@ -650,8 +650,8 @@ BOOST_AUTO_TEST_CASE(test_scale_modification_decoding_1_arg) scale_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_w(), 3); BOOST_CHECK_EQUAL(mod->get_h(), 0); @@ -670,8 +670,8 @@ BOOST_AUTO_TEST_CASE(test_scale_modification_decoding_2_args) scale_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_w(), 4); BOOST_CHECK_EQUAL(mod->get_h(), 5); @@ -690,8 +690,8 @@ BOOST_AUTO_TEST_CASE(test_o_modification_decoding_percent_args) o_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(mod->get_opacity() > 0.44f); BOOST_CHECK(mod->get_opacity() < 0.46f); @@ -710,8 +710,8 @@ BOOST_AUTO_TEST_CASE(test_o_modification_decoding_fraction_args) o_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK(mod->get_opacity() > 0.33f); BOOST_CHECK(mod->get_opacity() < 0.35f); @@ -730,8 +730,8 @@ BOOST_AUTO_TEST_CASE(test_bl_modification_decoding_no_args) bl_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_depth(), 0); @@ -749,8 +749,8 @@ BOOST_AUTO_TEST_CASE(test_bl_modification_decoding) bl_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_depth(), 2); @@ -771,8 +771,8 @@ BOOST_AUTO_TEST_CASE(test_rgb_modification_decoding_no_args) cs_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_r(), 0); BOOST_CHECK_EQUAL(mod->get_g(), 0); @@ -795,8 +795,8 @@ BOOST_AUTO_TEST_CASE(test_r_modification_decoding) cs_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_r(), 123); BOOST_CHECK_EQUAL(mod->get_g(), 0); @@ -816,8 +816,8 @@ BOOST_AUTO_TEST_CASE(test_g_modification_decoding) cs_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_r(), 0); BOOST_CHECK_EQUAL(mod->get_g(), 132); @@ -837,8 +837,8 @@ BOOST_AUTO_TEST_CASE(test_b_modification_decoding) cs_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_r(), 0); BOOST_CHECK_EQUAL(mod->get_g(), 0); @@ -858,8 +858,8 @@ BOOST_AUTO_TEST_CASE(test_brighten_modification_decoding) brighten_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_CHECK(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_CHECK(mod != nullptr); delete mod; } @@ -875,8 +875,8 @@ BOOST_AUTO_TEST_CASE(test_draken_modification_decoding) darken_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_CHECK(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_CHECK(mod != nullptr); delete mod; } @@ -892,8 +892,8 @@ BOOST_AUTO_TEST_CASE(test_bg_modification_decoding_no_args) background_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_color().r, 0); BOOST_CHECK_EQUAL(mod->get_color().g, 0); @@ -914,8 +914,8 @@ BOOST_AUTO_TEST_CASE(test_bg_modification_decoding_1_arg) background_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_color().r, 1); BOOST_CHECK_EQUAL(mod->get_color().g, 0); @@ -936,8 +936,8 @@ BOOST_AUTO_TEST_CASE(test_bg_modification_decoding_2_args) background_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_color().r, 1); BOOST_CHECK_EQUAL(mod->get_color().g, 2); @@ -958,8 +958,8 @@ BOOST_AUTO_TEST_CASE(test_bg_modification_decoding_3_args) background_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_color().r, 1); BOOST_CHECK_EQUAL(mod->get_color().g, 2); @@ -980,8 +980,8 @@ BOOST_AUTO_TEST_CASE(test_bg_modification_decoding_4_args) background_modification* mod = dynamic_cast(queue.top()); - // The dynamic_cast returns NULL if the argument doesn't match the type - BOOST_REQUIRE(mod != NULL); + // The dynamic_cast returns nullptr if the argument doesn't match the type + BOOST_REQUIRE(mod != nullptr); BOOST_CHECK_EQUAL(mod->get_color().r, 1); BOOST_CHECK_EQUAL(mod->get_color().g, 2); diff --git a/src/tests/test_lua.cpp b/src/tests/test_lua.cpp index 6b06e9e1622c..abe554d67679 100644 --- a/src/tests/test_lua.cpp +++ b/src/tests/test_lua.cpp @@ -59,7 +59,7 @@ BOOST_AUTO_TEST_CASE(fpu_rounding) BOOST_AUTO_TEST_CASE(lua_rounding) { - lua_kernel_base kernel(NULL); + lua_kernel_base kernel(nullptr); lua_State * L = kernel.get_state(); BOOST_CHECK_EQUAL(lua_round(L, -2.5), -2); diff --git a/src/tests/test_mp_connect.cpp b/src/tests/test_mp_connect.cpp index c0fadef1c0b6..c9e61c200275 100644 --- a/src/tests/test_mp_connect.cpp +++ b/src/tests/test_mp_connect.cpp @@ -44,7 +44,7 @@ class test_connect_engine : public ng::connect_engine { public: test_connect_engine(saved_game& gamestate) : - ng::connect_engine(gamestate, true, NULL) + ng::connect_engine(gamestate, true, nullptr) {} }; diff --git a/src/text.cpp b/src/text.cpp index 6bf435c0bb2f..a75bc0f23c4e 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -116,7 +116,7 @@ ttext::ttext() : calculation_dirty_(true), length_(0), surface_dirty_(true), - surface_buffer_(NULL) + surface_buffer_(nullptr) { // With 72 dpi the sizes are the same as with SDL_TTF so hardcoded. pango_cairo_context_set_resolution(context_, 72.0); @@ -156,7 +156,7 @@ ttext::~ttext() g_object_unref(layout_); } if(surface_buffer_) { - surface_.assign(NULL); + surface_.assign(nullptr); delete[] surface_buffer_; } } @@ -269,7 +269,7 @@ gui2::tpoint ttext::get_cursor_position( // Convert the byte offset in a position. PangoRectangle rect; - pango_layout_get_cursor_pos(layout_, offset, &rect, NULL); + pango_layout_get_cursor_pos(layout_, offset, &rect, nullptr); return gui2::tpoint(PANGO_PIXELS(rect.x), PANGO_PIXELS(rect.y)); } @@ -377,7 +377,7 @@ bool ttext::set_text(const std::string& text, const bool markedup) * leave the layout in an undefined state regarding markup so * clear it unconditionally. */ - pango_layout_set_attributes(layout_, NULL); + pango_layout_set_attributes(layout_, nullptr); pango_layout_set_text(layout_, narrow.c_str(), narrow.size()); } text_ = narrow; @@ -631,7 +631,7 @@ void ttext::recalculate(const bool force) const , context_ , font.get()); - PangoFontMetrics* m = pango_font_get_metrics(f, NULL); + PangoFontMetrics* m = pango_font_get_metrics(f, nullptr); int w = pango_font_metrics_get_approximate_char_width(m); w *= characters_per_line_; @@ -658,7 +658,7 @@ void ttext::recalculate(const bool force) const pango_layout_set_width(layout_, maximum_width == -1 ? -1 : (maximum_width + hack) * PANGO_SCALE); - pango_layout_get_pixel_extents(layout_, NULL, &rect_); + pango_layout_get_pixel_extents(layout_, nullptr, &rect_); DBG_GUI_L << "ttext::" << __func__ << " text '" << gui2::debug_truncate(text_) @@ -803,7 +803,7 @@ void ttext::create_surface_buffer(const size_t size) const { // clear old buffer if(surface_buffer_) { - surface_.assign(NULL); + surface_.assign(nullptr); delete[] surface_buffer_; } @@ -854,7 +854,7 @@ std::string ttext::handle_token(const std::string & token) const bool ttext::set_markup_helper(const std::string& text) { if(pango_parse_markup(text.c_str(), text.size() - , 0, NULL, NULL, NULL, NULL)) { + , 0, nullptr, nullptr, nullptr, nullptr)) { /* Markup is valid so set it. */ pango_layout_set_markup(layout_, text.c_str(), text.size()); @@ -885,7 +885,7 @@ bool ttext::set_markup_helper(const std::string& text) */ if(text.size() == semi_escaped.size() || !pango_parse_markup(semi_escaped.c_str(), semi_escaped.size() - , 0, NULL, NULL, NULL, NULL)) { + , 0, nullptr, nullptr, nullptr, nullptr)) { /* Fixing the ampersands didn't work. */ ERR_GUI_L << "ttext::" << __func__ diff --git a/src/theme.cpp b/src/theme.cpp index bb2a7afec1d2..521e22d799ae 100644 --- a/src/theme.cpp +++ b/src/theme.cpp @@ -240,7 +240,7 @@ static config expand_partialresolution(const config& theme) return result; } -static void do_resolve_rects(const config& cfg, config& resolved_config, config* resol_cfg = NULL) { +static void do_resolve_rects(const config& cfg, config& resolved_config, config* resol_cfg = nullptr) { // recursively resolve children BOOST_FOREACH(const config::any_child &value, cfg.all_children_range()) { @@ -254,7 +254,7 @@ static void do_resolve_rects(const config& cfg, config& resolved_config, config* // override default reference rect with "ref" parameter if any if (!cfg["ref"].empty()) { - if (resol_cfg == NULL) { + if (resol_cfg == nullptr) { ERR_DP << "Use of ref= outside a [resolution] block" << std::endl; } else { //DBG_DP << ">> Looking for " << cfg["ref"] << "\n"; @@ -636,7 +636,7 @@ bool theme::set_resolution(const SDL_Rect& screen) bool result = false; int current_rating = 1000000; - const config *current = NULL; + const config *current = nullptr; BOOST_FOREACH(const config &i, cfg_.child_range("resolution")) { int width = i["width"]; @@ -904,7 +904,7 @@ const theme::status_item* theme::get_status_item(const std::string& key) const if(i != status_.end()) return &i->second; else - return NULL; + return nullptr; } typedef std::map known_themes_map; @@ -948,7 +948,7 @@ const theme::menu *theme::get_menu_item(const std::string &key) const BOOST_FOREACH(const theme::menu &m, menus_) { if (m.get_id() == key) return &m; } - return NULL; + return nullptr; } const theme::action *theme::get_action_item(const std::string &key) const @@ -956,12 +956,12 @@ const theme::action *theme::get_action_item(const std::string &key) const BOOST_FOREACH(const theme::action &a, actions_) { if (a.get_id() == key) return &a; } - return NULL; + return nullptr; } theme::object* theme::refresh_title(const std::string& id, const std::string& new_title){ - theme::object* res = NULL; + theme::object* res = nullptr; for (std::vector::iterator a = actions_.begin(); a != actions_.end(); ++a){ if (a->get_id() == id) { diff --git a/src/theme.hpp b/src/theme.hpp index 281dedce830d..37b236fbfa48 100644 --- a/src/theme.hpp +++ b/src/theme.hpp @@ -144,7 +144,7 @@ class theme const std::string& postfix() const { return postfix_; } // If the item has a label associated with it, Show where the label is - const label* get_label() const { return label_.empty() ? NULL : &label_; } + const label* get_label() const { return label_.empty() ? nullptr : &label_; } size_t font_size() const { return font_; } Uint32 font_rgb() const { return font_rgb_; } @@ -265,7 +265,7 @@ class theme const std::vector& actions() const { return actions_; } const menu* context_menu() const - { return context_.is_context() ? &context_ : NULL; } + { return context_.is_context() ? &context_ : nullptr; } //refresh_title2 changes the title of a menu entry, identified by id. //If no menu entry is found, an empty menu object is returned. diff --git a/src/thread.cpp b/src/thread.cpp index 1ec6647cfcb8..07e3a530963e 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -51,7 +51,7 @@ namespace threading { manager::~manager() { for(std::vector::iterator i = detached_threads.begin(); i != detached_threads.end(); ++i) { - SDL_WaitThread(*i,NULL); + SDL_WaitThread(*i,nullptr); } } @@ -67,16 +67,16 @@ thread::~thread() void thread::join() { - if(thread_ != NULL) { - SDL_WaitThread(thread_,NULL); - thread_ = NULL; + if(thread_ != nullptr) { + SDL_WaitThread(thread_,nullptr); + thread_ = nullptr; } } void thread::detach() { detached_threads.push_back(thread_); - thread_ = NULL; + thread_ = nullptr; } mutex::mutex() : m_(SDL_CreateMutex()) diff --git a/src/thread.hpp b/src/thread.hpp index 701e73951c51..0556dfe07537 100644 --- a/src/thread.hpp +++ b/src/thread.hpp @@ -64,8 +64,8 @@ class thread // \param f the function at which the thread should start executing // \param data passed to f // - // \pre f != NULL - explicit thread(int (*f)(void*), void* data=NULL); + // \pre f != nullptr + explicit thread(int (*f)(void*), void* data=nullptr); // Destroy the thread object. This is done by waiting on the // thread with the join() operation, thus blocking until the diff --git a/src/tod_manager.hpp b/src/tod_manager.hpp index 81fe68618fea..9b1374fc55bb 100644 --- a/src/tod_manager.hpp +++ b/src/tod_manager.hpp @@ -157,9 +157,9 @@ class tod_manager : public savegame::savegame_config void set_number_of_turns_by_wml(int num); /** Dynamically change the current turn number. */ - void set_turn(const int num, game_data* vars = NULL, const bool increase_limit_if_needed = true); + void set_turn(const int num, game_data* vars = nullptr, const bool increase_limit_if_needed = true); /** Dynamically change the current turn number. */ - void set_turn_by_wml(const int num, game_data* vars = NULL, const bool increase_limit_if_needed = true); + void set_turn_by_wml(const int num, game_data* vars = nullptr, const bool increase_limit_if_needed = true); /** * Function to move to the next turn. diff --git a/src/tools/cutter.cpp b/src/tools/cutter.cpp index 7171f8a97f7b..260a62f637a3 100644 --- a/src/tools/cutter.cpp +++ b/src/tools/cutter.cpp @@ -75,7 +75,7 @@ int main(int argc, char* argv[]) cut.load_masks(conf); const surface src_surface(make_neutral_surface(IMG_Load(src.c_str()))); - if(src_surface == NULL) + if(src_surface == nullptr) throw exploder_failure("Unable to load the source image " + src); const cutter::surface_map surfaces = cut.cut_surface(src_surface, conf); diff --git a/src/tools/dummy_video.cpp b/src/tools/dummy_video.cpp index 370a5ccd9fac..96116d944d3a 100644 --- a/src/tools/dummy_video.cpp +++ b/src/tools/dummy_video.cpp @@ -17,7 +17,7 @@ #include "video.hpp" #include "sdl/utils.hpp" -static surface dummy_screen_surface(NULL); +static surface dummy_screen_surface(nullptr); surface& CVideo::getSurface() { @@ -30,7 +30,7 @@ void update_rect(const SDL_Rect&) surface display_format_alpha(surface) { - return NULL; + return nullptr; } surface& get_video_surface() diff --git a/src/tools/exploder_composer.cpp b/src/tools/exploder_composer.cpp index 44da1a4369f4..d3921313195f 100644 --- a/src/tools/exploder_composer.cpp +++ b/src/tools/exploder_composer.cpp @@ -40,11 +40,11 @@ surface composer::compose(const std::string &src, const std::string &dest) std::cerr << "Loading images...\n"; } const surface src_surface(make_neutral_surface(IMG_Load(src.c_str()))); - if(src_surface == NULL) + if(src_surface == nullptr) throw exploder_failure("Unable to load the source image " + src); const surface dest_surface(make_neutral_surface(IMG_Load(dest.c_str()))); - if(dest_surface == NULL) + if(dest_surface == nullptr) throw exploder_failure("Unable to load the destination image " + dest); if(verbose_) { diff --git a/src/tools/exploder_cutter.cpp b/src/tools/exploder_cutter.cpp index 581bf1b8b048..e3dde551fa4c 100644 --- a/src/tools/exploder_cutter.cpp +++ b/src/tools/exploder_cutter.cpp @@ -79,13 +79,13 @@ void cutter::load_masks(const config& conf) cur_mask.cut = cut; cur_mask.filename = image; surface tmp(IMG_Load(image.c_str())); - if(tmp == NULL) + if(tmp == nullptr) throw exploder_failure("Unable to load mask image " + image); cur_mask.image = make_neutral_surface(tmp); } - if(masks_[name].image == NULL) + if(masks_[name].image == nullptr) throw exploder_failure("Unable to load mask image " + image); } } @@ -147,7 +147,7 @@ void cutter::add_sub_image(const surface &surf, surface_map &map, const config* positioned_surface ps; ps.image = ::cut_surface(surf, cut); - if(ps.image == NULL) + if(ps.image == nullptr) throw exploder_failure("Unable to cut surface!"); ps.name = name; ps.mask = mask; diff --git a/src/tools/exploder_cutter.hpp b/src/tools/exploder_cutter.hpp index ef97aaa1d7ec..604bf7418667 100644 --- a/src/tools/exploder_cutter.hpp +++ b/src/tools/exploder_cutter.hpp @@ -26,7 +26,7 @@ class cutter { mask() : name() - , image(NULL) + , image(nullptr) , filename() , shift() , cut() @@ -45,7 +45,7 @@ class cutter positioned_surface() : name() , pos() - , image(NULL) + , image(nullptr) , mask() { } diff --git a/src/tools/exploder_utils.cpp b/src/tools/exploder_utils.cpp index 558532a23c42..4152bb7c4a4a 100644 --- a/src/tools/exploder_utils.cpp +++ b/src/tools/exploder_utils.cpp @@ -172,16 +172,16 @@ void save_image(surface surf, const std::string &filename) const util::scoped_FILE file(fopen(filename.c_str(),"wb")); //initializes PNG write structures - //TODO: review whether providing NULL error handlers is something + //TODO: review whether providing nullptr error handlers is something //sensible png_struct* png_ptr = png_create_write_struct - (PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); + (PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr); if(!png_ptr) throw exploder_failure("Unable to initialize the png write structure"); png_info* info_ptr = png_create_info_struct(png_ptr); if(!info_ptr) { - png_destroy_write_struct(&png_ptr, NULL); + png_destroy_write_struct(&png_ptr, nullptr); throw exploder_failure("Unable to initialize the png info structure"); } @@ -224,7 +224,7 @@ void save_image(surface surf, const std::string &filename) png_set_rows(png_ptr, info_ptr, row_pointers); //writes the actual image data - png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, NULL); + png_write_png(png_ptr, info_ptr, PNG_TRANSFORM_IDENTITY, nullptr); //cleans everything png_write_end(png_ptr, info_ptr); diff --git a/src/tools/schema/schema_generator.cpp b/src/tools/schema/schema_generator.cpp index 65258e025763..53469ab89717 100644 --- a/src/tools/schema/schema_generator.cpp +++ b/src/tools/schema/schema_generator.cpp @@ -163,7 +163,7 @@ int main(int argc, char *argv[]){ while (true) { std::cin.get(c); const char *r = strchr("yYnN",c); - if (r == NULL){ + if (r == nullptr){ std::cout << "Please, choose your answer " << std::endl; continue; } diff --git a/src/tools/schema/sourceparser.cpp b/src/tools/schema/sourceparser.cpp index a9a946f9112e..2231d6b35fec 100644 --- a/src/tools/schema/sourceparser.cpp +++ b/src/tools/schema/sourceparser.cpp @@ -512,7 +512,7 @@ bool class_source_parser::check_allow_link(const std::string &s){ if (!current_.empty()){ std::string link = sub[1]; current_.back().add_link(link); - if (static_cast(root_).find_tag(link,root_) == NULL){ + if (static_cast(root_).find_tag(link,root_) == nullptr){ errors_.add_link_error(input_,line_,link); } } diff --git a/src/tools/schema/tag.cpp b/src/tools/schema/tag.cpp index eb819c367f2d..fed276add047 100644 --- a/src/tools/schema/tag.cpp +++ b/src/tools/schema/tag.cpp @@ -112,7 +112,7 @@ const class_key * class_tag::find_key(const std::string &name) const{ if ( it_keys!= keys_.end() ){ return &(it_keys->second); } - return NULL; + return nullptr; } const std::string * class_tag::find_link(const std::string &name) const{ @@ -120,12 +120,12 @@ const std::string * class_tag::find_link(const std::string &name) const{ if ( it_links!= links_.end() ){ return &(it_links->second); } - return NULL; + return nullptr; } const class_tag * class_tag::find_tag(const std::string &fullpath, const class_tag &root) const{ - if (fullpath.empty()) return NULL; + if (fullpath.empty()) return nullptr; std::string::size_type pos = fullpath.find('/'); std::string name; std::string next_path; @@ -147,7 +147,7 @@ const class_tag * class_tag::find_tag(const std::string &fullpath, if (it_links != links_.end()){ return root.find_tag(it_links->second + "/" +next_path,root); } - return NULL; + return nullptr; } @@ -228,7 +228,7 @@ void class_tag::printl(std::ostream &os,int level, int step){ class_tag * class_tag::find_tag(const std::string &fullpath, class_tag &root) { - if (fullpath.empty()) return NULL; + if (fullpath.empty()) return nullptr; std::string::size_type pos = fullpath.find('/'); std::string name; std::string next_path; @@ -251,7 +251,7 @@ void class_tag::printl(std::ostream &os,int level, int step){ if (it_links != links_.end()){ return root.find_tag(it_links->second +"/" +next_path,root); } - return NULL; + return nullptr; } // class_tag & class_tag::operator= (class_tag const& t){ diff --git a/src/tools/sdl2/window.cpp b/src/tools/sdl2/window.cpp index c50ffbf266e8..4f2fc06351f3 100644 --- a/src/tools/sdl2/window.cpp +++ b/src/tools/sdl2/window.cpp @@ -63,7 +63,7 @@ static void modify(std::string& command, std::string::const_iterator begin) if(id >= windows.size()) { utf8::insert(command, utf8::size(command), " -> ID out of range"); - } else if(windows[id] == NULL) { + } else if(windows[id] == nullptr) { utf8::insert(command, utf8::size(command), " -> ID destroyed"); } else { @@ -100,11 +100,11 @@ static void destroy(std::string& command, std::string::const_iterator begin) if(id >= windows.size()) { utf8::insert(command, utf8::size(command), " -> ID out of range"); - } else if(windows[id] == NULL) { + } else if(windows[id] == nullptr) { utf8::insert(command, utf8::size(command), " -> ID already destroyed"); } else { delete windows[id]; - windows[id] = NULL; + windows[id] = nullptr; utf8::insert(command, utf8::size(command), " -> OK"); } } diff --git a/src/tooltips.cpp b/src/tooltips.cpp index 3767971c242f..9d797f3bbf4a 100644 --- a/src/tooltips.cpp +++ b/src/tooltips.cpp @@ -29,7 +29,7 @@ namespace { -CVideo* video_ = NULL; +CVideo* video_ = nullptr; static const int font_size = font::SIZE_SMALL; static const int text_width = 400; @@ -52,7 +52,7 @@ std::map::const_iterator current_tooltip = tips.end(); int tooltip_handle = 0; int tooltip_id = 0; -surface current_background = NULL; +surface current_background = nullptr; } @@ -66,7 +66,7 @@ static void clear_tooltip() static void show_tooltip(const tooltip& tip) { - if(video_ == NULL) { + if(video_ == nullptr) { return; } @@ -121,7 +121,7 @@ manager::~manager() try { clear_tooltips(); } catch (...) {} - video_ = NULL; + video_ = nullptr; } void clear_tooltips() diff --git a/src/tooltips.hpp b/src/tooltips.hpp index 2f3846b0b94a..66a5296c33a1 100644 --- a/src/tooltips.hpp +++ b/src/tooltips.hpp @@ -31,7 +31,7 @@ struct manager void clear_tooltips(); void clear_tooltips(const SDL_Rect& rect); -int add_tooltip(const SDL_Rect& rect, const std::string& message, const std::string& action ="", bool use_markup = true, const surface& foreground = surface(NULL)); +int add_tooltip(const SDL_Rect& rect, const std::string& message, const std::string& action ="", bool use_markup = true, const surface& foreground = surface(nullptr)); bool update_tooltip(int id, const SDL_Rect& rect, const std::string& message, const std::string& action, bool use_markup, const surface& foreground); bool update_tooltip(int id, const SDL_Rect& rect, const std::string& message, diff --git a/src/tracer.hpp b/src/tracer.hpp index 4f39f6d01e27..fee82ac43d60 100644 --- a/src/tracer.hpp +++ b/src/tracer.hpp @@ -82,11 +82,11 @@ struct ttracer #ifdef __GNUC__ #define TRACER_ENTRY(interval) \ static ttracer tracer(__PRETTY_FUNCTION__); \ - ttracer::tprint print((++tracer.run % interval) == 0 ? &tracer : NULL) + ttracer::tprint print((++tracer.run % interval) == 0 ? &tracer : nullptr) #else #define TRACER_ENTRY(interval) \ static ttracer tracer(__FUNCTION__); \ - ttracer::tprint print((++tracer.run % interval) == 0 ? &tracer : NULL) + ttracer::tprint print((++tracer.run % interval) == 0 ? &tracer : nullptr) #endif /** diff --git a/src/units/abilities.cpp b/src/units/abilities.cpp index d065053338bb..90be47c9d6aa 100644 --- a/src/units/abilities.cpp +++ b/src/units/abilities.cpp @@ -255,7 +255,7 @@ namespace { * Returns names and descriptions of the unit's abilities. * The returned triples consist of (in order) base name, male or female name as * appropriate for the unit, and description. - * @param active_list If NULL, then all abilities are forced active. If not + * @param active_list If nullptr, then all abilities are forced active. If not * null, this vector will be the same length as the returned * one and will indicate whether or not the corresponding * ability is active. @@ -608,7 +608,7 @@ unit_ability_list attack_type::get_specials(const std::string& special) const * * This uses either the active or inactive name/description for each special, * based on the current context (see set_specials_context), provided - * @a active_list is not NULL. Otherwise specials are assumed active. + * @a active_list is not nullptr. Otherwise specials are assumed active. * If the appropriate name is empty, the special is skipped. */ std::vector > attack_type::special_tooltips( @@ -699,7 +699,7 @@ void attack_type::set_specials_context(const map_location& loc, bool attacking) self_loc_ = loc; other_loc_ = map_location::null_location(); is_attacker_ = attacking; - other_attack_ = NULL; + other_attack_ = nullptr; is_for_listing_ = false; } diff --git a/src/units/abilities.hpp b/src/units/abilities.hpp index 06000cdc9842..4f4112985a98 100644 --- a/src/units/abilities.hpp +++ b/src/units/abilities.hpp @@ -29,7 +29,7 @@ enum value_modifier {NOT_USED,SET,ADD,MUL,DIV}; struct individual_effect { - individual_effect() : type(NOT_USED), value(0), ability(NULL), + individual_effect() : type(NOT_USED), value(0), ability(nullptr), loc(map_location::null_location()) {} void set(value_modifier t, int val, const config *abil,const map_location &l); value_modifier type; diff --git a/src/units/animation.cpp b/src/units/animation.cpp index aa41f947c618..7ef24bb870ee 100644 --- a/src/units/animation.cpp +++ b/src/units/animation.cpp @@ -96,7 +96,7 @@ struct animation_cursor animation_branches branches; animation_cursor *parent; animation_cursor(const config &cfg): - itors(cfg.all_children_range()), branches(1), parent(NULL) + itors(cfg.all_children_range()), branches(1), parent(nullptr) { branches.back().attributes.merge_attributes(cfg); } @@ -1339,7 +1339,7 @@ void unit_animator::replace_anim_if_invalid(const unit* animated_unit tmp.text_color = text_color; tmp.src = src; tmp.with_bars= with_bars; - tmp.animation = NULL; + tmp.animation = nullptr; animated_units_.push_back(tmp); }else { add_animation(animated_unit,event,src,dst,value,with_bars,text,text_color,hit_type,attack,second_attack,value2); @@ -1363,7 +1363,7 @@ void unit_animator::start_animations() if(anim->animation) { anim->my_unit->anim_comp().start_animation(begin_time, anim->animation, anim->with_bars, anim->text, anim->text_color); - anim->animation = NULL; + anim->animation = nullptr; } else { anim->my_unit->anim_comp().get_animation()->update_parameters(anim->src,anim->src.get_direction(anim->my_unit->facing())); } diff --git a/src/units/animation.hpp b/src/units/animation.hpp index cf771ade5894..efbf53a44b02 100644 --- a/src/units/animation.hpp +++ b/src/units/animation.hpp @@ -36,7 +36,7 @@ class unit_animation static void fill_initial_animations( std::vector & animations, const config & cfg); static void add_anims( std::vector & animations, const config & cfg); - int matches(const display &disp,const map_location& loc,const map_location& second_loc,const unit* my_unit,const std::string & event="",const int value=0,hit_type hit=INVALID,const attack_type* attack=NULL,const attack_type* second_attack = NULL, int value2 =0) const; + int matches(const display &disp,const map_location& loc,const map_location& second_loc,const unit* my_unit,const std::string & event="",const int value=0,hit_type hit=INVALID,const attack_type* attack=nullptr,const attack_type* second_attack = nullptr, int value2 =0) const; const unit_frame& get_last_frame() const{ return unit_anim_.get_last_frame() ; } @@ -174,8 +174,8 @@ class unit_animator , const Uint32 text_color = 0 , const unit_animation::hit_type hit_type = unit_animation::INVALID - , const attack_type* attack = NULL - , const attack_type* second_attack = NULL + , const attack_type* attack = nullptr + , const attack_type* second_attack = nullptr , int value2 = 0); void replace_anim_if_invalid(const unit* animated_unit , const std::string& event @@ -187,8 +187,8 @@ class unit_animator , const Uint32 text_color = 0 , const unit_animation::hit_type hit_type = unit_animation::INVALID - , const attack_type* attack = NULL - , const attack_type* second_attack = NULL + , const attack_type* attack = nullptr + , const attack_type* second_attack = nullptr , int value2 = 0); void start_animations(); void pause_animation(); diff --git a/src/units/animation_component.cpp b/src/units/animation_component.cpp index c2a931977ea5..111d6bdb86df 100644 --- a/src/units/animation_component.cpp +++ b/src/units/animation_component.cpp @@ -41,7 +41,7 @@ const unit_animation* unit_animation_component::choose_animation(const display& } if(max_val == unit_animation::MATCH_FAIL) { - return NULL; + return nullptr; } return options[rand()%options.size()]; } diff --git a/src/units/animation_component.hpp b/src/units/animation_component.hpp index f375057495e0..3d128ffe0098 100644 --- a/src/units/animation_component.hpp +++ b/src/units/animation_component.hpp @@ -39,7 +39,7 @@ class unit_animation_component /** Default construct a unit animation component corresponding to a unit. */ unit_animation_component(unit & my_unit) : u_(my_unit), - anim_(NULL), + anim_(nullptr), animations_(), state_(STATE_STANDING), next_idling_(0), @@ -51,7 +51,7 @@ class unit_animation_component /** Copy construct a unit animation component, for use when copy constructing a unit. */ unit_animation_component(unit & my_unit, const unit_animation_component & o) : u_(my_unit), - anim_(NULL), + anim_(nullptr), animations_(o.animations_), state_(o.state_), next_idling_(0), @@ -66,7 +66,7 @@ class unit_animation_component const map_location& second_loc = map_location::null_location(), const int damage=0, const unit_animation::hit_type hit_type = unit_animation::INVALID, - const attack_type* attack=NULL,const attack_type* second_attack = NULL, + const attack_type* attack=nullptr,const attack_type* second_attack = nullptr, int swing_num =0); /** Sets the animation state to standing. */ @@ -99,7 +99,7 @@ class unit_animation_component void clear_haloes(); /** Resets the animations list after the unit is advanced. */ - void reset_after_advance(const unit_type * newtype = NULL); + void reset_after_advance(const unit_type * newtype = nullptr); /** Adds an animation described by a config. Uses an internal cache to avoid redoing work. */ void apply_new_animation_effect(const config & effect); diff --git a/src/units/attack_type.cpp b/src/units/attack_type.cpp index 4508bc278610..9eb127128ed1 100644 --- a/src/units/attack_type.cpp +++ b/src/units/attack_type.cpp @@ -42,7 +42,7 @@ attack_type::attack_type(const config& cfg) : self_loc_(), other_loc_(), is_attacker_(false), - other_attack_(NULL), + other_attack_(nullptr), description_(cfg["description"].t_str()), id_(cfg["name"]), type_(cfg["type"]), @@ -336,7 +336,7 @@ bool attack_type::describe_modification(const config& cfg,std::string* descripti return false; // Did the caller want the description? - if(description != NULL) { + if(description != nullptr) { const std::string& increase_damage = cfg["increase_damage"]; const std::string& set_damage = cfg["set_damage"]; const std::string& increase_attacks = cfg["increase_attacks"]; diff --git a/src/units/attack_type.hpp b/src/units/attack_type.hpp index a24a8aa9a3e8..4302152ac512 100644 --- a/src/units/attack_type.hpp +++ b/src/units/attack_type.hpp @@ -68,7 +68,7 @@ class attack_type bool get_special_bool(const std::string& special, bool simple_check=false) const; unit_ability_list get_specials(const std::string& special) const; - std::vector > special_tooltips(std::vector *active_list=NULL) const; + std::vector > special_tooltips(std::vector *active_list=nullptr) const; std::string weapon_specials(bool only_active=false, bool is_backstab=false) const; void set_specials_context(const map_location& unit_loc, const map_location& other_loc, bool attacking, const attack_type *other_attack) const; diff --git a/src/units/drawer.cpp b/src/units/drawer.cpp index b4c771445c0e..6f594cc6bc53 100644 --- a/src/units/drawer.cpp +++ b/src/units/drawer.cpp @@ -184,8 +184,8 @@ void unit_drawer::redraw_unit (const unit & u) const sdl::timage ellipse_front; sdl::timage ellipse_back; #else - surface ellipse_front(NULL); - surface ellipse_back(NULL); + surface ellipse_front(nullptr); + surface ellipse_back(nullptr); #endif int ellipse_floating = 0; // Always show the ellipse for selected units @@ -236,20 +236,20 @@ void unit_drawer::redraw_unit (const unit & u) const xsrc, ysrc +adjusted_params.y-ellipse_floating, ellipse_front); } #else - if (ellipse_back != NULL) { + if (ellipse_back != nullptr) { //disp.drawing_buffer_add(display::LAYER_UNIT_BG, loc, disp.drawing_buffer_add(display::LAYER_UNIT_FIRST, loc, xsrc, ysrc +adjusted_params.y-ellipse_floating, ellipse_back); } - if (ellipse_front != NULL) { + if (ellipse_front != nullptr) { //disp.drawing_buffer_add(display::LAYER_UNIT_FG, loc, disp.drawing_buffer_add(display::LAYER_UNIT_FIRST, loc, xsrc, ysrc +adjusted_params.y-ellipse_floating, ellipse_front); } #endif if(draw_bars) { - const image::locator* orb_img = NULL; + const image::locator* orb_img = nullptr; const surface unit_img = image::get_image(u.default_anim_image(), image::SCALED_TO_ZOOM); const int xoff = (hex_size - unit_img->w)/2; const int yoff = (hex_size - unit_img->h)/2; @@ -272,31 +272,31 @@ void unit_drawer::redraw_unit (const unit & u) const if (preferences::show_enemy_orb() && !u.incapacitated()) orb_img = &enemy_orb; else - orb_img = NULL; + orb_img = nullptr; } else { if (preferences::show_allied_orb()) orb_img = &ally_orb; - else orb_img = NULL; + else orb_img = nullptr; } } else { if (preferences::show_moved_orb()) orb_img = &moved_orb; - else orb_img = NULL; + else orb_img = nullptr; if(playing_team == viewing_team && !u.user_end_turn()) { if (movement_left == total_movement) { if (preferences::show_unmoved_orb()) orb_img = &unmoved_orb; - else orb_img = NULL; + else orb_img = nullptr; } else if ( dc.unit_can_move(u) ) { if (preferences::show_partial_orb()) orb_img = &partmoved_orb; - else orb_img = NULL; + else orb_img = nullptr; } } } - if (orb_img != NULL) { + if (orb_img != nullptr) { surface orb(image::get_image(*orb_img,image::SCALED_TO_ZOOM)); disp.drawing_buffer_add(display::LAYER_UNIT_BAR, loc, xsrc + xoff, ysrc + yoff + adjusted_params.y, orb); @@ -343,7 +343,7 @@ void unit_drawer::redraw_unit (const unit & u) const } #else const surface ov_img(image::get_image(*ov, image::SCALED_TO_ZOOM)); - if(ov_img != NULL) { + if(ov_img != nullptr) { disp.drawing_buffer_add(display::LAYER_UNIT_BAR, loc, xsrc+xoff, ysrc+yoff+adjusted_params.y, ov_img); } @@ -385,7 +385,7 @@ void unit_drawer::draw_bar(const std::string& image, int xpos, int ypos, // is bad for calculate_energy_bar. // But we will do a geometric scaling later. surface bar_surf(image::get_image(image)); - if(surf == NULL || bar_surf == NULL) { + if(surf == nullptr || bar_surf == nullptr) { return; } @@ -413,7 +413,7 @@ void unit_drawer::draw_bar(const std::string& image, int xpos, int ypos, //if(alpha != ftofxp(1.0)) { // surf.assign(adjust_surface_alpha(surf,alpha)); - // if(surf == NULL) { + // if(surf == nullptr) { // return; // } //} diff --git a/src/units/filter.cpp b/src/units/filter.cpp index 1eb4e98a3db8..bcda435f335e 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -238,7 +238,7 @@ bool basic_unit_filter_impl::matches(const unit & u, const map_location& loc, co } } else { // If loc is invalid, then this is a recall list unit (already been scoped) - matches = internal_matches_filter(u, loc, NULL); + matches = internal_matches_filter(u, loc, nullptr); } // Handle [and], [or], and [not] with in-order precedence @@ -599,7 +599,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l std::vector basic_unit_filter_impl::all_matches_on_map(unsigned max_matches) const { std::vector ret; BOOST_FOREACH(const unit & u, fc_.get_disp_context().units()) { - if (matches(u, u.get_location(), NULL)) { + if (matches(u, u.get_location(), nullptr)) { if(max_matches == 0) { return ret; } @@ -613,7 +613,7 @@ std::vector basic_unit_filter_impl::all_matches_on_map(unsigned ma unit_const_ptr basic_unit_filter_impl::first_match_on_map() const { const unit_map & units = fc_.get_disp_context().units(); for(unit_map::const_iterator u = units.begin(); u != units.end(); u++) { - if (matches(*u,u->get_location(),NULL)) { + if (matches(*u,u->get_location(),nullptr)) { return u.get_shared_ptr(); } } diff --git a/src/units/filter.hpp b/src/units/filter.hpp index 409778af2a7c..2a77728b965f 100644 --- a/src/units/filter.hpp +++ b/src/units/filter.hpp @@ -39,7 +39,7 @@ struct map_location; class unit_filter_abstract_impl { public: - virtual bool matches(const unit & u, const map_location & loc, const unit * u2 = NULL) const = 0; + virtual bool matches(const unit & u, const map_location & loc, const unit * u2 = nullptr) const = 0; virtual std::vector all_matches_on_map(unsigned max_matches) const = 0; virtual unit_const_ptr first_match_on_map() const = 0; virtual config to_config() const = 0; diff --git a/src/units/frame.cpp b/src/units/frame.cpp index 1534cd92e12f..352330769f78 100644 --- a/src/units/frame.cpp +++ b/src/units/frame.cpp @@ -667,7 +667,7 @@ void unit_frame::redraw(const int frame_time,bool on_start_time,bool in_scope_of } const int x = static_cast(tmp_offset * xdst + (1.0-tmp_offset) * xsrc) + d2; const int y = static_cast(tmp_offset * ydst + (1.0-tmp_offset) * ysrc) + d2; - if (image != NULL) { + if (image != nullptr) { #ifdef LOW_MEM bool facing_west = false; #else @@ -804,7 +804,7 @@ std::set unit_frame::get_overlaped_hex(const int frame_time,const image::SCALED_TO_ZOOM ); } - if(image != NULL) { + if(image != nullptr) { w = image->w; h = image->h; } diff --git a/src/units/map.cpp b/src/units/map.cpp index 1a25c9175747..87c80f6c32e5 100644 --- a/src/units/map.cpp +++ b/src/units/map.cpp @@ -122,7 +122,7 @@ otherwise all operations are reverted. 3. Try insertion in the lmap and remove the umap entry on failure The one oddity is that to facilitate non-invalidating iterators the list -sometimes has NULL pointers which should be used when they correspond +sometimes has nullptr pointers which should be used when they correspond to uids previously used. */ std::pair unit_map::insert(unit_ptr p) { @@ -354,7 +354,7 @@ bool unit_map::self_check() const { } if(!uit->second.unit && uit->second.ref_count == 0 ){ good=false; - ERR_NG << "unit_map umap unit==NULL when refcount == 0" << std::endl; + ERR_NG << "unit_map umap unit==nullptr when refcount == 0" << std::endl; } if(uit->second.unit && uit->second.unit->underlying_id() != uit->first){ good=false; diff --git a/src/units/map.hpp b/src/units/map.hpp index c38947505af5..98feed58810d 100644 --- a/src/units/map.hpp +++ b/src/units/map.hpp @@ -102,7 +102,7 @@ class unit_map { mutable n_ref_counter::t_ref_counter ref_count; }; - ///Map of underlying_id to unit and a reference counter. Dead units have a unit pointer equal to NULL. + ///Map of underlying_id to unit and a reference counter. Dead units have a unit pointer equal to nullptr. ///The map entry is removed iff the reference counter equals zero and there are no more ///iterators pointing to this unit. typedef std::map t_umap; @@ -138,7 +138,7 @@ class unit_map { ~iterator_base() { dec(); } - iterator_base(): i_(), tank_(NULL) { } + iterator_base(): i_(), tank_(nullptr) { } iterator_base(iterator_type i, container_type *m) : i_(i), tank_(m) { inc(); @@ -240,7 +240,7 @@ class unit_map { typedef void (safe_bool_impl::*safe_bool)(); operator safe_bool() const - { return valid() ? &safe_bool_impl::nonnull : NULL; } + { return valid() ? &safe_bool_impl::nonnull : nullptr; } #else explicit operator bool() const { return valid(); } @@ -253,14 +253,14 @@ class unit_map { template friend struct iterator_base; private: - bool valid_for_dereference() const { return (tank_ != NULL) && (i_ != the_map().end()); } - bool valid_entry() const { return ((tank_ != NULL) && (i_ != the_map().end())) ; } + bool valid_for_dereference() const { return (tank_ != nullptr) && (i_ != the_map().end()); } + bool valid_entry() const { return ((tank_ != nullptr) && (i_ != the_map().end())) ; } void valid_exit() const { - if((tank_ != NULL) && i_ != the_map().end()){ + if((tank_ != nullptr) && i_ != the_map().end()){ assert(i_->second.ref_count > 0); } } - bool valid_ref_count() const { return (tank_ != NULL) && (i_ != the_map().end()) ; } + bool valid_ref_count() const { return (tank_ != nullptr) && (i_ != the_map().end()) ; } ///Increment the reference counter void inc() { if(valid_ref_count()) { ++(i_->second.ref_count); } } @@ -401,7 +401,7 @@ class unit_map { /** * Is the unit in the map? * - * @pre @p u != @c NULL + * @pre @p u != @c nullptr * * @param u Pointer to the unit to find. * @@ -413,10 +413,10 @@ class unit_map { t_umap::iterator begin_core() const ; bool is_valid(const t_umap::const_iterator &i) const { - return is_found(i) && (i->second.unit != NULL); + return is_found(i) && (i->second.unit != nullptr); } bool is_valid(const t_lmap::const_iterator &i) const { - return is_found(i) && (i->second->second.unit != NULL); + return is_found(i) && (i->second->second.unit != nullptr); } bool is_found(const t_umap::const_iterator &i) const { return i != umap_.end(); } diff --git a/src/units/types.cpp b/src/units/types.cpp index d60b1e54bd73..9dd610466acd 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -100,8 +100,8 @@ unit_type::unit_type(const unit_type& o) : animations_(o.animations_), build_status_(o.build_status_) { - gender_types_[0] = o.gender_types_[0] != NULL ? new unit_type(*o.gender_types_[0]) : NULL; - gender_types_[1] = o.gender_types_[1] != NULL ? new unit_type(*o.gender_types_[1]) : NULL; + gender_types_[0] = o.gender_types_[0] != nullptr ? new unit_type(*o.gender_types_[0]) : nullptr; + gender_types_[1] = o.gender_types_[1] != nullptr ? new unit_type(*o.gender_types_[1]) : nullptr; for(variations_map::const_iterator i = o.variations_.begin(); i != o.variations_.end(); ++i) { variations_[i->first] = new unit_type(*i->second); @@ -159,8 +159,8 @@ unit_type::unit_type(const config &cfg, const std::string & parent_id) : animations_(), build_status_(NOT_BUILT) { - gender_types_[0] = NULL; - gender_types_[1] = NULL; + gender_types_[0] = nullptr; + gender_types_[1] = nullptr; } unit_type::~unit_type() @@ -370,9 +370,9 @@ void unit_type::build_created(const movement_type_map &mv_types, return; // There is no preceding build level (other than being constructed). - // These should still be NULL from the constructor. - assert(gender_types_[0] == NULL); - assert(gender_types_[1] == NULL); + // These should still be nullptr from the constructor. + assert(gender_types_[0] == nullptr); + assert(gender_types_[1] == nullptr); if ( const config &male_cfg = cfg_.child("male") ) { gender_types_[0] = new unit_type(male_cfg, id_); @@ -447,7 +447,7 @@ const unit_type& unit_type::get_gender_unit_type(unit_race::GENDER gender) const { const size_t i = gender; if(i < sizeof(gender_types_)/sizeof(*gender_types_) - && gender_types_[i] != NULL) { + && gender_types_[i] != nullptr) { return *gender_types_[i]; } @@ -600,8 +600,8 @@ void unit_type::add_advancement(const unit_type &to_unit,int xp) // Add advancements to gendered subtypes, if supported by to_unit for(int gender=0; gender<=1; ++gender) { - if(gender_types_[gender] == NULL) continue; - if(to_unit.gender_types_[gender] == NULL) { + if(gender_types_[gender] == nullptr) continue; + if(to_unit.gender_types_[gender] == nullptr) { WRN_CF << to_unit.log_id() << " does not support gender " << gender << std::endl; continue; } @@ -741,7 +741,7 @@ bool unit_type::has_variation(const std::string& variation_id) const bool unit_type::show_variations_in_help() const { BOOST_FOREACH(const variations_map::value_type &val, variations_) { - assert(val.second != NULL); + assert(val.second != nullptr); if (!val.second->hide_help()) { return true; } @@ -854,7 +854,7 @@ unit_type_data::unit_type_data() : hide_help_all_(false), hide_help_type_(), hide_help_race_(), - unit_cfg_(NULL), + unit_cfg_(nullptr), build_status_(unit_type::NOT_BUILT) { } @@ -1154,7 +1154,7 @@ void unit_type_data::set_config(config &cfg) */ const unit_type *unit_type_data::find(const std::string& key, unit_type::BUILD_STATUS status) const { - if (key.empty() || key == "random") return NULL; + if (key.empty() || key == "random") return nullptr; DBG_CF << "trying to find " << key << " in unit_type list (unit_type_data.unit_types)\n"; const unit_type_map::iterator itor = types_.find(key); @@ -1165,7 +1165,7 @@ const unit_type *unit_type_data::find(const std::string& key, unit_type::BUILD_S for (unit_type_map::const_iterator ut = types_.begin(); ut != types_.end(); ut++) DBG_UT << "Known unit_types: key = '" << ut->first << "', id = '" << ut->second.log_id() << "'\n"; */ - return NULL; + return nullptr; } // Make sure the unit_type is built to the requested level. @@ -1198,7 +1198,7 @@ void unit_type_data::build_all(unit_type::BUILD_STATUS status) // Nothing to do if already built to the requested level. if ( status <= build_status_ ) return; - assert(unit_cfg_ != NULL); + assert(unit_cfg_ != nullptr); for (unit_type_map::iterator u = types_.begin(), u_end = types_.end(); u != u_end; ++u) { build_unit_type(u->second, status); @@ -1286,7 +1286,7 @@ void unit_type_data::add_advancement(unit_type& to_unit) const const unit_race *unit_type_data::find_race(const std::string &key) const { race_map::const_iterator i = races_.find(key); - return i != races_.end() ? &i->second : NULL; + return i != races_.end() ? &i->second : nullptr; } unit_type_data unit_types; diff --git a/src/units/types.hpp b/src/units/types.hpp index 1fd7a9b2fd5b..f9a9c86a6f33 100644 --- a/src/units/types.hpp +++ b/src/units/types.hpp @@ -203,7 +203,7 @@ class unit_type /// Returns the ID of this type's race without the need to build the type. std::string race_id() const { return cfg_["race"]; } //race_->id(); } - /// Never returns NULL, but may point to the null race. + /// Never returns nullptr, but may point to the null race. /// Requires building to the HELP_INDEXED status to get the correct race. const unit_race* race() const { return race_; } bool hide_help() const; @@ -264,7 +264,7 @@ class unit_type std::string default_variation_; std::string variation_name_; - const unit_race* race_; /// Never NULL, but may point to the null race. + const unit_race* race_; /// Never nullptr, but may point to the null race. fixed_t alpha_; diff --git a/src/units/udisplay.cpp b/src/units/udisplay.cpp index 23e440565372..b2dcfbc244ff 100644 --- a/src/units/udisplay.cpp +++ b/src/units/udisplay.cpp @@ -130,7 +130,7 @@ static int move_unit_between(const map_location& a, const map_location& b, disp.invalidate(a); temp_unit->set_facing(a.get_relative_dir(b)); animator.replace_anim_if_invalid(temp_unit.get(),"movement",a,b,step_num, - false,"",0,unit_animation::INVALID,NULL,NULL,step_left); + false,"",0,unit_animation::INVALID,nullptr,nullptr,step_left); animator.start_animations(); animator.pause_animation(); disp.scroll_to_tiles(a, b, game_display::ONSCREEN, true, 0.0, false); @@ -204,7 +204,7 @@ unit_mover::~unit_mover() */ void unit_mover::replace_temporary(unit_ptr u) { - if ( disp_ == NULL ) + if ( disp_ == nullptr ) // No point in creating a temp unit with no way to display it. return; @@ -656,7 +656,7 @@ void unit_attack(display * disp, game_board & board, int damage_left = damage; bool extra_hit_sounds_played = false; while(damage_left > 0 && !animator.would_end()) { - if(!extra_hit_sounds_played && extra_hit_sounds != NULL) { + if(!extra_hit_sounds_played && extra_hit_sounds != nullptr) { BOOST_FOREACH (std::string hit_sound, *extra_hit_sounds) { sound::play_sound(hit_sound); } @@ -801,8 +801,8 @@ void wml_animation_internal(unit_animator &animator, const vconfig &cfg, const m // We have found a unit that matches the filter if (u && !resources::screen->fogged(u->get_location())) { - attack_type *primary = NULL; - attack_type *secondary = NULL; + attack_type *primary = nullptr; + attack_type *secondary = nullptr; Uint32 text_color; unit_animation::hit_type hits= unit_animation::INVALID; std::vector attacks = u->attacks(); diff --git a/src/units/udisplay.hpp b/src/units/udisplay.hpp index 8b21c3ed7a8d..c7712f6aa5e9 100644 --- a/src/units/udisplay.hpp +++ b/src/units/udisplay.hpp @@ -86,13 +86,13 @@ void move_unit(const std::vector& path, unit_ptr u, * Play a pre-fight animation * First unit is the attacker, second unit the defender */ -void unit_draw_weapon( const map_location& loc, unit& u, const attack_type* attack=NULL, const attack_type*secondary_attack=NULL,const map_location& defender_loc = map_location::null_location(), unit * defender=NULL); +void unit_draw_weapon( const map_location& loc, unit& u, const attack_type* attack=nullptr, const attack_type*secondary_attack=nullptr,const map_location& defender_loc = map_location::null_location(), unit * defender=nullptr); /** * Play a post-fight animation * Both unit can be set to null, only valid units will play their animation */ -void unit_sheath_weapon( const map_location& loc, unit* u=NULL, const attack_type* attack=NULL, const attack_type*secondary_attack=NULL,const map_location& defender_loc = map_location::null_location(), unit * defender=NULL); +void unit_sheath_weapon( const map_location& loc, unit* u=nullptr, const attack_type* attack=nullptr, const attack_type*secondary_attack=nullptr,const map_location& defender_loc = map_location::null_location(), unit * defender=nullptr); /** * Show a unit fading out. @@ -100,9 +100,9 @@ void unit_sheath_weapon( const map_location& loc, unit* u=NULL, const attack_typ * Note: this only shows the effect, it doesn't actually kill the unit. */ void unit_die( const map_location& loc, unit& u, - const attack_type* attack=NULL, const attack_type* secondary_attack=NULL, + const attack_type* attack=nullptr, const attack_type* secondary_attack=nullptr, const map_location& winner_loc=map_location::null_location(), - unit* winner=NULL); + unit* winner=nullptr); /** @@ -117,7 +117,7 @@ void unit_sheath_weapon( const map_location& loc, unit* u=NULL, const attack_typ void unit_attack(display * disp, game_board & board, //TODO: Would be nice if this could be purely a display function and defer damage dealing to its caller const map_location& a, const map_location& b, int damage, const attack_type& attack, const attack_type* secondary_attack, - int swing, std::string hit_text, int drain_amount, std::string att_text, const std::vector* extra_hit_sounds=NULL); + int swing, std::string hit_text, int drain_amount, std::string att_text, const std::vector* extra_hit_sounds=nullptr); void unit_recruited(const map_location& loc, diff --git a/src/units/unit.cpp b/src/units/unit.cpp index 303d57fe9c6b..72eae5bc229a 100644 --- a/src/units/unit.cpp +++ b/src/units/unit.cpp @@ -64,7 +64,7 @@ #pragma warning (pop) #endif #include // for assert -#include // for NULL, rand +#include // for rand #include // for exception #include // for back_insert_iterator, etc #include // for operator new @@ -238,7 +238,7 @@ namespace { template T* copy_or_null(const boost::scoped_ptr& ptr) { - return ptr ? new T(*ptr) : NULL; + return ptr ? new T(*ptr) : nullptr; } } // Copy constructor @@ -1179,7 +1179,7 @@ inline bool mod_duration_match(const std::string & mod_dur, void unit::expire_modifications(const std::string & duration) { // If any modifications expire, then we will need to rebuild the unit. - const unit_type * rebuild_from = NULL; + const unit_type * rebuild_from = nullptr; // Loop through all types of modifications. for(unsigned int i = 0; i != NumModificationTypes; ++i) { @@ -1196,7 +1196,7 @@ void unit::expire_modifications(const std::string & duration) rebuild_from = &get_unit_type(v->str()); } // Else, if we have not already specified a type to build from: - else if ( rebuild_from == NULL ) + else if ( rebuild_from == nullptr ) rebuild_from = &type(); modifications_.remove_child(mod_name, j); @@ -1204,7 +1204,7 @@ void unit::expire_modifications(const std::string & duration) } } - if ( rebuild_from != NULL ) { + if ( rebuild_from != nullptr ) { anim_comp_->clear_haloes(); advance_to(*rebuild_from); } @@ -1500,10 +1500,10 @@ int unit::upkeep() const if(can_recruit()) { return 0; } - else if(boost::get(&upkeep_) != NULL) { + else if(boost::get(&upkeep_) != nullptr) { return level(); } - else if(boost::get(&upkeep_) != NULL) { + else if(boost::get(&upkeep_) != nullptr) { return 0; } else { @@ -1513,7 +1513,7 @@ int unit::upkeep() const bool unit::loyal() const { - return boost::get(&upkeep_) != NULL; + return boost::get(&upkeep_) != nullptr; } int unit::defense_modifier(const t_translation::t_terrain & terrain) const @@ -2107,7 +2107,7 @@ void unit::apply_builtin_effect(std::string apply_to, const config& effect) } else if (effect["apply_to"] == "variation") { variation_ = effect["name"].str(); const unit_type * base_type = unit_types.find(type().base_id()); - assert(base_type != NULL); + assert(base_type != nullptr); advance_to(*base_type); } else if (effect["apply_to"] == "type") { std::string prev_type = effect["prev_type"]; @@ -2497,10 +2497,10 @@ void unit::parse_upkeep(const config::attribute_value& upkeep) } void unit::write_upkeep(config::attribute_value& upkeep) const { - if(boost::get(&upkeep_) != NULL) { + if(boost::get(&upkeep_) != nullptr) { upkeep = "full"; } - else if(boost::get(&upkeep_) != NULL) { + else if(boost::get(&upkeep_) != nullptr) { upkeep = "loyal"; } else { diff --git a/src/units/unit.hpp b/src/units/unit.hpp index ea6a8ceab8c8..8a5f0f0c5b2c 100644 --- a/src/units/unit.hpp +++ b/src/units/unit.hpp @@ -111,8 +111,8 @@ class unit explicit unit( const config& cfg , bool use_traits = false - , const vconfig* vcfg = NULL - , n_unit::id_manager* id_manager = NULL); + , const vconfig* vcfg = nullptr + , n_unit::id_manager* id_manager = nullptr); /** * Initializes a unit from a unit type @@ -367,7 +367,7 @@ class unit const config &variables() const { return variables_; } unit_type::ALIGNMENT alignment() const { return alignment_; } void set_alignment(unit_type::ALIGNMENT alignment) { alignment_ = alignment; } - /// Never returns NULL, but may point to the null race. + /// Never returns nullptr, but may point to the null race. const unit_race* race() const { return race_; } @@ -386,7 +386,7 @@ class unit unit_ability_list get_abilities(const std::string &tag_name) const { return get_abilities(tag_name, loc_); } /** Tuple of: neutral ability name, gendered ability name, description */ - std::vector > ability_tooltips(std::vector *active_list=NULL) const; + std::vector > ability_tooltips(std::vector *active_list=nullptr) const; std::vector get_ability_list() const; bool has_ability_type(const std::string& ability) const; @@ -440,9 +440,9 @@ class unit map_location loc_; std::vector advances_to_; - const unit_type * type_;/// Never NULL. Adjusted for gender and variation. + const unit_type * type_;/// Never nullptr. Adjusted for gender and variation. t_string type_name_; /// The displayed name of the unit type. - const unit_race* race_; /// Never NULL, but may point to the null race. + const unit_race* race_; /// Never nullptr, but may point to the null race. std::string id_; t_string name_; n_unit::unit_id underlying_id_; diff --git a/src/util.hpp b/src/util.hpp index e151aa167910..492d1a3f863f 100644 --- a/src/util.hpp +++ b/src/util.hpp @@ -437,10 +437,10 @@ class unique_ptr unique_ptr(const unique_ptr &); unique_ptr &operator=(const unique_ptr &); public: - unique_ptr(T *p = NULL): ptr_(p) {} + unique_ptr(T *p = nullptr): ptr_(p) {} ~unique_ptr() { delete ptr_; } - void reset(T *p = NULL) + void reset(T *p = nullptr) { delete ptr_; ptr_ = p; @@ -449,7 +449,7 @@ class unique_ptr T *release() { T *p = ptr_; - ptr_ = NULL; + ptr_ = nullptr; return p; } diff --git a/src/utils/iterator.hpp b/src/utils/iterator.hpp index ffb3479e5619..fba13812e23f 100644 --- a/src/utils/iterator.hpp +++ b/src/utils/iterator.hpp @@ -213,7 +213,7 @@ class int_vect { // completely useless, maybe we should be able to add data to it. void push_back(int i) { - data_.push_back(NULL); // (This two-step approach is for exception safety.) + data_.push_back(nullptr); // (This two-step approach is for exception safety.) data_.back() = new int(i); } diff --git a/src/utils/shared_object.hpp b/src/utils/shared_object.hpp index a26ccdaa5c01..335722975edc 100644 --- a/src/utils/shared_object.hpp +++ b/src/utils/shared_object.hpp @@ -38,9 +38,9 @@ class shared_object { static const node* insert_into_index(const node &); static void erase_from_index(const node *); - shared_object() : val_(NULL) { set(T()); } + shared_object() : val_(nullptr) { set(T()); } - explicit shared_object(const T &o) : val_(NULL) { set(o); } + explicit shared_object(const T &o) : val_(nullptr) { set(o); } shared_object(const shared_object& o) : val_(o.val_) { assert(valid()); @@ -96,7 +96,7 @@ class shared_object { const node* val_; bool valid() const { - return val_ != NULL; + return val_ != nullptr; } void clear() { @@ -104,7 +104,7 @@ class shared_object { val_->count--; if (val_->count == 0) erase_from_index(val_); //index().erase(index().find(val_->val)); - val_ = NULL; + val_ = nullptr; } }; diff --git a/src/utils/smart_list.hpp b/src/utils/smart_list.hpp index 957e1795686e..40330c9c3de4 100644 --- a/src/utils/smart_list.hpp +++ b/src/utils/smart_list.hpp @@ -51,15 +51,15 @@ class smart_list struct node_t { /// Default constructor. This is for creating the root of a list. - node_t() : dat_ptr(NULL), ref_count(1), next(this), prev(this) + node_t() : dat_ptr(nullptr), ref_count(1), next(this), prev(this) {} /// Initialized constructor. This is for creating a node in a list. - explicit node_t(const Data & d) : dat_ptr(new Data(d)), ref_count(1), next(NULL), prev(NULL) + explicit node_t(const Data & d) : dat_ptr(new Data(d)), ref_count(1), next(nullptr), prev(nullptr) {} /// Destructor. ~node_t(); - /// The data of the node. This is NULL for a list's root. + /// The data of the node. This is nullptr for a list's root. Data * const dat_ptr; /// ref_count counts 1 for the list and 2 for each iterator pointing to /// this node. (So nodes are flagged for deletion when ref_count is even.) @@ -95,7 +95,7 @@ class smart_list protected: // Construct this via derived classes. /// Default constructor - iterator_base() : ptr_(NULL) {} + iterator_base() : ptr_(nullptr) {} /// Initialized constructor explicit iterator_base(node_t * ptr) : ptr_(ptr) { skip_flagged(); refer(); } @@ -638,7 +638,7 @@ inline typename smart_list::node_t * smart_list::check_erase { // Sanity check. if ( !iterator::derefable(pos) ) - return NULL; + return nullptr; // Remember our successor. node_t * ret_val = pos->next; @@ -688,8 +688,8 @@ inline void smart_list::unlink(node_t & begin_unlink, node_t & end_unlink) end_unlink.next->prev = begin_unlink.prev; // Disconnect the nodes from the list. This leaves the nodes in limbo. - end_unlink.next = NULL; - begin_unlink.prev = NULL; + end_unlink.next = nullptr; + begin_unlink.prev = nullptr; } /** @@ -755,12 +755,12 @@ template inline smart_list::node_t::~node_t() { // Some safety checks. - if ( dat_ptr == NULL ) + if ( dat_ptr == nullptr ) // Root node: make sure there are no lingering iterators to the list. assert(next == this); else { // Normal node: make sure we are not still in a list. - assert(next == NULL && prev == NULL); + assert(next == nullptr && prev == nullptr); // Make sure no iterators point to us. assert(ref_count == 0); } diff --git a/src/variable.cpp b/src/variable.cpp index 3b2f2e4ea80b..44afeb8ed5e7 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -82,7 +82,7 @@ vconfig::vconfig(const config & cfg, const boost::shared_ptr & cac * See also make_safe(). */ vconfig::vconfig(const config &cfg, bool manage_memory) : - cache_(manage_memory ? new config(cfg) : NULL), + cache_(manage_memory ? new config(cfg) : nullptr), cfg_(manage_memory ? cache_.get() : &cfg) { } diff --git a/src/video.cpp b/src/video.cpp index cff0c8ebdeb7..3355f59f323c 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -43,7 +43,7 @@ static lg::log_domain log_display("display"); #define LOG_DP LOG_STREAM(info, log_display) #define ERR_DP LOG_STREAM(err, log_display) -CVideo* CVideo::singleton_ = NULL; +CVideo* CVideo::singleton_ = nullptr; namespace { #ifdef SDL_GPU @@ -66,7 +66,7 @@ static unsigned int get_flags(unsigned int flags) namespace { -surface frameBuffer = NULL; +surface frameBuffer = nullptr; bool fake_interactive = false; } @@ -103,8 +103,8 @@ void trigger_full_redraw() { data.type = DRAW_ALL_EVENT; data.code = 0; - data.data1 = NULL; - data.data2 = NULL; + data.data1 = nullptr; + data.data2 = nullptr; drawEvent.type = DRAW_ALL_EVENT; drawEvent.user = data; @@ -118,7 +118,7 @@ bool CVideo::non_interactive() { if (fake_interactive) return false; - return window == NULL; + return window == nullptr; } @@ -149,8 +149,8 @@ void update_rect(const SDL_Rect& rect_value) SDL_Rect rect = rect_value; - surface const fb = NULL; - if(fb != NULL) { + surface const fb = nullptr; + if(fb != nullptr) { if(rect.x < 0) { if(rect.x*-1 >= int(rect.w)) return; @@ -200,8 +200,8 @@ void CVideo::video_event_handler::handle_window_event(const SDL_Event &event) data.type = DRAW_ALL_EVENT; data.code = 0; - data.data1 = NULL; - data.data2 = NULL; + data.data1 = nullptr; + data.data2 = nullptr; drawEvent.type = DRAW_ALL_EVENT; drawEvent.user = data; @@ -246,7 +246,7 @@ void CVideo::initSDL() //800x600 is a dummy value, the actual resolution is set in setMode render_target_ = GPU_Init(800, 600, GPU_DEFAULT_INIT_FLAGS); - if(render_target_ == NULL) { + if(render_target_ == nullptr) { ERR_DP << "Could not initialize window: " << SDL_GetError() << std::endl; throw CVideo::error(); } @@ -274,7 +274,7 @@ void CVideo::update_overlay(SDL_Rect *rect) // Re-render the appropriate screen area so that overlay change is visible static sdl::timage empty(image::get_texture("images/misc/blank.png")); SDL_Rect whole = sdl::create_rect(0, 0, overlay_->w, overlay_->h); - SDL_Rect *r = rect == NULL ? &whole : rect; + SDL_Rect *r = rect == nullptr ? &whole : rect; empty.set_scale(float(r->w) / empty.base_width(), float(r->h) / empty.base_height()); draw_texture(empty, r->x, r->y); } @@ -285,7 +285,7 @@ CVideo::~CVideo() LOG_DP << "calling SDL_Quit()\n"; SDL_Quit(); assert(singleton_); - singleton_ = NULL; + singleton_ = nullptr; LOG_DP << "called SDL_Quit()\n"; } @@ -294,7 +294,7 @@ void CVideo::blit_surface(int x, int y, surface surf, SDL_Rect* srcrect, SDL_Rec surface& target(getSurface()); SDL_Rect dst = sdl::create_rect(x, y, 0, 0); - const clip_rect_setter clip_setter(target, clip_rect, clip_rect != NULL); + const clip_rect_setter clip_setter(target, clip_rect, clip_rect != nullptr); sdl_blit(surf,srcrect,target,&dst); } @@ -330,7 +330,7 @@ void CVideo::blit_to_overlay(surface surf, int x, int y) return; } SDL_Rect r = sdl::create_rect(x, y, surf->w, surf->h); - SDL_BlitSurface(surf, NULL, overlay_, &r); + SDL_BlitSurface(surf, nullptr, overlay_, &r); update_overlay(&r); } diff --git a/src/video.hpp b/src/video.hpp index 7e443ee6aff4..e9960687e30e 100644 --- a/src/video.hpp +++ b/src/video.hpp @@ -111,7 +111,7 @@ class CVideo : private boost::noncopyable { int gety() const; //blits a surface with black as alpha - void blit_surface(int x, int y, surface surf, SDL_Rect* srcrect=NULL, SDL_Rect* clip_rect=NULL); + void blit_surface(int x, int y, surface surf, SDL_Rect* srcrect=nullptr, SDL_Rect* clip_rect=nullptr); #ifdef SDL_GPU GPU_Target *render_target() const; @@ -224,7 +224,7 @@ class CVideo : private boost::noncopyable { void initSDL(); #ifdef SDL_GPU - void update_overlay(SDL_Rect *rect = NULL); + void update_overlay(SDL_Rect *rect = nullptr); sdl::shader_program shader_; surface overlay_; diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index bf33c793cb82..0a746507b094 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -87,7 +87,7 @@ #include // for transform #include // for ENOMEM -#include // for setlocale, NULL, LC_ALL, etc +#include // for setlocale, LC_ALL, etc #include // for remove, fprintf, stderr #include // for srand, exit #include // for time, ctime, time_t @@ -575,7 +575,7 @@ static void check_fpu() */ static int do_gameloop(const std::vector& args) { - srand(time(NULL)); + srand(time(nullptr)); commandline_options cmdline_opts = commandline_options(args); game_config::wesnoth_program_dir = filesystem::directory_name(args[0]); @@ -674,11 +674,11 @@ static int do_gameloop(const std::vector& args) plugins_context::Reg const callbacks[] = { { "play_multiplayer", boost::bind(&game_launcher::play_multiplayer, game.get())}, - { NULL, NULL } + {} }; plugins_context::aReg const accessors[] = { { "command_line", boost::bind(&commandline_options::to_config, &cmdline_opts)}, - { NULL, NULL } + {} }; plugins_context plugins("titlescreen", callbacks, accessors); @@ -928,7 +928,7 @@ static void restart_process(const std::vector& commandline) { wchar_t process_path[MAX_PATH]; SetLastError(ERROR_SUCCESS); - GetModuleFileNameW(NULL, process_path, MAX_PATH); + GetModuleFileNameW(nullptr, process_path, MAX_PATH); if (GetLastError() != ERROR_SUCCESS) { throw std::runtime_error("Failed to retrieve the process path"); @@ -947,8 +947,8 @@ static void restart_process(const std::vector& commandline) PROCESS_INFORMATION process_info; ZeroMemory(&process_info, sizeof(process_info)); - CreateProcessW(process_path, commandline_c_str, NULL, NULL, - false, 0u, NULL, NULL, &startup_info, &process_info); + CreateProcessW(process_path, commandline_c_str, nullptr, nullptr, + false, 0u, nullptr, nullptr, &startup_info, &process_info); CloseHandle(process_info.hProcess); CloseHandle(process_info.hThread); @@ -1034,13 +1034,13 @@ int main(int argc, char** argv) terminate_handler.sa_handler = wesnoth_terminate_handler; terminate_handler.sa_flags = 0; sigemptyset(&terminate_handler.sa_mask); - sigaction(SIGTERM, &terminate_handler, NULL); - sigaction(SIGINT, &terminate_handler, NULL); + sigaction(SIGTERM, &terminate_handler, nullptr); + sigaction(SIGINT, &terminate_handler, nullptr); #endif try { std::cerr << "Battle for Wesnoth v" << game_config::revision << '\n'; - const time_t t = time(NULL); + const time_t t = time(nullptr); std::cerr << "Started on " << ctime(&t) << "\n"; const std::string& exe_dir = filesystem::get_exe_dir(); diff --git a/src/whiteboard/highlighter.cpp b/src/whiteboard/highlighter.cpp index 8fe43223fe88..dfb87ff1b545 100644 --- a/src/whiteboard/highlighter.cpp +++ b/src/whiteboard/highlighter.cpp @@ -224,7 +224,7 @@ void highlighter::find_secondary_highlights() assert(owner_unit_); assert(secondary_highlights_.empty()); - if(owner_unit_ == NULL) { + if(owner_unit_ == nullptr) { return; } diff --git a/src/whiteboard/manager.cpp b/src/whiteboard/manager.cpp index 4cd8e9de503b..b912632df14f 100644 --- a/src/whiteboard/manager.cpp +++ b/src/whiteboard/manager.cpp @@ -97,7 +97,7 @@ manager::~manager() #if 0 static void print_to_chat(const std::string& title, const std::string& message) { - resources::screen->add_chat_message(time(NULL), title, 0, message, + resources::screen->add_chat_message(time(nullptr), title, 0, message, events::chat_handler::MESSAGE_PRIVATE, false); } #endif @@ -145,7 +145,7 @@ void manager::print_help_once() bool manager::can_modify_game_state() const { if(wait_for_side_init_ - || resources::teams == NULL + || resources::teams == nullptr || executing_actions_ || resources::gameboard->is_observer() || resources::controller->is_linger_mode()) @@ -1056,7 +1056,7 @@ bool manager::has_actions() const bool manager::unit_has_actions(unit const* unit) const { - assert(unit != NULL); + assert(unit != nullptr); assert(resources::teams); return viewer_actions()->unit_has_actions(*unit); } diff --git a/src/whiteboard/manager.hpp b/src/whiteboard/manager.hpp index 6513ea3a39a9..dee9e46c3355 100644 --- a/src/whiteboard/manager.hpp +++ b/src/whiteboard/manager.hpp @@ -260,7 +260,7 @@ struct future_map_if */ boost::scoped_ptr future_map_; future_map_if(bool cond) - : future_map_(cond ? new future_map() : NULL) + : future_map_(cond ? new future_map() : nullptr) {} }; diff --git a/src/whiteboard/move.cpp b/src/whiteboard/move.cpp index 864474414def..27a423f1417b 100644 --- a/src/whiteboard/move.cpp +++ b/src/whiteboard/move.cpp @@ -148,7 +148,7 @@ void move::init() // As per Bug #18637, this should be fixed so that planning moves on planned recruits work properly. // The alternative is to disable movement on planned recruits altogether, // possibly in select_or_action() where the fake unit is selected in the first place. - if (get_unit() == NULL) + if (get_unit() == nullptr) return; assert(get_unit()); @@ -471,7 +471,7 @@ action::error move::check_validity() const } //If the path has at least two hexes (it can have less with the attack subclass), ensure destination hex is free - if(get_route().steps.size() >= 2 && resources::gameboard->get_visible_unit(get_dest_hex(),resources::teams->at(viewer_team())) != NULL) { + if(get_route().steps.size() >= 2 && resources::gameboard->get_visible_unit(get_dest_hex(),resources::teams->at(viewer_team())) != nullptr) { return LOCATION_OCCUPIED; } diff --git a/src/whiteboard/utility.cpp b/src/whiteboard/utility.cpp index 9cb5afcd2b8a..12d99e87510c 100644 --- a/src/whiteboard/utility.cpp +++ b/src/whiteboard/utility.cpp @@ -80,14 +80,14 @@ unit_const_ptr find_backup_leader(const unit & leader) unit* find_recruiter(size_t team_index, map_location const& hex) { if ( !resources::gameboard->map().is_castle(hex) ) - return NULL; + return nullptr; BOOST_FOREACH(unit& u, *resources::units) if(u.can_recruit() && u.side() == static_cast(team_index+1) && dynamic_cast(resources::filter_con)->can_recruit_on(u, hex)) return &u; - return NULL; + return nullptr; } unit* future_visible_unit(map_location hex, int viewer_side) @@ -96,7 +96,7 @@ unit* future_visible_unit(map_location hex, int viewer_side) if(!resources::whiteboard->has_planned_unit_map()) { ERR_WB << "future_visible_unit cannot find unit, future unit map failed to build." << std::endl; - return NULL; + return nullptr; } //use global method get_visible_unit return resources::gameboard->get_visible_unit(hex, resources::teams->at(viewer_side - 1), false); @@ -108,7 +108,7 @@ unit* future_visible_unit(int on_side, map_location hex, int viewer_side) if (unit && unit->side() == on_side) return unit; else - return NULL; + return nullptr; } int path_cost(std::vector const& path, unit const& u) diff --git a/src/whiteboard/utility.hpp b/src/whiteboard/utility.hpp index cc7593a37a2f..37c401aba403 100644 --- a/src/whiteboard/utility.hpp +++ b/src/whiteboard/utility.hpp @@ -45,22 +45,22 @@ side_actions_ptr current_side_actions(); /** * For a given leader on a keep, find another leader on another keep in the same castle. - * @retval NULL if no such leader has been found + * @retval nullptr if no such leader has been found */ unit_const_ptr find_backup_leader(unit const& leader); /** * @return a leader from the specified team who can recruit on the specified hex - * @retval NULL if no such leader has been found + * @retval nullptr if no such leader has been found */ unit* find_recruiter(size_t team_index, map_location const&); /// Applies the future unit map and @return a pointer to the unit at hex -/// @retval NULL if none is visible to the specified viewer side +/// @retval nullptr if none is visible to the specified viewer side unit* future_visible_unit(map_location hex, int viewer_side = wb::viewer_side()); /// Applies the future unit map and @return a pointer to the unit at hex -/// @retval NULL if none is visible to the specified viewer side +/// @retval nullptr if none is visible to the specified viewer side /// @param on_side Only search for units of this side. unit* future_visible_unit(int on_side, map_location hex, int viewer_side = wb::viewer_side()); @@ -87,14 +87,14 @@ class variable_finalizer {} ~variable_finalizer() { - if(variable_ != NULL) { + if(variable_ != nullptr) { *variable_ = value_; } } /** Stop tracking the variable, i.e. this object won't do anything on destruction. */ void clear() { - variable_ = NULL; + variable_ = nullptr; } private: T * variable_; diff --git a/src/widgets/button.cpp b/src/widgets/button.cpp index e73cfdc1c555..e85b1480195f 100644 --- a/src/widgets/button.cpp +++ b/src/widgets/button.cpp @@ -55,9 +55,9 @@ button::button(CVideo& video, const std::string& label, button::TYPE type, overlayImage_(), overlayPressedImage_(), overlayActiveImage_(), #else label_text_(label), - image_(NULL), pressedImage_(NULL), activeImage_(NULL), pressedActiveImage_(NULL), - disabledImage_(NULL), pressedDisabledImage_(NULL), - overlayImage_(NULL), overlayPressedImage_(NULL), overlayActiveImage_(NULL), + image_(nullptr), pressedImage_(nullptr), activeImage_(nullptr), pressedActiveImage_(nullptr), + disabledImage_(nullptr), pressedDisabledImage_(nullptr), + overlayImage_(nullptr), overlayPressedImage_(nullptr), overlayActiveImage_(nullptr), #endif state_(NORMAL), pressed_(false), spacing_(spacing), base_height_(0), base_width_(0), @@ -218,10 +218,10 @@ void button::load_images() { if (overlayPressedDisabledImage_.null()) overlayPressedDisabledImage_ = image::get_image(button_overlay_image_name_ + size_postfix + "-pressed.png~GS()"+ button_image_path_suffix_); } else { - overlayImage_.assign(NULL); + overlayImage_.assign(nullptr); } - if (disabled_image == NULL) { + if (disabled_image == nullptr) { disabled_image = image::get_image(button_image_name_ + ".png~GS()" + button_image_path_suffix_); } @@ -312,7 +312,7 @@ void button::calculate_size() int fs = font_size; int style = TTF_STYLE_NORMAL; std::string::const_iterator i_beg = label_text_.begin(), i_end = label_text_.end(), - i = font::parse_markup(i_beg, i_end, &fs, NULL, &style); + i = font::parse_markup(i_beg, i_end, &fs, nullptr, &style); if (i != i_end) { std::string tmp(i, i_end); label_text_.erase(i - i_beg, i_end - i_beg); @@ -322,7 +322,7 @@ void button::calculate_size() } if (type_ != TYPE_IMAGE){ - textRect_ = font::draw_text(NULL, screen_area(), font_size, + textRect_ = font::draw_text(nullptr, screen_area(), font_size, font::BUTTON_COLOR, label_text_, 0, 0); } @@ -555,7 +555,7 @@ void button::draw_contents() } surface nimage = make_neutral_surface(image); - blit_surface(noverlay, NULL, nimage, NULL); + blit_surface(noverlay, nullptr, nimage, nullptr); image = nimage; } diff --git a/src/widgets/combo.cpp b/src/widgets/combo.cpp index df47005b7ef9..4f7f9b55dae5 100644 --- a/src/widgets/combo.cpp +++ b/src/widgets/combo.cpp @@ -74,8 +74,8 @@ void combo::set_selected(int val) void combo::make_drop_down_menu() { SDL_Rect const &loc = location(); - set_selected_internal(gui::show_dialog(*video_, NULL, "", "", gui::MESSAGE, &items_, - NULL, "", NULL, -1, NULL, loc.x, loc.y + loc.h, + set_selected_internal(gui::show_dialog(*video_, nullptr, "", "", gui::MESSAGE, &items_, + nullptr, "", nullptr, -1, nullptr, loc.x, loc.y + loc.h, &gui::dialog::hotkeys_style)); } diff --git a/src/widgets/menu.cpp b/src/widgets/menu.cpp index d629d81231ae..640d84f53ebe 100644 --- a/src/widgets/menu.cpp +++ b/src/widgets/menu.cpp @@ -276,7 +276,7 @@ class sort_func void menu::do_sort() { - if(sorter_ == NULL || sorter_->column_sortable(sortby_) == false) { + if(sorter_ == nullptr || sorter_->column_sortable(sortby_) == false) { return; } @@ -623,7 +623,7 @@ bool menu::requires_event_focus(const SDL_Event* event) const if(!focus_ || height() == 0 || hidden()) { return false; } - if(event == NULL) { + if(event == nullptr) { //when event is not specified, signal that focus may be desired later return true; } @@ -709,7 +709,7 @@ void menu::handle_event(const SDL_Event& event) } - if(sorter_ != NULL) { + if(sorter_ != nullptr) { const int heading = hit_heading(x,y); if(heading >= 0 && sorter_->column_sortable(heading)) { sort_by(heading); @@ -824,7 +824,7 @@ SDL_Rect menu::style::item_size(const std::string& item) const { if (!str.empty() && str[0] == IMAGE_PREFIX) { const std::string image_name(str.begin()+1,str.end()); surface const img = get_item_image(image_name); - if(img != NULL) { + if(img != nullptr) { res.w += img->w; res.h = std::max(img->h, res.h); } @@ -833,7 +833,7 @@ SDL_Rect menu::style::item_size(const std::string& item) const { else { const SDL_Rect area = {0,0,10000,10000}; const SDL_Rect font_size = - font::draw_text(NULL,area,get_font_size(),font::NORMAL_COLOR,str,0,0); + font::draw_text(nullptr,area,get_font_size(),font::NORMAL_COLOR,str,0,0); res.w += font_size.w; res.h = std::max(font_size.h, res.h); } @@ -997,7 +997,7 @@ void menu::draw_row(const size_t row_index, const SDL_Rect& rect, ROW_TYPE type) int style = TTF_STYLE_NORMAL; int w = loc.w - (xpos - rect.x) - 2 * style_->get_thickness(); std::string::const_iterator i_beg = to_show.begin(), i_end = to_show.end(), - i = font::parse_markup(i_beg, i_end, &fs, NULL, &style); + i = font::parse_markup(i_beg, i_end, &fs, nullptr, &style); if (i != i_end) { std::string tmp(i, i_end); to_show.erase(i - i_beg, i_end - i_beg); @@ -1046,7 +1046,7 @@ void menu::draw_row(const size_t row_index, const SDL_Rect& rect, ROW_TYPE type) const surface img = style_->get_item_image(image_name); const int remaining_width = max_width_ < 0 ? area.w : std::min(max_width_, ((lang_rtl)? xpos - rect.x : rect.x + rect.w - xpos)); - if(img != NULL && img->w <= remaining_width + if(img != nullptr && img->w <= remaining_width && rect.y + img->h < area.h) { const size_t y = rect.y + (rect.h - img->h)/2; const size_t w = img->w + 5; @@ -1067,7 +1067,7 @@ void menu::draw_row(const size_t row_index, const SDL_Rect& rect, ROW_TYPE type) int style = TTF_STYLE_NORMAL; int w = rect.w - (xpos - rect.x) - 2 * style_->get_thickness(); std::string::const_iterator i_beg = to_show.begin(), i_end = to_show.end(), - i = font::parse_markup(i_beg, i_end, &fs, NULL, &style); + i = font::parse_markup(i_beg, i_end, &fs, nullptr, &style); if (i != i_end) { std::string tmp(i, i_end); to_show.erase(i - i_beg, i_end - i_beg); @@ -1083,7 +1083,7 @@ void menu::draw_row(const size_t row_index, const SDL_Rect& rect, ROW_TYPE type) if(type == HEADING_ROW && sortby_ == int(i)) { const surface sort_img = image::get_image(sortreversed_ ? "buttons/sliders/slider_arrow_blue.png" : "buttons/sliders/slider_arrow_blue.png~ROTATE(180)"); - if(sort_img != NULL && sort_img->w <= widths[i] && sort_img->h <= rect.h) { + if(sort_img != nullptr && sort_img->w <= widths[i] && sort_img->h <= rect.h) { const size_t sort_x = xpos + widths[i] - sort_img->w - padding; const size_t sort_y = rect.y + rect.h/2 - sort_img->h/2; video().blit_surface(sort_x,sort_y,sort_img); @@ -1147,7 +1147,7 @@ void menu::draw() bg_restore(); clip_rect_setter clipping_rect = - clip_rect_setter(video().getSurface(), clip_rect(), clip_rect() != NULL); + clip_rect_setter(video().getSurface(), clip_rect(), clip_rect() != nullptr); draw_contents(); diff --git a/src/widgets/menu.hpp b/src/widgets/menu.hpp index 34d526fc2f24..ed22dee43cdb 100644 --- a/src/widgets/menu.hpp +++ b/src/widgets/menu.hpp @@ -165,7 +165,7 @@ class menu : public scrollarea menu(CVideo& video, const std::vector& items, bool click_selects=false, int max_height=-1, int max_width=-1, - const sorter* sorter_obj=NULL, style *menu_style=NULL, const bool auto_join=true); + const sorter* sorter_obj=nullptr, style *menu_style=nullptr, const bool auto_join=true); /** Default implementation, but defined out-of-line for efficiency reasons. */ ~menu(); @@ -225,7 +225,7 @@ class menu : public scrollarea virtual void handle_event(const SDL_Event& event); void set_inner_location(const SDL_Rect& rect); - bool requires_event_focus(const SDL_Event *event=NULL) const; + bool requires_event_focus(const SDL_Event *event=nullptr) const; const std::vector& column_widths() const; virtual void draw_row(const size_t row_index, const SDL_Rect& rect, ROW_TYPE type); diff --git a/src/widgets/menu_style.cpp b/src/widgets/menu_style.cpp index bcf7690ef869..c80aa1feda33 100644 --- a/src/widgets/menu_style.cpp +++ b/src/widgets/menu_style.cpp @@ -196,7 +196,7 @@ void menu::imgsel_style::draw_row_bg(menu& menu_ref, const size_t row_index, con bg_cache_.height = rect.h; } SDL_Rect clip = rect; - menu_ref.video().blit_surface(rect.x,rect.y,bg_cache_.surf,NULL,&clip); + menu_ref.video().blit_surface(rect.x,rect.y,bg_cache_.surf,nullptr,&clip); } #endif else { @@ -288,7 +288,7 @@ void menu::imgsel_style::draw_row(menu& menu_ref, const size_t row_index, const area.x = rect.x; area.y = rect.y; do { - menu_ref.video().blit_surface(area.x,area.y,image,NULL,&clip); + menu_ref.video().blit_surface(area.x,area.y,image,nullptr,&clip); area.x += image->w; } while( area.x < rect.x + rect.w ); @@ -296,7 +296,7 @@ void menu::imgsel_style::draw_row(menu& menu_ref, const size_t row_index, const area.x = rect.x; area.y = rect.y; do { - menu_ref.video().blit_surface(area.x,area.y,image,NULL,&clip); + menu_ref.video().blit_surface(area.x,area.y,image,nullptr,&clip); area.y += image->h; } while( area.y < rect.y + rect.h ); @@ -304,7 +304,7 @@ void menu::imgsel_style::draw_row(menu& menu_ref, const size_t row_index, const area.x = rect.x + rect.w - thickness_; area.y = rect.y; do { - menu_ref.video().blit_surface(area.x,area.y,image,NULL,&clip); + menu_ref.video().blit_surface(area.x,area.y,image,nullptr,&clip); area.y += image->h; } while( area.y < rect.y + rect.h ); @@ -312,7 +312,7 @@ void menu::imgsel_style::draw_row(menu& menu_ref, const size_t row_index, const area.x = rect.x; area.y = rect.y + rect.h - thickness_; do { - menu_ref.video().blit_surface(area.x,area.y,image,NULL,&clip); + menu_ref.video().blit_surface(area.x,area.y,image,nullptr,&clip); area.x += image->w; } while( area.x < rect.x + rect.w ); diff --git a/src/widgets/multimenu.cpp b/src/widgets/multimenu.cpp index 671b3f98ae6a..a749b1fcdf44 100644 --- a/src/widgets/multimenu.cpp +++ b/src/widgets/multimenu.cpp @@ -26,7 +26,7 @@ namespace gui { surface img = image::get_image(active_items_[row_index] ? "buttons/checkbox-pressed.png" : "buttons/checkbox.png"); - blit_surface(img, NULL, video().getSurface(), &rect); + blit_surface(img, nullptr, video().getSurface(), &rect); SDL_Rect newrect = { Sint16 (rect.x + img->w + 2), rect.y, diff --git a/src/widgets/multimenu.hpp b/src/widgets/multimenu.hpp index 0dd8d6140e63..1112b7deabcf 100644 --- a/src/widgets/multimenu.hpp +++ b/src/widgets/multimenu.hpp @@ -28,7 +28,7 @@ namespace gui { public: multimenu(CVideo& video, const std::vector& items, bool click_selects=false, int max_height=-1, int max_width=-1, - const sorter* sorter_obj=NULL, style *menu_style=NULL, const bool auto_join=true); + const sorter* sorter_obj=nullptr, style *menu_style=nullptr, const bool auto_join=true); void set_active(size_t index, bool active=true); diff --git a/src/widgets/scrollbar.cpp b/src/widgets/scrollbar.cpp index b9ed082738d7..ef1b85065def 100644 --- a/src/widgets/scrollbar.cpp +++ b/src/widgets/scrollbar.cpp @@ -49,8 +49,8 @@ namespace gui { scrollbar::scrollbar(CVideo &video) : widget(video) - , mid_scaled_(NULL) - , groove_scaled_(NULL) + , mid_scaled_(nullptr) + , groove_scaled_(nullptr) , uparrow_(video, "", button::TYPE_TURBO, "button_square/button_square_25" , gui::button::DEFAULT_SPACE, true,"icons/arrows/arrows_ornate_up_25") , downarrow_(video, "", button::TYPE_TURBO, "button_square/button_square_25" @@ -68,7 +68,7 @@ scrollbar::scrollbar(CVideo &video) static const surface img(image::get_image(scrollbar_mid)); - if (img != NULL) { + if (img != nullptr) { set_width(img->w); // this is a bit rough maybe minimum_grip_height_ = 2 * img->h; @@ -267,8 +267,8 @@ void scrollbar::draw_contents() const surface mid_grv(image::get_image(groove_mid)); const surface bottom_grv(image::get_image(groove_bottom)); - if (mid_img == NULL || bottom_img == NULL || top_img == NULL - || top_grv == NULL || bottom_grv == NULL || mid_grv == NULL) { + if (mid_img == nullptr || bottom_img == nullptr || top_img == nullptr + || top_grv == nullptr || bottom_grv == nullptr || mid_grv == nullptr) { std::cerr << "Failure to load scrollbar image.\n"; return; } @@ -392,7 +392,7 @@ void scrollbar::handle_event(const SDL_Event& event) if (new_state != state_) { set_dirty(); - mid_scaled_.assign(NULL); + mid_scaled_.assign(nullptr); state_ = new_state; } } diff --git a/src/widgets/scrollpane.cpp b/src/widgets/scrollpane.cpp index fda5f1902630..8be40f8d916f 100644 --- a/src/widgets/scrollpane.cpp +++ b/src/widgets/scrollpane.cpp @@ -70,7 +70,7 @@ void scrollpane::hide(bool value) void scrollpane::add_widget(widget* w, int x, int y, int z_order) { - if (w == NULL) + if (w == nullptr) return; widget_map::iterator itor = std::find_if(content_.begin(), content_.end(), widget_finder(w)); diff --git a/src/widgets/slider.cpp b/src/widgets/slider.cpp index d10a16c0477f..c1f6daec4ba8 100644 --- a/src/widgets/slider.cpp +++ b/src/widgets/slider.cpp @@ -155,7 +155,7 @@ void slider::draw_contents() break; } - assert(image != NULL); + assert(image != nullptr); SDL_Color line_color = line_color_; if (!enabled()) { @@ -272,7 +272,7 @@ bool slider::requires_event_focus(const SDL_Event* event) const if(!focus_ || !enabled() || hidden()) { return false; } - if(event == NULL) { + if(event == nullptr) { //when event is not specified, signal that focus may be desired later return true; } diff --git a/src/widgets/slider.hpp b/src/widgets/slider.hpp index c1f7175bd6cb..940f4cd49245 100644 --- a/src/widgets/slider.hpp +++ b/src/widgets/slider.hpp @@ -48,7 +48,7 @@ class slider : public widget virtual void set_location(SDL_Rect const &rect); protected: - bool requires_event_focus(const SDL_Event *event=NULL) const; + bool requires_event_focus(const SDL_Event *event=nullptr) const; virtual void handle_event(const SDL_Event& event); virtual void draw_contents(); virtual bool allow_key_events() { return true; } diff --git a/src/widgets/textbox.cpp b/src/widgets/textbox.cpp index 06a2f41aad7c..872783313e78 100644 --- a/src/widgets/textbox.cpp +++ b/src/widgets/textbox.cpp @@ -34,14 +34,14 @@ textbox::textbox(CVideo &video, int width, const std::string& text, bool editabl : scrollarea(video, auto_join), max_size_(max_size), font_size_(font_size), text_(unicode_cast(text)), cursor_(text_.size()), selstart_(-1), selend_(-1), grabmouse_(false), text_pos_(0), editable_(editable), - show_cursor_(true), show_cursor_at_(0), text_image_(NULL), + show_cursor_(true), show_cursor_at_(0), text_image_(nullptr), wrap_(false), line_height_(0), yscroll_(0), alpha_(alpha), alpha_focus_(alpha_focus), - edit_target_(NULL) + edit_target_(nullptr) ,listening_(false) { // static const SDL_Rect area = d.screen_area(); - // const int height = font::draw_text(NULL,area,font_size,font::NORMAL_COLOR,"ABCD",0,0).h; + // const int height = font::draw_text(nullptr,area,font_size,font::NORMAL_COLOR,"ABCD",0,0).h; set_measurements(width, font::get_max_height(font_size_)); set_scroll_rate(font::get_max_height(font_size_) / 2); update_text_cache(true); @@ -87,7 +87,7 @@ void textbox::set_text(const std::string& text, const SDL_Color& color) void textbox::append_text(const std::string& text, bool auto_scroll, const SDL_Color& color) { - if(text_image_.get() == NULL) { + if(text_image_.get() == nullptr) { set_text(text, color); return; } @@ -105,7 +105,7 @@ void textbox::append_text(const std::string& text, bool auto_scroll, const SDL_C SDL_SetAlpha(new_text.get(),0,0); SDL_SetAlpha(text_image_.get(),0,0); SDL_SetSurfaceBlendMode(text_image_, SDL_BLENDMODE_NONE); - sdl_blit(text_image_,NULL,new_surface,NULL); + sdl_blit(text_image_,nullptr,new_surface,nullptr); SDL_SetSurfaceBlendMode(text_image_, SDL_BLENDMODE_BLEND); SDL_Rect target = sdl::create_rect(0 @@ -113,7 +113,7 @@ void textbox::append_text(const std::string& text, bool auto_scroll, const SDL_C , new_text->w , new_text->h); SDL_SetSurfaceBlendMode(new_text, SDL_BLENDMODE_NONE); - sdl_blit(new_text,NULL,new_surface,&target); + sdl_blit(new_text,nullptr,new_surface,&target); text_image_.assign(new_surface); text_.insert(text_.end(), wtext.begin(), wtext.end()); @@ -186,15 +186,15 @@ void textbox::draw_contents() surface& surf = video().getSurface(); sdl::draw_solid_tinted_rectangle(loc.x,loc.y,loc.w,loc.h,0,0,0, - focus(NULL) ? alpha_focus_ : alpha_, surf); + focus(nullptr) ? alpha_focus_ : alpha_, surf); SDL_Rect src; - if(text_image_ == NULL) { + if(text_image_ == nullptr) { update_text_cache(true); } - if(text_image_ != NULL) { + if(text_image_ != nullptr) { src.y = yscroll_; src.w = std::min(loc.w,text_image_->w); src.h = std::min(loc.h,text_image_->h); @@ -414,7 +414,7 @@ bool textbox::requires_event_focus(const SDL_Event* event) const if(!focus_ || hidden() || !enabled()) { return false; } - if(event == NULL) { + if(event == nullptr) { //when event is not specified, signal that focus may be desired later return true; } @@ -702,7 +702,7 @@ void textbox::handle_event(const SDL_Event& event, bool was_forwarded) show_cursor_at_ = SDL_GetTicks(); if(changed || old_cursor != cursor_ || old_selstart != selstart_ || old_selend != selend_) { - text_image_ = NULL; + text_image_ = nullptr; handle_text_changed(text_); } diff --git a/src/widgets/textbox.hpp b/src/widgets/textbox.hpp index 75ece932c0aa..532f39e01630 100644 --- a/src/widgets/textbox.hpp +++ b/src/widgets/textbox.hpp @@ -112,7 +112,7 @@ class textbox : public scrollarea //make it so that only one textbox object can be receiving //events at a time. - bool requires_event_focus(const SDL_Event *event=NULL) const; + bool requires_event_focus(const SDL_Event *event=nullptr) const; bool show_scrollbar() const; bool handle_text_input(const SDL_Event& event); diff --git a/src/widgets/widget.cpp b/src/widgets/widget.cpp index 0cb5305cbea9..9986e7fb3c2b 100644 --- a/src/widgets/widget.cpp +++ b/src/widgets/widget.cpp @@ -103,7 +103,7 @@ void widget::update_location(SDL_Rect const &rect) const SDL_Rect* widget::clip_rect() const { - return clip_ ? &clip_rect_ : NULL; + return clip_ ? &clip_rect_ : nullptr; } void widget::bg_register(SDL_Rect const &rect) diff --git a/src/wmi_pager.hpp b/src/wmi_pager.hpp index cbddc3670cce..38369887373d 100644 --- a/src/wmi_pager.hpp +++ b/src/wmi_pager.hpp @@ -42,7 +42,7 @@ class wmi_pager { const game_events::wmi_container * wmi_container_; //!< Internal pointer to the collection of wml menu items public: - wmi_pager() : page_num_(0), wmi_container_(NULL) {} + wmi_pager() : page_num_(0), wmi_container_(nullptr) {} void update_ref(game_events::wmi_container * ptr) { wmi_container_ = ptr; } //!< Updates the internal wmi_container pointer diff --git a/src/wml_exception.hpp b/src/wml_exception.hpp index cf2510b23a9d..57786bc37e11 100644 --- a/src/wml_exception.hpp +++ b/src/wml_exception.hpp @@ -67,7 +67,7 @@ class CVideo; #define FAIL(message) \ do { \ - wml_exception(NULL, __FILE__, __LINE__, __func__, message); \ + wml_exception(nullptr, __FILE__, __LINE__, __func__, message); \ /* wml_exception never returns. */ \ /* Help the compiler to figure that out */ \ throw 42; \ @@ -75,7 +75,7 @@ class CVideo; #define FAIL_WITH_DEV_MESSAGE(message, dev_message) \ do { \ - wml_exception(NULL \ + wml_exception(nullptr \ , __FILE__ \ , __LINE__ \ , __func__ \ From 1ae22aa046dbf4e2ccfb1515eb105d49fc0ed938 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 17:02:05 +1100 Subject: [PATCH 076/240] tpreferences: use initializer list for accl speeds --- src/gui/dialogs/preferences_dialog.cpp | 13 ++++--------- 1 file changed, 4 insertions(+), 9 deletions(-) diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index a9d438aac5a3..663dc0000436 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -116,7 +116,10 @@ tpreferences::tpreferences(CVideo& video, const config& game_cfg) , adv_preferences_cfg_() , friend_names_() , last_selected_item_(0) - , accl_speeds_() + , accl_speeds_( + // IMPORTANT: NEVER have trailing zeroes here, or else the cast from doubles + // to string will not match, since lexical_cast strips trailing zeroes. + {"0.25", "0.5", "0.75", "1", "1.25", "1.5", "1.75", "2", "3", "4", "8", "16" }) , visible_hotkeys_() , font_scaling_(font_scaling()) , index_(0,0) @@ -127,14 +130,6 @@ tpreferences::tpreferences(CVideo& video, const config& game_cfg) std::sort(adv_preferences_cfg_.begin(), adv_preferences_cfg_.end(), advanced_preferences_sorter()); - - // IMPORTANT: NEVER have trailing zeroes here, or else the cast from doubles - // to string will not match, since lexical_cast strips trailing zeroes. - static const char* const speeds[] = { - "0.25", "0.5", "0.75", "1", "1.25", "1.5", "1.75", "2", "3", "4", "8", "16" }; - - const size_t num_items = sizeof(speeds)/sizeof(const char*); - accl_speeds_.insert(accl_speeds_.end(), speeds, &speeds[num_items]); } // Determine the template type in order to use the correct value getter From 86b468037114ac628f1d7db82f764cfe34064df7 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 01:17:37 -0400 Subject: [PATCH 077/240] Use vector/templating for Lua-like bulk registration functions --- src/scripting/game_lua_kernel.cpp | 5 ++-- src/scripting/lua_cpp_function.cpp | 21 ++++++++++------ src/scripting/lua_cpp_function.hpp | 39 ++++++++++++++++++++++++++++-- src/scripting/lua_kernel_base.cpp | 8 +++--- src/scripting/plugins/context.cpp | 19 +++++++++++---- src/scripting/plugins/context.hpp | 21 +++++++++++++++- src/wesnoth.cpp | 2 -- 7 files changed, 91 insertions(+), 24 deletions(-) diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 3939125002b4..9527819d0fed 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -4365,15 +4365,16 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "remove_shroud", &dispatch2<&game_lua_kernel::intf_shroud_op, false > }, { nullptr, nullptr } }; + /* lua_cpp::Reg const cpp_callbacks[] = { - {} }; + */ lua_getglobal(L, "wesnoth"); if (!lua_istable(L,-1)) { lua_newtable(L); } luaL_setfuncs(L, callbacks, 0); - lua_cpp::set_functions(L, cpp_callbacks); + //lua_cpp::set_functions(L, cpp_callbacks); lua_setglobal(L, "wesnoth"); // Create the getside metatable. diff --git a/src/scripting/lua_cpp_function.cpp b/src/scripting/lua_cpp_function.cpp index 87d510a8e3df..6464b1aa8a2d 100644 --- a/src/scripting/lua_cpp_function.cpp +++ b/src/scripting/lua_cpp_function.cpp @@ -89,12 +89,14 @@ void push_function( lua_State* L, const lua_function & f ) new (p) lua_function(f); } -void set_functions( lua_State* L, const lua_cpp::Reg * l) +void set_functions( lua_State* L, const std::vector& functions) { luaL_checkversion(L); - for (; l->name != nullptr; l++) { /* fill the table with given functions */ - push_function(L, l->func); - lua_setfield(L, -2, l->name); + for (const lua_cpp::Reg& l : functions) { /* fill the table with given functions */ + if (l.name != nullptr) { + push_function(L, l.func); + lua_setfield(L, -2, l.name); + } } } @@ -111,16 +113,19 @@ void push_closure( lua_State* L, const lua_function & f, int nup) lua_pushcclosure(L, &intf_closure_dispatcher, 1+nup); } -void set_functions( lua_State* L, const lua_cpp::Reg * l, int nup ) +void set_functions( lua_State* L, const std::vector& functions, int nup ) { luaL_checkversion(L); luaL_checkstack(L, nup+1, "too many upvalues"); - for (; l->name != nullptr; l++) { /* fill the table with given functions */ + for (const lua_cpp::Reg& l : functions) { /* fill the table with given functions */ + if (l.name == nullptr) { + continue; + } int i; for (i = 0; i < nup; ++i) /* copy upvalues to the top */ lua_pushvalue(L, -nup); - push_closure(L, l->func, nup); /* closure with those upvalues */ - lua_setfield(L, -(nup + 2), l->name); + push_closure(L, l.func, nup); /* closure with those upvalues */ + lua_setfield(L, -(nup + 2), l.name); } lua_pop(L, nup); /* remove upvalues */ } diff --git a/src/scripting/lua_cpp_function.hpp b/src/scripting/lua_cpp_function.hpp index 03eba744a62a..83984ba6cce5 100644 --- a/src/scripting/lua_cpp_function.hpp +++ b/src/scripting/lua_cpp_function.hpp @@ -126,6 +126,7 @@ #define LUA_CPP_FUNCTION_HPP_INCLUDED #include +#include struct lua_State; @@ -155,7 +156,24 @@ void push_function( lua_State* L, const lua_function & f ); * * The note above applies. */ -void set_functions( lua_State* L, const lua_cpp::Reg * l); +void set_functions( lua_State* L, const std::vector& functions); + +/** + * Analogous to lua_setfuncs, it registers a collection of function wrapper + * objects into a table, using push_function. + * + * The note above applies. + */ +template +void set_functions( lua_State* L, const lua_cpp::Reg(& functions)[N]) +{ + std::vector l; + l.reserve(N); + for(int i = 0; i < N; i++) { + l.push_back(functions[i]); + } + set_functions(L, l); +} /** * Pushes a closure which retains a boost::function object as its first up-value. @@ -173,7 +191,24 @@ void push_closure( lua_State* L, const lua_function & f, int nup); * NOTE: set_functions(L, l, 0) is NOT the same as set_functions(L, l), as * the latter produces userdata and the former doesn't. */ -void set_functions( lua_State* L, const lua_cpp::Reg * l, int nup); +void set_functions( lua_State* L, const std::vector& functions, int nup); + +/** + * Analogous to lua_setfuncs and set_functions above, but pushes closures. + * + * NOTE: set_functions(L, l, 0) is NOT the same as set_functions(L, l), as + * the latter produces userdata and the former doesn't. + */ +template +void set_functions( lua_State* L, const lua_cpp::Reg(& functions)[N], int nup) +{ + std::vector l; + l.reserve(N); + for(int i = 0; i < N; i++) { + l.push_back(functions[i]); + } + set_functions(L, l, nup); +} } // end namespace lua_cpp_func diff --git a/src/scripting/lua_kernel_base.cpp b/src/scripting/lua_kernel_base.cpp index 0e32061c6acb..d8ecfb52b83e 100644 --- a/src/scripting/lua_kernel_base.cpp +++ b/src/scripting/lua_kernel_base.cpp @@ -286,21 +286,21 @@ lua_kernel_base::lua_kernel_base(CVideo * video) { nullptr, nullptr } }; - +/* lua_cpp::Reg const cpp_callbacks[] = { -/* { "dofile", boost::bind(&lua_kernel_base::intf_dofile, this, _1)}, + { "dofile", boost::bind(&lua_kernel_base::intf_dofile, this, _1)}, { "require", boost::bind(&lua_kernel_base::intf_require, this, _1)}, { "show_dialog", boost::bind(&lua_kernel_base::intf_show_dialog, this, _1)}, { "show_lua_console", boost::bind(&lua_kernel_base::intf_show_lua_console, this, _1)}, -*/ {} }; +*/ lua_getglobal(L, "wesnoth"); if (!lua_istable(L,-1)) { lua_newtable(L); } luaL_setfuncs(L, callbacks, 0); - lua_cpp::set_functions(L, cpp_callbacks, 0); + //lua_cpp::set_functions(L, cpp_callbacks, 0); lua_setglobal(L, "wesnoth"); // Override the print function diff --git a/src/scripting/plugins/context.cpp b/src/scripting/plugins/context.cpp index 27a542be36aa..2988f5dd16f5 100644 --- a/src/scripting/plugins/context.cpp +++ b/src/scripting/plugins/context.cpp @@ -28,16 +28,25 @@ plugins_context::plugins_context(const std::string & name) , name_(name) {} -plugins_context::plugins_context(const std::string & name, const Reg * l, const aReg * r) +plugins_context::plugins_context(const std::string& name, const std::vector& l, const std::vector& r) : callbacks_() , accessors_() , name_(name) { - for (; l->name != nullptr; l++) { /* fill the table with given functions */ - callbacks_.insert(std::make_pair(l->name, l->func)); + initialize(l, r); +} + +void plugins_context::initialize(const std::vector& callbacks, const std::vector& accessors) +{ + for (const Reg& l : callbacks) { /* fill the table with given functions */ + if (l.name != nullptr) { + callbacks_.insert(std::make_pair(l.name, l.func)); + } } - for (; r->name != nullptr; r++) { /* fill the table with given functions */ - accessors_.insert(std::make_pair(r->name, r->func)); + for (const aReg& r : accessors) { /* fill the table with given functions */ + if (r.name != nullptr) { + accessors_.insert(std::make_pair(r.name, r.func)); + } } } diff --git a/src/scripting/plugins/context.hpp b/src/scripting/plugins/context.hpp index d1178a35a2c6..032a9f855a11 100644 --- a/src/scripting/plugins/context.hpp +++ b/src/scripting/plugins/context.hpp @@ -23,6 +23,7 @@ #include #include #include +#include class config; @@ -36,7 +37,23 @@ class plugins_context { typedef struct { char const * name; accessor_function func; } aReg; plugins_context( const std::string & name ); - plugins_context( const std::string & name, const Reg * callbacks, const aReg * accessors); + plugins_context( const std::string & name, const std::vector& callbacks, const std::vector& accessors); + template + plugins_context( const std::string & name, const Reg (& callbacks)[N], const aReg (& accessors)[M]) + : name_(name) + { + std::vector l; + std::vector r; + l.reserve(N); + r.reserve(M); + for(int i = 0; i < N; i++) { + l.push_back(callbacks[i]); + } + for(int i = 0; i < M; i++) { + r.push_back(accessors[i]); + } + initialize(l, r); + } void play_slice(); @@ -56,6 +73,8 @@ class plugins_context { private: typedef std::map callback_list; typedef std::map accessor_list; + + void initialize(const std::vector& callbacks, const std::vector& accessors); callback_list callbacks_; accessor_list accessors_; diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 0a746507b094..d986613889f1 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -674,11 +674,9 @@ static int do_gameloop(const std::vector& args) plugins_context::Reg const callbacks[] = { { "play_multiplayer", boost::bind(&game_launcher::play_multiplayer, game.get())}, - {} }; plugins_context::aReg const accessors[] = { { "command_line", boost::bind(&commandline_options::to_config, &cmdline_opts)}, - {} }; plugins_context plugins("titlescreen", callbacks, accessors); From 4c45683d4d6de4c938add9146eeed272fda33881 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 02:08:40 -0400 Subject: [PATCH 078/240] Modernize luaW_getglobal The variadic form now uses a variadic template, and a vector form has been added. Since the nullptr sentinel argument is no longer required, it has been removed from all calls. --- src/ai/lua/core.cpp | 2 +- src/scripting/game_lua_kernel.cpp | 22 +++++++++++----------- src/scripting/lua_common.cpp | 14 +++----------- src/scripting/lua_common.hpp | 13 ++++++++++++- 4 files changed, 27 insertions(+), 24 deletions(-) diff --git a/src/ai/lua/core.cpp b/src/ai/lua/core.cpp index 2380ce1430ac..b9036768c8f4 100644 --- a/src/ai/lua/core.cpp +++ b/src/ai/lua/core.cpp @@ -820,7 +820,7 @@ static int impl_ai_aspect_get(lua_State* L) (void) aspect; } else if(typesafe_aspect* aspect = try_aspect_as(iter->second)) { const unit_advancements_aspect& val = aspect->get(); - int my_side = luaW_getglobal(L, "ai", "side", nullptr) - 1; + int my_side = luaW_getglobal(L, "ai", "side") - 1; lua_newtable(L); for (unit_map::const_iterator u = resources::units->begin(); u != resources::units->end(); ++u) { if (!u.valid() || u->side() != my_side) { diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 9527819d0fed..a1bf10df12b7 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -4075,7 +4075,7 @@ namespace { { lua_State *L = mState; config cfg; - if (!luaW_getglobal(L, "wesnoth", "theme_items", name.c_str(), nullptr)) + if (!luaW_getglobal(L, "wesnoth", "theme_items", name)) return cfg; if (!luaW_pcall(L, 0, 1)) return cfg; luaW_toconfig(L, -1, cfg); @@ -4546,7 +4546,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { set_wml_action(handler.first, handler.second); } - luaW_getglobal(L, "wesnoth", "effects", nullptr); + luaW_getglobal(L, "wesnoth", "effects"); BOOST_FOREACH(const std::string& effect, unit::builtin_effects) { lua_pushstring(L, effect.c_str()); push_builtin_effect(); @@ -4678,7 +4678,7 @@ void game_lua_kernel::load_game(const config& level) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_load", nullptr)) + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_load")) return; lua_newtable(L); @@ -4705,7 +4705,7 @@ void game_lua_kernel::save_game(config &cfg) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_save", nullptr)) + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_save")) return; if (!luaW_pcall(L, 0, 1, false)) @@ -4743,7 +4743,7 @@ bool game_lua_kernel::run_event(game_events::queued_event const &ev) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_event", nullptr)) + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_event")) return false; queued_event_context dummy(&ev, queued_events_); @@ -4847,7 +4847,7 @@ bool game_lua_kernel::run_wml_action(std::string const &cmd, vconfig const &cfg, lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "wml_actions", cmd.c_str(), nullptr)) + if (!luaW_getglobal(L, "wesnoth", "wml_actions", cmd)) return false; queued_event_context dummy(&ev, queued_events_); @@ -4868,7 +4868,7 @@ bool game_lua_kernel::run_wml_conditional(std::string const &cmd, vconfig const lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "wml_conditionals", cmd.c_str(), nullptr)) { + if (!luaW_getglobal(L, "wesnoth", "wml_conditionals", cmd)) { std::string err_msg = "unknown conditional wml: ["; err_msg += cmd; err_msg += "]"; @@ -4896,7 +4896,7 @@ bool game_lua_kernel::run_filter(char const *name, unit const &u) if (!ui.valid()) return false; // Get the user filter by name. - if(!luaW_getglobal(L, name, nullptr)) + if(!luaW_getglobal(L, name)) { std::string message = std::string() + "function " + name + " not found"; log_error(message.c_str(), "Lua SUF Error"); @@ -4928,7 +4928,7 @@ std::string game_lua_kernel::apply_effect(const std::string& name, unit& u, cons // (Note: The unit needs to be on the stack twice to prevent untimely GC.) luaW_pushconfig(L, cfg); // Stack: unit, cfg - if(luaW_getglobal(L, "wesnoth", "effects", name.c_str(), nullptr)) { + if(luaW_getglobal(L, "wesnoth", "effects", name)) { map_locker(this); // Stack: unit, cfg, effect if(lua_istable(L, -1)) { @@ -4997,7 +4997,7 @@ void game_lua_kernel::mouse_over_hex_callback(const map_location& loc) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_move", nullptr)) { + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_move")) { return; } lua_push(L, loc.x + 1); @@ -5010,7 +5010,7 @@ void game_lua_kernel::select_hex_callback(const map_location& loc) { lua_State *L = mState; - if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_action", nullptr)) { + if (!luaW_getglobal(L, "wesnoth", "game_events", "on_mouse_action")) { return; } lua_push(L, loc.x + 1); diff --git a/src/scripting/lua_common.cpp b/src/scripting/lua_common.cpp index 9f4df5738d9e..b00b7b7501c4 100644 --- a/src/scripting/lua_common.cpp +++ b/src/scripting/lua_common.cpp @@ -790,30 +790,22 @@ vconfig luaW_checkvconfig(lua_State *L, int index, bool allow_missing) return result; } - -#ifdef __GNUC__ -__attribute__((sentinel)) -#endif -bool luaW_getglobal(lua_State *L, ...) +bool luaW_getglobal(lua_State *L, const std::vector& path) { lua_pushglobaltable(L); - va_list ap; - va_start(ap, L); - while (const char *s = va_arg(ap, const char *)) + for (const std::string& s : path) { if (!lua_istable(L, -1)) goto discard; - lua_pushstring(L, s); + lua_pushlstring(L, s.c_str(), s.size()); lua_rawget(L, -2); lua_remove(L, -2); } if (lua_isnil(L, -1)) { discard: - va_end(ap); lua_pop(L, 1); return false; } - va_end(ap); return true; } diff --git a/src/scripting/lua_common.hpp b/src/scripting/lua_common.hpp index 471a717c3b6f..0cf21113e49b 100644 --- a/src/scripting/lua_common.hpp +++ b/src/scripting/lua_common.hpp @@ -28,6 +28,7 @@ class vconfig; #include "scripting/lua_types.hpp" #include "variable_info.hpp" #include "map/location.hpp" +#include namespace lua_common { int intf_textdomain(lua_State *L); @@ -139,7 +140,17 @@ vconfig luaW_checkvconfig(lua_State *L, int index, bool allow_missing = false); * value is not nil. * @return true if an element was pushed. */ -bool luaW_getglobal(lua_State *L, ...); +bool luaW_getglobal(lua_State *L, const std::vector& path); + +/** + * Pushes the value found by following the variadic names (char *), if the + * value is not nil. + * @return true if an element was pushed. + */ +template +bool luaW_getglobal(lua_State *L, T... path) { + return luaW_getglobal(L, std::vector {path...} ); +} bool luaW_toboolean(lua_State *L, int n); From fb6031d6a14c868914a91afd14fcd43c41faf9eb Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 02:12:53 -0400 Subject: [PATCH 079/240] lua_function= in SUF now has limited support for non-global functions To be precise, the string is considered as a dot-separated list of components. --- changelog | 2 ++ src/scripting/game_lua_kernel.cpp | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 8ea39cd7ef6e..efadb73f5940 100644 --- a/changelog +++ b/changelog @@ -21,6 +21,8 @@ Version 1.13.4+dev: * Weapon filters now support number, parry, accuracy, and movement_used * New [has_attack] in standard unit filters; supercedes has_weapon= and uses full weapon filter. + * lua_function=var.member now works in SUF; however, 'var' still needs to + be a global variable. * AiWML: * Simplified aspect syntax which works for all aspects, present and future: * All aspects with simple values can be specified as key=value diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index a1bf10df12b7..686b2ed6c19a 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -4896,7 +4896,8 @@ bool game_lua_kernel::run_filter(char const *name, unit const &u) if (!ui.valid()) return false; // Get the user filter by name. - if(!luaW_getglobal(L, name)) + const std::vector& path = utils::split(name, '.', utils::STRIP_SPACES); + if(!luaW_getglobal(L, path)) { std::string message = std::string() + "function " + name + " not found"; log_error(message.c_str(), "Lua SUF Error"); From 61cb45ac8c3b579bab41b47bf3ef21f2c54be57f Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 21:22:53 +1100 Subject: [PATCH 080/240] Fixup b98687147 --- src/log_windows.cpp | 5 ++++- src/log_windows.hpp | 1 - 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/log_windows.cpp b/src/log_windows.cpp index 9b77eb5fb1dd..8f5d75937b6f 100644 --- a/src/log_windows.cpp +++ b/src/log_windows.cpp @@ -12,6 +12,10 @@ See the COPYING file for more details. */ +// For some reason, it became necessary to include this before the header +// after switching to c++11 +#include + #include "log_windows.hpp" #include "filesystem.hpp" @@ -19,7 +23,6 @@ #include "log.hpp" #include "serialization/unicode.hpp" -#include #include #include diff --git a/src/log_windows.hpp b/src/log_windows.hpp index f2b8fc23717e..039989e983cb 100644 --- a/src/log_windows.hpp +++ b/src/log_windows.hpp @@ -15,7 +15,6 @@ #ifndef DESKTOP_WINDOWS_LOG_HPP_INCLUDED #define DESKTOP_WINDOWS_LOG_HPP_INCLUDED -#include #include /** From 83dd965f9e2befffb853005c5f793138b3659063 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 21:31:21 +1100 Subject: [PATCH 081/240] WML test fixup by Soliton --- run_wml_tests | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/run_wml_tests b/run_wml_tests index 8b6094c04eb1..f19460aa37d8 100755 --- a/run_wml_tests +++ b/run_wml_tests @@ -276,12 +276,12 @@ extra_opts+="$*" # Make sure the binary exists if [ "$DebugMode" -eq 1 ]; then - if [ "! ( -f $BinPath/wesnoth-debug -a -x $BinPath/wesnoth-debug )" ]; then + if [ ! -x "$BinPath/wesnoth-debug" ]; then echo "Wesnoth binary not found at $BinPath/wesnoth-debug" exit 1 fi else - if [ "! ( -f $BinPath/wesnoth -a -x $BinPath/wesnoth )" ]; then + if [ ! -x "$BinPath/wesnoth" ]; then echo "Wesnoth binary not found at $BinPath/wesnoth" exit 1 fi From accbcd0466e9902d99e60bcd11d9b7d011d70abb Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 31 Mar 2016 23:59:08 +1100 Subject: [PATCH 082/240] SoF: italicize description poem --- data/campaigns/Sceptre_of_Fire/_main.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/campaigns/Sceptre_of_Fire/_main.cfg b/data/campaigns/Sceptre_of_Fire/_main.cfg index e50b60088edf..6238effd51c2 100644 --- a/data/campaigns/Sceptre_of_Fire/_main.cfg +++ b/data/campaigns/Sceptre_of_Fire/_main.cfg @@ -20,14 +20,14 @@ {CAMPAIGN_DIFFICULTY HARD "units/dwarves/lord.png~RC(magenta>red)" ( _ "Lord") ( _ "Difficult")} # wmllint: directory spelling Dwarfdom - description= _ "The land of Wesnoth’s banner bold + description= _ "The land of Wesnoth’s banner bold Comes not from its own land; It comes from Dwarfdom, grim and old Made by a runesmith’s hand. So now I tell from whence it came — The Fire-sceptre great — And of the makers of the same, -Their tale I now relate... +Their tale I now relate... " + _"(Expert level, 9 scenarios.)" From a0ffdff8120fe7b2e6475cf7fad3a8d94ab9fb91 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 1 Apr 2016 01:51:01 +1100 Subject: [PATCH 083/240] Convert plain usecases of boost::assign::list_of() to initializer lists Usecases calling to_container() or convert_to_container() were left alone. --- src/ai/configuration.cpp | 7 +- src/game_data.cpp | 2 +- src/game_events/action_wml.cpp | 2 +- .../multiplayer_configure.cpp | 1 - src/gui/dialogs/advanced_graphics_options.cpp | 3 +- src/map/location.cpp | 7 +- src/movetype.cpp | 4 +- src/mp_ui_alerts.cpp | 3 +- src/play_controller.cpp | 1 - src/save_index.cpp | 3 +- src/saved_game.cpp | 9 +- src/savegame.cpp | 1 - src/team.cpp | 1 - src/tests/gui/test_gui2.cpp | 11 +- src/tests/test_commandline_options.cpp | 164 +++++++++--------- src/tests/test_filesystem.cpp | 3 - src/units/unit.cpp | 14 +- 17 files changed, 111 insertions(+), 125 deletions(-) diff --git a/src/ai/configuration.cpp b/src/ai/configuration.cpp index 8d22dd78af47..7d00da410e29 100644 --- a/src/ai/configuration.cpp +++ b/src/ai/configuration.cpp @@ -28,7 +28,6 @@ #include "config_assign.hpp" #include -#include #include #include @@ -248,9 +247,9 @@ bool configuration::parse_side_config(side_number side, const config& original_c } -static const std::set non_aspect_attributes = boost::assign::list_of("turns")("time_of_day")("engine")("ai_algorithm")("id")("description"); -static const std::set just_copy_tags = boost::assign::list_of("engine")("stage")("aspect")("goal")("modify_ai"); -static const std::set old_goal_tags = boost::assign::list_of("target")("target_location")("protect_unit")("protect_location"); +static const std::set non_aspect_attributes = {"turns", "time_of_day", "engine", "ai_algorithm", "id", "description"}; +static const std::set just_copy_tags = {"engine", "stage", "aspect", "goal", "modify_ai"}; +static const std::set old_goal_tags = {"target", "target_location", "protect_unit", "protect_location"}; void configuration::expand_simplified_aspects(side_number side, config &cfg) { std::string algorithm; diff --git a/src/game_data.cpp b/src/game_data.cpp index 280fec197996..ffee419f779b 100644 --- a/src/game_data.cpp +++ b/src/game_data.cpp @@ -103,7 +103,7 @@ void game_data::set_variable(const std::string& key, const t_string& value) //throws config& game_data::add_variable_cfg(const std::string& key, const config& value) { - std::vector temp = boost::assign::list_of(value); + std::vector temp = {value}; return *get_variable_access_write(key).append_array(temp).first; } diff --git a/src/game_events/action_wml.cpp b/src/game_events/action_wml.cpp index a8a13f3b205a..153318b6a507 100644 --- a/src/game_events/action_wml.cpp +++ b/src/game_events/action_wml.cpp @@ -349,7 +349,7 @@ WML_HANDLER_FUNCTION(do_command, cfg) return; } - static const std::set allowed_tags = boost::assign::list_of("attack")("move")("recruit")("recall")("disband")("fire_event")("lua_ai"); + static const std::set allowed_tags = {"attack", "move", "recruit", "recall", "disband", "fire_event", "lua_ai"}; const bool is_too_early = resources::gamedata->phase() != game_data::START && resources::gamedata->phase() != game_data::PLAY; if(is_too_early) diff --git a/src/game_initialization/multiplayer_configure.cpp b/src/game_initialization/multiplayer_configure.cpp index 19720563764d..396e43effd80 100644 --- a/src/game_initialization/multiplayer_configure.cpp +++ b/src/game_initialization/multiplayer_configure.cpp @@ -35,7 +35,6 @@ #include "wml_separators.hpp" #include "formula/string_utils.hpp" -#include #include #include diff --git a/src/gui/dialogs/advanced_graphics_options.cpp b/src/gui/dialogs/advanced_graphics_options.cpp index 1ab06105f4ea..88315c3ce57d 100644 --- a/src/gui/dialogs/advanced_graphics_options.cpp +++ b/src/gui/dialogs/advanced_graphics_options.cpp @@ -31,7 +31,6 @@ #include #include -#include #include "gettext.hpp" @@ -40,7 +39,7 @@ namespace gui2 REGISTER_DIALOG(advanced_graphics_options) -const std::vector tadvanced_graphics_options::scale_cases = boost::assign::list_of("zoom")("hex"); +const std::vector tadvanced_graphics_options::scale_cases = {"zoom", "hex"}; tadvanced_graphics_options::SCALING_ALGORITHM tadvanced_graphics_options::get_scale_pref(const std::string& pref_id) { diff --git a/src/map/location.cpp b/src/map/location.cpp index 0472e152d657..37026b954d47 100644 --- a/src/map/location.cpp +++ b/src/map/location.cpp @@ -28,7 +28,6 @@ #include "gettext.hpp" #include "util.hpp" -#include #include #define ERR_CF LOG_STREAM(err, config) @@ -54,9 +53,9 @@ std::ostream &operator<<(std::ostream &s, std::vector const &v) { * **/ const std::vector & map_location::default_dirs() { - static const std::vector dirs = boost::assign::list_of(map_location::NORTH) - (map_location::NORTH_EAST)(map_location::SOUTH_EAST)(map_location::SOUTH) - (map_location::SOUTH_WEST)(map_location::NORTH_WEST); + static const std::vector dirs = {map_location::NORTH, + map_location::NORTH_EAST, map_location::SOUTH_EAST, map_location::SOUTH, + map_location::SOUTH_WEST, map_location::NORTH_WEST}; return dirs; } diff --git a/src/movetype.cpp b/src/movetype.cpp index 0e83b4e8dc1d..5ea31a580e29 100644 --- a/src/movetype.cpp +++ b/src/movetype.cpp @@ -777,8 +777,8 @@ void movetype::merge(const config & new_cfg, bool overwrite) /** * The set of strings defining effects which apply to movetypes. */ -const std::set movetype::effects = boost::assign::list_of("movement_costs") - ("vision_costs")("jamming_costs")("defense")("resistance"); +const std::set movetype::effects = {"movement_costs", + "vision_costs", "jamming_costs", "defense", "resistance"}; /** * Writes the movement type data to the provided config. diff --git a/src/mp_ui_alerts.cpp b/src/mp_ui_alerts.cpp index 5d7e1c3ec367..5da7579a2ff3 100644 --- a/src/mp_ui_alerts.cpp +++ b/src/mp_ui_alerts.cpp @@ -28,7 +28,6 @@ #include "preferences.hpp" #include "sound.hpp" -#include #include #include @@ -54,7 +53,7 @@ bool notif_pref(std::string id) } // end anonymous namespace // Note: This list must agree with data/gui/.../lobby_sound_options.cfg -const std::vector items = boost::assign::list_of("player_joins")("player_leaves")("private_message")("friend_message")("public_message")("server_message")("ready_for_start")("game_has_begun")("turn_changed"); +const std::vector items = {"player_joins", "player_leaves", "private_message", "friend_message", "public_message", "server_message", "ready_for_start", "game_has_begun", "turn_changed"}; void player_joins(bool is_lobby) { diff --git a/src/play_controller.cpp b/src/play_controller.cpp index dcab465da53d..72f2141a932e 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -66,7 +66,6 @@ #include #include -#include static lg::log_domain log_aitesting("aitesting"); #define LOG_AIT LOG_STREAM(info, log_aitesting) diff --git a/src/save_index.cpp b/src/save_index.cpp index 3f0b0ce068f6..e45d0d193453 100644 --- a/src/save_index.cpp +++ b/src/save_index.cpp @@ -13,7 +13,6 @@ See the COPYING file for more details. */ -#include #include #include "save_index.hpp" @@ -254,7 +253,7 @@ void read_save_file(const std::string& name, config& cfg, std::string* error_log std::string modified_name = name; replace_space2underbar(modified_name); - static const std::vector suffixes = boost::assign::list_of("")(".gz")(".bz2"); + static const std::vector suffixes = {"", ".gz", ".bz2"}; filesystem::scoped_istream file_stream = find_save_file(modified_name, name, suffixes); cfg.clear(); diff --git a/src/saved_game.cpp b/src/saved_game.cpp index 236cba7172d9..3d7c8f513377 100644 --- a/src/saved_game.cpp +++ b/src/saved_game.cpp @@ -61,7 +61,6 @@ #include "formula/string_utils.hpp" #include "config.hpp" //Also for variable_set -#include #include #include #include @@ -170,10 +169,10 @@ void saved_game::set_defaults() { const bool is_loaded_game = this->starting_pos_type_ != STARTINGPOS_SCENARIO; const bool is_multiplayer_tag = classification().get_tagname() == "multiplayer"; - static const std::vector team_defaults = boost::assign::list_of - ("carryover_percentage") - ("carryover_add") - ; + static const std::vector team_defaults = { + "carryover_percentage", + "carryover_add", + }; BOOST_FOREACH(config& side, starting_pos_.child_range("side")) { // Set save_id default value directly after loading to its default to prevent different default behaviour in mp_connect code and sp code. diff --git a/src/savegame.cpp b/src/savegame.cpp index 5ab31822284a..a482f92d8f3d 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -13,7 +13,6 @@ See the COPYING file for more details. */ -#include #include #include "savegame.hpp" diff --git a/src/team.cpp b/src/team.cpp index 14cdf1863b9d..39210e86bae1 100644 --- a/src/team.cpp +++ b/src/team.cpp @@ -37,7 +37,6 @@ #include "serialization/string_utils.hpp" #include -#include static lg::log_domain log_engine("engine"); #define DBG_NG LOG_STREAM(debug, log_engine) diff --git a/src/tests/gui/test_gui2.cpp b/src/tests/gui/test_gui2.cpp index 1d4299289a15..79c073b03303 100644 --- a/src/tests/gui/test_gui2.cpp +++ b/src/tests/gui/test_gui2.cpp @@ -88,7 +88,6 @@ #include "video.hpp" #include "wml_exception.hpp" -#include #include #include @@ -776,7 +775,7 @@ struct twrapper { static gui2::tdepcheck_confirm_change* create() { - static std::vector mods = boost::assign::list_of("mod_one")("some other")("more"); + static std::vector mods = {"mod_one", "some other", "more"}; return new gui2::tdepcheck_confirm_change(true, mods, "requester"); } }; @@ -786,7 +785,7 @@ struct twrapper { static gui2::tdepcheck_select_new* create() { - static std::vector mods = boost::assign::list_of("mod_one")("some other")("more"); + static std::vector mods = {"mod_one", "some other", "more"}; return new gui2::tdepcheck_select_new(ng::depcheck::MODIFICATION, mods); } }; @@ -844,8 +843,8 @@ struct twrapper } static gui2::ttheme_list* create() { - static std::vector themes = boost::assign::list_of(make_theme("classic")) - (make_theme("new"))(make_theme("more"))(make_theme("themes")); + static std::vector themes = {make_theme("classic"), + make_theme("new"), make_theme("more"), make_theme("themes")}; return new gui2::ttheme_list(themes, 0); } }; @@ -947,7 +946,7 @@ struct twrapper { static gui2::twml_error* create() { - static std::vector files = boost::assign::list_of("some")("files")("here"); + static std::vector files = {"some", "files", "here"}; return new gui2::twml_error("Summary", "Post summary", files, "Details"); } }; diff --git a/src/tests/test_commandline_options.cpp b/src/tests/test_commandline_options.cpp index f400d8640e5c..ef18e6584d4a 100644 --- a/src/tests/test_commandline_options.cpp +++ b/src/tests/test_commandline_options.cpp @@ -23,7 +23,7 @@ BOOST_AUTO_TEST_SUITE( cmdline_opts ) BOOST_AUTO_TEST_CASE (test_empty_options) { - std::vector args = boost::assign::list_of("wesnoth"); + std::vector args = {"wesnoth"}; commandline_options co(args); BOOST_CHECK(!co.campaign); @@ -96,14 +96,14 @@ BOOST_AUTO_TEST_CASE (test_empty_options) BOOST_AUTO_TEST_CASE (test_default_options) { - std::vector args = boost::assign::list_of - ("wesnoth") - ("--campaign") - ("--editor") - ("--logdomains") - ("--preprocess-output-macros") - ("--server") - ("--test"); + std::vector args = { + "wesnoth", + "--campaign", + "--editor", + "--logdomains", + "--preprocess-output-macros", + "--server", + "--test"}; commandline_options co(args); BOOST_CHECK(co.campaign && co.campaign->empty()); @@ -176,78 +176,78 @@ BOOST_AUTO_TEST_CASE (test_default_options) BOOST_AUTO_TEST_CASE (test_full_options) { - std::vector args = boost::assign::list_of - ("wesnoth") - ("--ai-config=1:aifoo") - ("--ai-config=2:aibar") - ("--algorithm=3:algfoo") - ("--algorithm=4:algbar") - ("--campaign=campfoo") - ("--campaign-difficulty=16") - ("--campaign-scenario=scenfoo") - ("--clock") - ("--controller=5:confoo") - ("--controller=6:conbar") - ("--data-dir=datadirfoo") - ("--data-path") - ("--debug") + std::vector args = { + "wesnoth", + "--ai-config=1:aifoo", + "--ai-config=2:aibar", + "--algorithm=3:algfoo", + "--algorithm=4:algbar", + "--campaign=campfoo", + "--campaign-difficulty=16", + "--campaign-scenario=scenfoo", + "--clock", + "--controller=5:confoo", + "--controller=6:conbar", + "--data-dir=datadirfoo", + "--data-path", + "--debug", #ifdef DEBUG_WINDOW_LAYOUT_GRAPHS - ("--debug-dot-domain=ddfoo") - ("--debug-dot-level=dlfoo") + "--debug-dot-domain=ddfoo", + "--debug-dot-level=dlfoo", #endif - ("--editor=editfoo") - ("--era=erafoo") - ("--exit-at-end") - ("--fps") - ("--fullscreen") - ("--gunzip=gunzipfoo.gz") - ("--gzip=gzipfoo") - ("--help") - ("--ignore-map-settings") - ("--label=labelfoo") - ("--load=loadfoo") - ("--log-error=errfoo,errbar/*") - ("--log-warning=warnfoo,warnfoo/bar") - ("--log-info=infofoo") - ("--log-debug=dbgfoo,dbgbar,dbg/foo/bar/baz") - ("--logdomains=filterfoo") - ("--max-fps=100") - ("--multiplayer") - ("--new-widgets") - ("--nocache") - ("--nodelay") - ("--nomusic") - ("--nosound") - ("--nogui") - ("--parm=7:parmfoo:valfoo") - ("--parm=8:parmbar:valbar") - ("--path") - ("--preprocess") ("preppathfoo") ("preptargfoo") - ("--preprocess-defines=DEFFOO,DEFBAR") - ("--preprocess-input-macros=inmfoo") - ("--preprocess-output-macros=outmfoo") - ("--proxy") - ("--proxy-address=addressfoo") - ("--proxy-password=passfoo") - ("--proxy-port=portfoo") - ("--proxy-user=userfoo") - ("--resolution=800x600") - ("--rng-seed=1234") - ("--scenario=scenfoo") - ("--screenshot") ("mapfoo") ("outssfoo") - ("--side=9:sidefoo") - ("--side=10:sidebar") - ("--server=servfoo") - ("--test=testfoo") - ("--turns=42") - ("--userconfig-dir=userconfigdirfoo") - ("--userconfig-path") - ("--userdata-dir=userdatadirfoo") - ("--userdata-path") - ("--validcache") - ("--version") - ("--windowed") - ("--with-replay"); + "--editor=editfoo", + "--era=erafoo", + "--exit-at-end", + "--fps", + "--fullscreen", + "--gunzip=gunzipfoo.gz", + "--gzip=gzipfoo", + "--help", + "--ignore-map-settings", + "--label=labelfoo", + "--load=loadfoo", + "--log-error=errfoo,errbar/*", + "--log-warning=warnfoo,warnfoo/bar",) + "--log-info=infofoo", + "--log-debug=dbgfoo,dbgbar,dbg/foo/bar/baz", + "--logdomains=filterfoo", + "--max-fps=100", + "--multiplayer", + "--new-widgets", + "--nocache", + "--nodelay", + "--nomusic", + "--nosound", + "--nogui", + "--parm=7:parmfoo:valfoo", + "--parm=8:parmbar:valbar", + "--path", + "--preprocess", "preppathfoo", "preptargfoo", + "--preprocess-defines=DEFFOO,DEFBAR", + "--preprocess-input-macros=inmfoo", + "--preprocess-output-macros=outmfoo", + "--proxy", + "--proxy-address=addressfoo", + "--proxy-password=passfoo", + "--proxy-port=portfoo", + "--proxy-user=userfoo", + "--resolution=800x600", + "--rng-seed=1234", + "--scenario=scenfoo", + "--screenshot", "mapfoo", "outssfoo", + "--side=9:sidefoo", + "--side=10:sidebar", + "--server=servfoo", + "--test=testfoo", + "--turns=42", + "--userconfig-dir=userconfigdirfoo", + "--userconfig-path", + "--userdata-dir=userdatadirfoo", + "--userdata-path", + "--validcache", + "--version", + "--windowed", + "--with-replay"}; commandline_options co(args); @@ -342,9 +342,9 @@ BOOST_AUTO_TEST_CASE (test_full_options) BOOST_AUTO_TEST_CASE (test_positional_options) { - std::vector args = boost::assign::list_of - ("wesnoth") - ("datadirfoo"); + std::vector args = { + "wesnoth", + "datadirfoo"}; commandline_options co(args); diff --git a/src/tests/test_filesystem.cpp b/src/tests/test_filesystem.cpp index 5377e7526374..c7b253f82606 100644 --- a/src/tests/test_filesystem.cpp +++ b/src/tests/test_filesystem.cpp @@ -16,11 +16,8 @@ #include "filesystem.hpp" #include "game_config.hpp" -#include #include -using boost::assign::list_of; - #if 0 namespace { diff --git a/src/units/unit.cpp b/src/units/unit.cpp index 72eae5bc229a..3a3b3d21d515 100644 --- a/src/units/unit.cpp +++ b/src/units/unit.cpp @@ -1708,13 +1708,13 @@ size_t unit::modification_count(const std::string& mod_type, const std::string& return res; } -const std::set unit::builtin_effects = boost::assign::list_of - ("alignment")("attack")("defense")("ellipse")("experience")("fearless") - ("halo")("healthy")("hitpoints")("image_mod")("jamming")("jamming_costs") - ("loyal")("max_attacks")("max_experience")("movement")("movement_costs") - ("new_ability")("new_advancement")("new_animation")("new_attack")("overlay")("profile") - ("recall_cost")("remove_ability")("remove_advancement")("remove_attacks")("resistance") - ("status")("type")("variation")("vision")("vision_costs")("zoc"); +const std::set unit::builtin_effects = { + "alignment", "attack", "defense", "ellipse", "experience", "fearless", + "halo", "healthy", "hitpoints", "image_mod", "jamming", "jamming_costs", + "loyal", "max_attacks", "max_experience", "movement", "movement_costs", + "new_ability", "new_advancement", "new_animation", "new_attack", "overlay", "profile", + "recall_cost", "remove_ability", "remove_advancement", "remove_attacks", "resistance", + "status", "type", "variation", "vision", "vision_costs", "zoc"}; std::string unit::describe_builtin_effect(std::string apply_to, const config& effect) { From 0936066bf3e670afad845cc0b9c96cd122505d0f Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 1 Apr 2016 02:00:23 +1100 Subject: [PATCH 084/240] Fixed initializing of mp scenarios Was accidentally broken in 876710af8c2. --- src/game_initialization/create_engine.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index 4e85c39d2375..213e6c1b3f70 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -1058,8 +1058,7 @@ void create_engine::init_all_levels() // Stand-alone scenarios. BOOST_FOREACH(const config &data, - game_config_manager::get()->game_config().child_range( - std::to_string (game_classification::CAMPAIGN_TYPE::MULTIPLAYER))) + game_config_manager::get()->game_config().child_range("multiplayer")) { if (!data["allow_new_game"].to_bool(true)) continue; From f6452a3dd63adecff28dd0e627a34cd2ec0cd77c Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 1 Apr 2016 02:29:51 +1100 Subject: [PATCH 085/240] Small test fixup (same as 0936066bf3e6) --- src/tests/test_mp_connect.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/tests/test_mp_connect.cpp b/src/tests/test_mp_connect.cpp index c9e61c200275..33820583f8a5 100644 --- a/src/tests/test_mp_connect.cpp +++ b/src/tests/test_mp_connect.cpp @@ -82,7 +82,7 @@ struct mp_connect_fixture { state->mp_settings().saved_game = false; state->set_scenario(config_manager-> - game_config().find_child(std::to_string(game_classification::CAMPAIGN_TYPE::MULTIPLAYER), "id", state->mp_settings().name)); + game_config().find_child("multiplayer", "id", state->mp_settings().name)); state->mp_settings().num_turns = state->get_starting_pos()["turns"]; From 4024e673f7655afbe0cdb330697b756427b51678 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 11:38:19 -0400 Subject: [PATCH 086/240] tpreferences: Make checkmark translatable --- src/gui/dialogs/preferences_dialog.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index 663dc0000436..988df210e2ce 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -66,8 +66,6 @@ namespace { -const std::string text_feature_on = ""; - struct advanced_preferences_sorter { bool operator()(const config& lhs, const config& rhs) const @@ -936,6 +934,8 @@ void tpreferences::setup_hotkey_list(twindow& window) hotkey_list.clear(); visible_hotkeys_.clear(); + std::string text_feature_on = "" + _("✓") + ""; + FOREACH(const AUTO& hotkey_item, hotkey::get_hotkey_commands()) { if (hotkey_item.hidden) { From a0a8836bbe35ece3c2b310f85df3d04417c81986 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 1 Apr 2016 02:41:17 +1100 Subject: [PATCH 087/240] Used to_string() method instead of enum::enum_to_string() when possible --- src/formula/callable_objects.cpp | 2 +- src/game_board.cpp | 4 ++-- src/game_classification.cpp | 2 +- src/reports.cpp | 2 +- src/scripting/game_lua_kernel.cpp | 2 +- src/units/types.cpp | 4 ++-- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 359d9e275a9d..a772a8e2fc50 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -375,7 +375,7 @@ variant unit_type_callable::get_value(const std::string& key) const } else if(key == "type") { return variant(u_.type_name()); } else if(key == "alignment") { - return variant(unit_type::ALIGNMENT::enum_to_string(u_.alignment())); + return variant(u_.alignment().to_string()); } else if(key == "race") { return variant(u_.race_id()); } else if(key == "abilities") { diff --git a/src/game_board.cpp b/src/game_board.cpp index acc9d9cc4330..5c16542d4d02 100644 --- a/src/game_board.cpp +++ b/src/game_board.cpp @@ -207,10 +207,10 @@ void game_board::side_drop_to(int side_num, team::CONTROLLER ctrl, team::PROXY_C tm.change_proxy(proxy); tm.set_local(true); - tm.set_current_player(team::CONTROLLER::enum_to_string(ctrl) + std::to_string(side_num)); + tm.set_current_player(ctrl.to_string() + std::to_string(side_num)); unit_map::iterator leader = units_.find_leader(side_num); - if (leader.valid()) leader->rename(team::CONTROLLER::enum_to_string(ctrl) + std::to_string(side_num)); + if (leader.valid()) leader->rename(ctrl.to_string() + std::to_string(side_num)); } void game_board::side_change_controller(int side_num, bool is_local, const std::string& pname) { diff --git a/src/game_classification.cpp b/src/game_classification.cpp index 42f8046d867d..2f220f93a189 100644 --- a/src/game_classification.cpp +++ b/src/game_classification.cpp @@ -96,7 +96,7 @@ config game_classification::to_config() const cfg["label"] = label; cfg["version"] = game_config::version; - cfg["campaign_type"] = game_classification::CAMPAIGN_TYPE::enum_to_string(campaign_type); + cfg["campaign_type"] = campaign_type.to_string(); cfg["campaign_define"] = campaign_define; cfg["campaign_extra_defines"] = utils::join(campaign_xtra_defines); cfg["scenario_define"] = scenario_define; diff --git a/src/reports.cpp b/src/reports.cpp index 5a5b77eef8e2..9a63cb80a9cc 100644 --- a/src/reports.cpp +++ b/src/reports.cpp @@ -336,7 +336,7 @@ static config unit_alignment(reports::context & rc, const unit* u) if (!u) return config(); std::ostringstream str, tooltip; const std::string align = unit_type::alignment_description(u->alignment(), u->gender()); - const std::string align_id = unit_type::ALIGNMENT::enum_to_string(u->alignment()); + const std::string align_id = u->alignment().to_string(); int cm = combat_modifier(rc.units(), rc.map(), rc.screen().displayed_unit_hex(), u->alignment(), u->is_fearless()); diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 686b2ed6c19a..df98a6ae3928 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -1551,7 +1551,7 @@ int game_lua_kernel::impl_game_config_get(lua_State *L) const mp_game_settings& mp_settings = play_controller_.get_mp_settings(); const game_classification & classification = play_controller_.get_classification(); - return_string_attrib("campaign_type", game_classification::CAMPAIGN_TYPE::enum_to_string(classification.campaign_type)); + return_string_attrib("campaign_type", classification.campaign_type.to_string()); if(classification.campaign_type==game_classification::CAMPAIGN_TYPE::MULTIPLAYER) { return_cfgref_attrib("mp_settings", mp_settings.to_config()); return_cfgref_attrib("era", game_config_manager::get()->game_config().find_child("era","id",mp_settings.mp_era)); diff --git a/src/units/types.cpp b/src/units/types.cpp index 9dd610466acd..d458abc6a6d7 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -836,9 +836,9 @@ std::string unit_type::alignment_description(ALIGNMENT align, unit_race::GENDER std::string str = std::string(); if (gender == unit_race::FEMALE) { ALIGNMENT_FEMALE_VARIATION fem = align.cast(); - str = ALIGNMENT_FEMALE_VARIATION::enum_to_string(fem); + str = fem.to_string(); } else { - str = ALIGNMENT::enum_to_string(align); + str = align.to_string(); } return translation::sgettext(str.c_str()); } From c8a71438ac2a83597fae9d17e1597421980c5f87 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 13:23:03 -0400 Subject: [PATCH 088/240] Fix unit tests --- src/tests/test_commandline_options.cpp | 2 +- src/tests/test_filesystem.cpp | 26 +++++++++++++------------- 2 files changed, 14 insertions(+), 14 deletions(-) diff --git a/src/tests/test_commandline_options.cpp b/src/tests/test_commandline_options.cpp index ef18e6584d4a..e18d1aabdd17 100644 --- a/src/tests/test_commandline_options.cpp +++ b/src/tests/test_commandline_options.cpp @@ -207,7 +207,7 @@ BOOST_AUTO_TEST_CASE (test_full_options) "--label=labelfoo", "--load=loadfoo", "--log-error=errfoo,errbar/*", - "--log-warning=warnfoo,warnfoo/bar",) + "--log-warning=warnfoo,warnfoo/bar", "--log-info=infofoo", "--log-debug=dbgfoo,dbgbar,dbg/foo/bar/baz", "--logdomains=filterfoo", diff --git a/src/tests/test_filesystem.cpp b/src/tests/test_filesystem.cpp index c7b253f82606..bba7cc2260ae 100644 --- a/src/tests/test_filesystem.cpp +++ b/src/tests/test_filesystem.cpp @@ -90,19 +90,19 @@ BOOST_AUTO_TEST_CASE( test_fs_enum ) { const std::string path = "data/test/test/filesystem/enum"; - const std::vector expected_filenames = list_of - ("_initial.cfg") - ("A1.cfg") - ("A2.cfg") - ("A3.cfg") - ("B1.cfg") - ("B2.cfg") - ("B3.cfg") - ("_final.cfg"); - const std::vector expected_dirnames = list_of - ("D1") - ("D2") - ("D3"); + const std::vector expected_filenames = { + "_initial.cfg", + "A1.cfg", + "A2.cfg", + "A3.cfg", + "B1.cfg", + "B2.cfg", + "B3.cfg", + "_final.cfg"}; + const std::vector expected_dirnames = { + "D1", + "D2", + "D3"}; std::vector files, dirs; std::vector expected_filepaths, expected_dirpaths; From 5d9e211b349a8309e0176de4bea0811452749da5 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Thu, 31 Mar 2016 20:16:58 +0200 Subject: [PATCH 089/240] fix loadscreen always showing before campaigns menu. --- src/game_config_manager.cpp | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index 7292bd0300cc..3edf4b54c6b2 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -122,28 +122,29 @@ bool map_includes(const preproc_map& general, const preproc_map& special) void game_config_manager::load_game_config_with_loadscreen(FORCE_RELOAD_CONFIG force_reload, game_classification const* classification) { + game_config::scoped_preproc_define debug_mode("DEBUG_MODE", + game_config::debug || game_config::mp_debug); + + // Game_config already holds requested config in memory. + if (!game_config_.empty()) { + if ((force_reload == NO_FORCE_RELOAD) && old_defines_map_ == cache_.get_preproc_map()) { + return; + } + if ((force_reload == NO_INCLUDE_RELOAD) && map_includes(old_defines_map_, cache_.get_preproc_map())) { + return; + } + } + gui2::tloadscreen::display(video_, [=]() { load_game_config(force_reload, classification); }); } void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, game_classification const* classification) - { +{ // Make sure that 'debug mode' symbol is set // if command line parameter is selected // also if we're in multiplayer and actual debug mode is disabled. - game_config::scoped_preproc_define debug_mode("DEBUG_MODE", - game_config::debug || game_config::mp_debug); - - // Game_config already holds requested config in memory. - if(!game_config_.empty()) { - if((force_reload == NO_FORCE_RELOAD) && old_defines_map_ == cache_.get_preproc_map()) { - return; - } - if((force_reload == NO_INCLUDE_RELOAD) && map_includes(old_defines_map_, cache_.get_preproc_map())) { - return; - } - } // The loadscreen will erase the titlescreen. // NOTE: even without loadscreen, needed after MP lobby. From c01e5e8a39e0efe2dfab8aec2346854cabe65924 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Thu, 31 Mar 2016 20:17:35 +0200 Subject: [PATCH 090/240] fix starting positions in gamemap::write() --- src/map/map.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/map/map.cpp b/src/map/map.cpp index 61d8a41cef6c..f5de9aff365a 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -276,8 +276,8 @@ std::string gamemap::write() const for(int i = 0, size = starting_positions_.size(); i < size; ++i) { if(on_board(starting_positions_[i])) { starting_positions[i + 1] = t_translation::coordinate( - starting_positions[i].x + border_size_, - starting_positions[i].y + border_size_ + starting_positions_[i].x + border_size_, + starting_positions_[i].y + border_size_ ); } } From ec43700ff5bf062fddbf881e43077471466f09bd Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 16:05:15 -0400 Subject: [PATCH 091/240] XCode: Enable unit tests build --- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 2108 +++++++++++------ src/tests/main.cpp | 4 + src/tests/test_network_worker.cpp | 2 +- 3 files changed, 1339 insertions(+), 775 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index ed435b876d8e..1a27bb0cabfd 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -72,7 +72,6 @@ 911F2DAD1BA086A400E3102E /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAB1BA086A400E3102E /* window.cpp */; }; 911F2DB01BA086FA00E3102E /* alpha.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAE1BA086F900E3102E /* alpha.cpp */; }; 9122417C1CAAB7B7008B347F /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9122417A1CAAB7B7008B347F /* loadscreen.cpp */; }; - 9122417D1CAAB7B7008B347F /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9122417A1CAAB7B7008B347F /* loadscreen.cpp */; }; 91273E8F1C7BF1D7005E7F81 /* _main.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E721C7BF1C0005E7F81 /* _main.cfg */; }; 91273E901C7BF1D7005E7F81 /* advanced_preferences.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E731C7BF1C0005E7F81 /* advanced_preferences.cfg */; }; 91273E911C7BF1D7005E7F81 /* ai in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E741C7BF1C0005E7F81 /* ai */; }; @@ -100,9 +99,314 @@ 91273EAA1C7BF1D8005E7F81 /* tips.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E8D1C7BF1C5005E7F81 /* tips.cfg */; }; 91273EAB1C7BF1D8005E7F81 /* tools in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E8E1C7BF1C5005E7F81 /* tools */; }; 9130A4601C73BB6100852782 /* select_orb_colors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9130A45E1C73BB6100852782 /* select_orb_colors.cpp */; }; - 9130A4611C73BB6100852782 /* select_orb_colors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9130A45E1C73BB6100852782 /* select_orb_colors.cpp */; }; + 916718E61CADA3BF00B055A9 /* connect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB00ECA805A002BE442 /* connect.cpp */; }; + 916718E71CADA3BF00B055A9 /* description.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F4161354FBB20027E614 /* description.cpp */; }; + 916718E81CADA3BF00B055A9 /* filter_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620091C11575C784009AA2C9 /* filter_options.cpp */; }; + 916718E91CADA3BF00B055A9 /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B514C7090F5450CC00E273F0 /* list.cpp */; }; + 916718EA1CADA3BF00B055A9 /* uninstall_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4FBD769145D93370083CA67 /* uninstall_list.cpp */; }; + 916718EB1CADA88800B055A9 /* libgobject-2.0.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC5C242818EF07B4001FA499 /* libgobject-2.0.0.dylib */; }; + 916718EC1CADA9DA00B055A9 /* unit_attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8891213589100CFBDAB /* unit_attack.cpp */; }; + 916718ED1CADA9DA00B055A9 /* unit_create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F9731103716E400A57C1A /* unit_create.cpp */; }; + 916718EE1CADA9DA00B055A9 /* unit_recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA68B1C9066EC0030F8D0 /* unit_recruit.cpp */; }; + 916718EF1CADA9DA00B055A9 /* wml_error.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECF3A0B118AD3E8700DD643A /* wml_error.cpp */; }; + 916718F01CADA9DA00B055A9 /* wml_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55A80520EDF3DFB00C9D97A /* wml_message.cpp */; }; + 916718F11CADA9E400B055A9 /* select_orb_colors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9130A45E1C73BB6100852782 /* select_orb_colors.cpp */; }; + 916718F21CADA9E400B055A9 /* simple_item_selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470312A041EF00D665EE /* simple_item_selector.cpp */; }; + 916718F31CADA9E400B055A9 /* theme_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC3381C518B520120020DD6F /* theme_list.cpp */; }; + 916718F41CADA9E400B055A9 /* tip.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F4111354FB970027E614 /* tip.cpp */; }; + 916718F51CADA9E400B055A9 /* title_screen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC90ECA805A002BE442 /* title_screen.cpp */; }; + 916718F61CADA9E400B055A9 /* transient_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6F10FEA9F92006F6FBD /* transient_message.cpp */; }; + 916718F71CADA9EF00B055A9 /* network_transmission.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4EF0D7313AD52EA003C701D /* network_transmission.cpp */; }; + 916718F81CADA9EF00B055A9 /* popup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F4101354FB970027E614 /* popup.cpp */; }; + 916718F91CADA9EF00B055A9 /* preferences_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462821C71139B0050A9C9 /* preferences_dialog.cpp */; }; + 916718FA1CADA9EF00B055A9 /* screenshot_notification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC19E6EE18B7F24B003B4B81 /* screenshot_notification.cpp */; }; + 916718FB1CADAA1200B055A9 /* fake_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C00FACD43B00CE81F5 /* fake_display.cpp */; }; + 916718FC1CADAA1200B055A9 /* fake_event_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C20FACD43B00CE81F5 /* fake_event_source.cpp */; }; + 916718FD1CADAA1200B055A9 /* game_config_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C40FACD43B00CE81F5 /* game_config_manager.cpp */; }; + 916718FE1CADAA1200B055A9 /* play_scenario.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C60FACD43B00CE81F5 /* play_scenario.cpp */; }; + 916718FF1CADAA1D00B055A9 /* fire_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3562A1CACA6E600774252 /* fire_event.cpp */; }; + 916719001CADAA1D00B055A9 /* iterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3562B1CACA6E600774252 /* iterator.cpp */; }; + 916719011CADAA1D00B055A9 /* test_drop_target.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4CE0FACD43B00CE81F5 /* test_drop_target.cpp */; }; + 916719021CADAA1D00B055A9 /* test_gui2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3562C1CACA6E600774252 /* test_gui2.cpp */; }; + 916719031CADAA1D00B055A9 /* test_save_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4CF0FACD43B00CE81F5 /* test_save_dialog.cpp */; }; + 916719041CADAA1D00B055A9 /* visitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3562D1CACA6E600774252 /* visitor.cpp */; }; + 916719051CADABC000B055A9 /* floating_point_emulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356081CACA6CB00774252 /* floating_point_emulation.cpp */; }; + 916719061CADABEA00B055A9 /* game_data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC387E68195AFB1F00FC0342 /* game_data.cpp */; }; + 916719071CADAC0D00B055A9 /* libboost_randomw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC64D75C1A085C990092EF75 /* libboost_randomw.dylib */; }; + 916719081CADAC2800B055A9 /* apple_notification.mm in Sources */ = {isa = PBXBuildFile; fileRef = F40A13BB1A3A88BA00C4D071 /* apple_notification.mm */; }; 919B37F81BAF789E00E0094C /* synced_user_choice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 919B37F71BAF789D00E0094C /* synced_user_choice.cpp */; }; 919B37FC1BAF7A9D00E0094C /* synced_choice_wait.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 919B37FA1BAF7A9D00E0094C /* synced_choice_wait.cpp */; }; + 91A214E51CAD666B00927AEA /* arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A1121359A600CFBDAB /* arrow.cpp */; }; + 91A214E61CAD666B00927AEA /* construct_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA20EC62181008DD061 /* construct_dialog.cpp */; }; + 91A214E71CAD666B00927AEA /* cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A9D0EC62181008DD061 /* cursor.cpp */; }; + 91A214E81CAD666B00927AEA /* clipboard.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC49A38119F34F1200E78528 /* clipboard.cpp */; }; + 91A214E91CAD666B00927AEA /* display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A990EC62181008DD061 /* display.cpp */; }; + 91A214EA1CAD666B00927AEA /* display_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECD39894194B844A00CF2125 /* display_context.cpp */; }; + 91A214EB1CAD666B00927AEA /* events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A970EC62181008DD061 /* events.cpp */; }; + 91A214EC1CAD666B00927AEA /* floating_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC45DEE01AD1CEF600BD760C /* floating_label.cpp */; }; + 91A214ED1CAD666B00927AEA /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A900EC62181008DD061 /* font.cpp */; }; + 91A214EE1CAD666B00927AEA /* format_time_summary.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECC8F419185FE2E1004AC3BE /* format_time_summary.cpp */; }; + 91A214EF1CAD669D00927AEA /* game_end_exceptions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F419A1F314E21246002F9ADC /* game_end_exceptions.cpp */; }; + 91A214F01CAD669D00927AEA /* cave_map_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4E3B1819B2D7AD0049CBD7 /* cave_map_generator.cpp */; }; + 91A214F11CAD669D00927AEA /* default_map_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4E3B1919B2D7AD0049CBD7 /* default_map_generator.cpp */; }; + 91A214F21CAD669D00927AEA /* default_map_generator_job.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECEEB7EF1A1E8AB20006575B /* default_map_generator_job.cpp */; }; + 91A214F31CAD669D00927AEA /* lua_map_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC5590761A0B11C600675179 /* lua_map_generator.cpp */; }; + 91A214F41CAD669D00927AEA /* map_create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E7C17B9064B00C16B75 /* map_create.cpp */; }; + 91A214F51CAD669D00927AEA /* map_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4E3B1A19B2D7AD0049CBD7 /* map_generator.cpp */; }; + 91A214F61CAD669D00927AEA /* generic_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A730EC62181008DD061 /* generic_event.cpp */; }; + 91A214F71CAD66B900927AEA /* command_executor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFA82DA184E59F3006782FB /* command_executor.cpp */; }; + 91A214F81CAD66B900927AEA /* hotkey_command.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFA82DC184E59F3006782FB /* hotkey_command.cpp */; }; + 91A214F91CAD66B900927AEA /* hotkey_item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFA82DE184E59F3006782FB /* hotkey_item.cpp */; }; + 91A214FA1CAD66B900927AEA /* hotkey_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFA82E0184E59F3006782FB /* hotkey_manager.cpp */; }; + 91A214FB1CAD66CC00927AEA /* image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0F0EC62181008DD061 /* image.cpp */; }; + 91A214FC1CAD66CC00927AEA /* image_modifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4E4E0B21367244F001C7528 /* image_modifications.cpp */; }; + 91A214FD1CAD66CC00927AEA /* joystick.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F444907513C5483E003B6442 /* joystick.cpp */; }; + 91A214FE1CAD66CC00927AEA /* key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0B0EC62181008DD061 /* key.cpp */; }; + 91A214FF1CAD66CC00927AEA /* language.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A090EC62181008DD061 /* language.cpp */; }; + 91A215001CAD66D000927AEA /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999FB0EC62181008DD061 /* label.cpp */; }; + 91A215011CAD66E500927AEA /* marked-up_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999F20EC62181008DD061 /* marked-up_text.cpp */; }; + 91A215021CAD66E500927AEA /* minimap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999EC0EC62181008DD061 /* minimap.cpp */; }; + 91A215031CAD66E500927AEA /* astarsearch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE02D11234AAB00154E6C /* astarsearch.cpp */; }; + 91A215041CAD66E500927AEA /* pathutils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999D20EC62181008DD061 /* pathutils.cpp */; }; + 91A215051CAD66F000927AEA /* preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C40EC62181008DD061 /* preferences.cpp */; }; + 91A215061CAD673700927AEA /* quit_confirmation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECC84C1B1B973C5900A5F451 /* quit_confirmation.cpp */; }; + 91A215071CAD673700927AEA /* race.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C00EC62181008DD061 /* race.cpp */; }; + 91A215081CAD673700927AEA /* reports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B70EC62181008DD061 /* reports.cpp */; }; + 91A215091CAD675900927AEA /* show_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A10EC62181008DD061 /* show_dialog.cpp */; }; + 91A2150A1CAD675900927AEA /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559999F0EC62181008DD061 /* sound.cpp */; }; + 91A2150B1CAD675900927AEA /* sound_music_track.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C4121359A600CFBDAB /* sound_music_track.cpp */; }; + 91A2150C1CAD675900927AEA /* soundsource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559999D0EC62181008DD061 /* soundsource.cpp */; }; + 91A2150D1CAD676300927AEA /* builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECBBD73B1928F3F100E434C6 /* builder.cpp */; }; + 91A2150E1CAD676300927AEA /* terrain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999950EC62181008DD061 /* terrain.cpp */; }; + 91A2150F1CAD676300927AEA /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999910EC62181008DD061 /* translation.cpp */; }; + 91A215101CAD677400927AEA /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559998F0EC62181008DD061 /* text.cpp */; }; + 91A215111CAD677400927AEA /* theme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559998D0EC62181008DD061 /* theme.cpp */; }; + 91A215121CAD677400927AEA /* time_of_day.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999870EC62181008DD061 /* time_of_day.cpp */; }; + 91A215131CAD677400927AEA /* tooltips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999830EC62181008DD061 /* tooltips.cpp */; }; + 91A215141CAD677400927AEA /* make_enum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC53B04D1B23BB0E002F758F /* make_enum.cpp */; }; + 91A215151CAD687A00927AEA /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999650EC62181008DD061 /* video.cpp */; }; + 91A215161CAD689800927AEA /* button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999450EC62181008DD061 /* button.cpp */; }; + 91A215171CAD689800927AEA /* file_menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994D0EC62181008DD061 /* file_menu.cpp */; }; + 91A215181CAD689800927AEA /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994F0EC62181008DD061 /* label.cpp */; }; + 91A215191CAD689800927AEA /* menu_style.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999530EC62181008DD061 /* menu_style.cpp */; }; + 91A2151A1CAD689800927AEA /* multimenu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECABDA381B6A94AE001407C1 /* multimenu.cpp */; }; + 91A2151B1CAD689800927AEA /* progressbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999540EC62181008DD061 /* progressbar.cpp */; }; + 91A2151C1CAD689800927AEA /* scrollarea.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999560EC62181008DD061 /* scrollarea.cpp */; }; + 91A2151D1CAD689800927AEA /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999580EC62181008DD061 /* scrollbar.cpp */; }; + 91A2151E1CAD689800927AEA /* slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559995C0EC62181008DD061 /* slider.cpp */; }; + 91A2151F1CAD689800927AEA /* textbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559995E0EC62181008DD061 /* textbox.cpp */; }; + 91A215201CAD689800927AEA /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999600EC62181008DD061 /* widget.cpp */; }; + 91A215211CAD689800927AEA /* wml_exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999430EC62181008DD061 /* wml_exception.cpp */; }; + 91A215221CAD696900927AEA /* xbrz.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F601F1A0490FC0018C9D6 /* xbrz.cpp */; }; + 91A215231CAD698900927AEA /* alpha.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAE1BA086F900E3102E /* alpha.cpp */; }; + 91A215241CAD698900927AEA /* exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84246F18F30DB700FC1EEF /* exception.cpp */; }; + 91A215251CAD698900927AEA /* rect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFB9FAB193BFB6E00146ED0 /* rect.cpp */; }; + 91A215261CAD698900927AEA /* utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC28C58D19423426003B0F5E /* utils.cpp */; }; + 91A215271CAD698900927AEA /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAB1BA086A400E3102E /* window.cpp */; }; + 91A215281CAD699200927AEA /* libfontconfig.1.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC5C242518EF07B4001FA499 /* libfontconfig.1.dylib */; }; + 91A215291CAD6A8B00927AEA /* lapi.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1061879D17D00A3B0B1 /* lapi.cpp */; }; + 91A2152B1CAD6A8B00927AEA /* lauxlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1071879D17D00A3B0B1 /* lauxlib.cpp */; }; + 91A2152D1CAD6A8B00927AEA /* lbaselib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1081879D17D00A3B0B1 /* lbaselib.cpp */; }; + 91A2152E1CAD6A8B00927AEA /* lbitlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1091879D17D00A3B0B1 /* lbitlib.cpp */; }; + 91A2152F1CAD6A8B00927AEA /* lcode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A10A1879D17D00A3B0B1 /* lcode.cpp */; }; + 91A215311CAD6A8B00927AEA /* lcorolib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A10B1879D17D00A3B0B1 /* lcorolib.cpp */; }; + 91A215321CAD6A8B00927AEA /* lctype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A10C1879D17D00A3B0B1 /* lctype.cpp */; }; + 91A215341CAD6A8B00927AEA /* ldblib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A10D1879D17D00A3B0B1 /* ldblib.cpp */; }; + 91A215351CAD6A8B00927AEA /* ldebug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A10E1879D17D00A3B0B1 /* ldebug.cpp */; }; + 91A215371CAD6A8B00927AEA /* ldo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A10F1879D17D00A3B0B1 /* ldo.cpp */; }; + 91A215391CAD6A8B00927AEA /* ldump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1101879D17D00A3B0B1 /* ldump.cpp */; }; + 91A2153A1CAD6A8B00927AEA /* lfunc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1111879D17D00A3B0B1 /* lfunc.cpp */; }; + 91A2153C1CAD6A8B00927AEA /* lgc.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1121879D17D00A3B0B1 /* lgc.cpp */; }; + 91A2153E1CAD6A8B00927AEA /* linit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1131879D17D00A3B0B1 /* linit.cpp */; }; + 91A2153F1CAD6A8B00927AEA /* liolib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1141879D17D00A3B0B1 /* liolib.cpp */; }; + 91A215401CAD6A8B00927AEA /* llex.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1151879D17D00A3B0B1 /* llex.cpp */; }; + 91A215431CAD6A8B00927AEA /* lmathlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1161879D17D00A3B0B1 /* lmathlib.cpp */; }; + 91A215441CAD6A8B00927AEA /* lmem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1171879D17D00A3B0B1 /* lmem.cpp */; }; + 91A215461CAD6A8B00927AEA /* loadlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1181879D17D00A3B0B1 /* loadlib.cpp */; }; + 91A215471CAD6A8B00927AEA /* lobject.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1191879D17D00A3B0B1 /* lobject.cpp */; }; + 91A215491CAD6A8B00927AEA /* lopcodes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A11A1879D17D00A3B0B1 /* lopcodes.cpp */; }; + 91A2154B1CAD6A8B00927AEA /* loslib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A11B1879D17D00A3B0B1 /* loslib.cpp */; }; + 91A2154C1CAD6A8B00927AEA /* lparser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A11C1879D17D00A3B0B1 /* lparser.cpp */; }; + 91A2154E1CAD6A8B00927AEA /* lstate.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A11D1879D17D00A3B0B1 /* lstate.cpp */; }; + 91A215501CAD6A8B00927AEA /* lstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A11E1879D17D00A3B0B1 /* lstring.cpp */; }; + 91A215521CAD6A8B00927AEA /* lstrlib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A11F1879D17D00A3B0B1 /* lstrlib.cpp */; }; + 91A215531CAD6A8B00927AEA /* ltable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1201879D17D00A3B0B1 /* ltable.cpp */; }; + 91A215551CAD6A8B00927AEA /* ltablib.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1211879D17D00A3B0B1 /* ltablib.cpp */; }; + 91A215561CAD6A8B00927AEA /* ltm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1221879D17D00A3B0B1 /* ltm.cpp */; }; + 91A2155C1CAD6A8B00927AEA /* lundump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1261879D17D00A3B0B1 /* lundump.cpp */; }; + 91A2155E1CAD6A8B00927AEA /* lvm.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1271879D17D00A3B0B1 /* lvm.cpp */; }; + 91A215601CAD6A8B00927AEA /* lzio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC89A1281879D17D00A3B0B1 /* lzio.cpp */; }; + 91A215621CAD6DA400927AEA /* application_lua_kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC218E9A1A1064F4007C910C /* application_lua_kernel.cpp */; }; + 91A215631CAD6DA400927AEA /* game_lua_kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC218EA21A106673007C910C /* game_lua_kernel.cpp */; }; + 91A215641CAD6DA400927AEA /* lua_api.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4C02A0D182F1F64008525C6 /* lua_api.cpp */; }; + 91A215651CAD6DA400927AEA /* lua_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC218E9E1A106648007C910C /* lua_common.cpp */; }; + 91A215661CAD6DA400927AEA /* lua_cpp_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECD5D7BE1A22DC8600114175 /* lua_cpp_function.cpp */; }; + 91A215671CAD6DA400927AEA /* lua_fileops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA4A6781A1EC319006BCCF2 /* lua_fileops.cpp */; }; + 91A215681CAD6DA400927AEA /* lua_gui2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F11A1271AC00426E00 /* lua_gui2.cpp */; }; + 91A215691CAD6DA400927AEA /* lua_kernel_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC218E9F1A106648007C910C /* lua_kernel_base.cpp */; }; + 91A2156A1CAD6DA400927AEA /* lua_map_location_ops.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA4A6791A1EC319006BCCF2 /* lua_map_location_ops.cpp */; }; + 91A2156B1CAD6DA400927AEA /* lua_race.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECC2FFF91A51A00900023AF4 /* lua_race.cpp */; }; + 91A2156C1CAD6DA500927AEA /* lua_rng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA4A67A1A1EC319006BCCF2 /* lua_rng.cpp */; }; + 91A2156D1CAD6DA500927AEA /* lua_team.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC5430211A4E6024006D206C /* lua_team.cpp */; }; + 91A2156E1CAD6DA500927AEA /* lua_types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4C02A0E182F1F64008525C6 /* lua_types.cpp */; }; + 91A2156F1CAD6DA500927AEA /* lua_unit_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC5430221A4E6024006D206C /* lua_unit_type.cpp */; }; + 91A215701CAD6E7500927AEA /* context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC59F25F1A4529D2001910CB /* context.cpp */; }; + 91A215711CAD6E7500927AEA /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC59F2601A4529D2001910CB /* manager.cpp */; }; + 91A215721CAD6E7500927AEA /* mapgen_lua_kernel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E1001A12755B00426E00 /* mapgen_lua_kernel.cpp */; }; + 91A215731CAD704C00927AEA /* pathfind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE02E11234AAB00154E6C /* pathfind.cpp */; }; + 91A215741CAD704C00927AEA /* teleport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F41A1354FBFF0027E614 /* teleport.cpp */; }; + 91A215751CAD761100927AEA /* help.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F91A1272EE00426E00 /* help.cpp */; }; + 91A215761CAD761100927AEA /* help_browser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F41A1272EE00426E00 /* help_browser.cpp */; }; + 91A215771CAD761100927AEA /* help_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F51A1272EE00426E00 /* help_button.cpp */; }; + 91A215781CAD761100927AEA /* help_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F61A1272EE00426E00 /* help_impl.cpp */; }; + 91A215791CAD761100927AEA /* help_menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F71A1272EE00426E00 /* help_menu.cpp */; }; + 91A2157A1CAD761100927AEA /* help_text_area.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E0F81A1272EE00426E00 /* help_text_area.cpp */; }; + 91A2157B1CAD761100927AEA /* help_topic_generators.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA1E1031A127CD100426E00 /* help_topic_generators.cpp */; }; + 91A2157C1CAD761100927AEA /* hotkey_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563861A47BA36006278A5 /* hotkey_handler.cpp */; }; + 91A2157D1CAD761100927AEA /* hotkey_handler_mp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563831A47BA36006278A5 /* hotkey_handler_mp.cpp */; }; + 91A2157E1CAD761100927AEA /* hotkey_handler_sp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECA563851A47BA36006278A5 /* hotkey_handler_sp.cpp */; }; + 91A2157F1CAD761100927AEA /* hotkey_preferences_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFA82E2184E59F3006782FB /* hotkey_preferences_display.cpp */; }; + 91A215801CAD797900927AEA /* controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC0C0FC0835900CE81F5 /* controller.cpp */; }; + 91A215811CAD797900927AEA /* interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC0E0FC0835900CE81F5 /* interface.cpp */; }; + 91A215821CAD797900927AEA /* part.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC100FC0835900CE81F5 /* part.cpp */; }; + 91A215831CAD797900927AEA /* render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC120FC0835900CE81F5 /* render.cpp */; }; + 91A215841CAD797900927AEA /* filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999930EC62181008DD061 /* filter.cpp */; }; + 91A215851CAD884A00927AEA /* abilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997D0EC62181008DD061 /* abilities.cpp */; }; + 91A215861CAD884A00927AEA /* animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997B0EC62181008DD061 /* animation.cpp */; }; + 91A215871CAD884B00927AEA /* animation_component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC386CEF195119A9006004ED /* animation_component.cpp */; }; + 91A215881CAD884B00927AEA /* attack_type.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECC2FFFB1A51A91100023AF4 /* attack_type.cpp */; }; + 91A215891CAD884B00927AEA /* drawer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC387E6E195AFB5C00FC0342 /* drawer.cpp */; }; + 91A2158A1CAD884B00927AEA /* filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC28642E1967988F00168DFF /* filter.cpp */; }; + 91A2158B1CAD884B00927AEA /* formula_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC08023A194D0A80009E0050 /* formula_manager.cpp */; }; + 91A2158C1CAD884B00927AEA /* frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999770EC62181008DD061 /* frame.cpp */; }; + 91A2158D1CAD884B00927AEA /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C7121359A600CFBDAB /* helper.cpp */; }; + 91A2158E1CAD884B00927AEA /* id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999750EC62181008DD061 /* id.cpp */; }; + 91A2158F1CAD884B00927AEA /* map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999730EC62181008DD061 /* map.cpp */; }; + 91A215901CAD884B00927AEA /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999710EC62181008DD061 /* types.cpp */; }; + 91A215911CAD884B00927AEA /* udisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999790EC62181008DD061 /* udisplay.cpp */; }; + 91A215921CAD884B00927AEA /* unit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997F0EC62181008DD061 /* unit.cpp */; }; + 91A215931CAD885500927AEA /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91EF6C011C9E22E400E2A733 /* sha1.cpp */; }; + 91A215941CAD887700927AEA /* action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8FE12135AC300CFBDAB /* action.cpp */; }; + 91A215951CAD887700927AEA /* attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90012135AC300CFBDAB /* attack.cpp */; }; + 91A215961CAD887700927AEA /* highlighter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 621DEB8215A7BA1F00FEE18A /* highlighter.cpp */; }; + 91A215971CAD887700927AEA /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90412135AC300CFBDAB /* manager.cpp */; }; + 91A215981CAD887700927AEA /* mapbuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F480CD1D14034E6D007175D6 /* mapbuilder.cpp */; }; + 91A215991CAD887700927AEA /* move.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90812135AC300CFBDAB /* move.cpp */; }; + 91A2159A1CAD887700927AEA /* recall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90A12135AC300CFBDAB /* recall.cpp */; }; + 91A2159B1CAD887700927AEA /* recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90C12135AC300CFBDAB /* recruit.cpp */; }; + 91A2159C1CAD887700927AEA /* side_actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90E12135AC300CFBDAB /* side_actions.cpp */; }; + 91A2159D1CAD887700927AEA /* suppose_dead.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4E4E0AF1367241E001C7528 /* suppose_dead.cpp */; }; + 91A2159E1CAD887700927AEA /* utility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B553B6B812189C5900CC8C58 /* utility.cpp */; }; + 91A2159F1CAD88AD00927AEA /* combo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999470EC62181008DD061 /* combo.cpp */; }; + 91A215A01CAD88AD00927AEA /* combo_drag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999490EC62181008DD061 /* combo_drag.cpp */; }; + 91A215A11CAD88AD00927AEA /* drop_target.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994B0EC62181008DD061 /* drop_target.cpp */; }; + 91A215A21CAD88AD00927AEA /* scrollpane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559995A0EC62181008DD061 /* scrollpane.cpp */; }; + 91A215A31CAD915400927AEA /* gettext_boost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4DF45419FEA7A8000EC086 /* gettext_boost.cpp */; }; + 91A215A41CAD917B00927AEA /* preferences_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C20EC62181008DD061 /* preferences_display.cpp */; }; + 91A215A51CAD91AB00927AEA /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999670EC62181008DD061 /* version.cpp */; }; + 91A215A61CAD91BE00927AEA /* location.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999F90EC62181008DD061 /* location.cpp */; }; + 91A215A71CAD924000927AEA /* binary_or_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A70EC62181008DD061 /* binary_or_text.cpp */; }; + 91A215A81CAD924000927AEA /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AB0EC62181008DD061 /* parser.cpp */; }; + 91A215A91CAD924000927AEA /* preprocessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AD0EC62181008DD061 /* preprocessor.cpp */; }; + 91A215AA1CAD924000927AEA /* schema_validator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F480CD2214034F18007175D6 /* schema_validator.cpp */; }; + 91A215AB1CAD924000927AEA /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AF0EC62181008DD061 /* string_utils.cpp */; }; + 91A215AC1CAD924000927AEA /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B10EC62181008DD061 /* tokenizer.cpp */; }; + 91A215AD1CAD924000927AEA /* unicode.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAA3FE518E0E4EF002E8998 /* unicode.cpp */; }; + 91A215AE1CAD924000927AEA /* validator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F449349913FF652800DF01D5 /* validator.cpp */; }; + 91A215AF1CAD925400927AEA /* color_range.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AAA0EC62181008DD061 /* color_range.cpp */; }; + 91A215B01CAD925400927AEA /* config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA80EC62181008DD061 /* config.cpp */; }; + 91A215B11CAD925D00927AEA /* hash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8AD121359A600CFBDAB /* hash.cpp */; }; + 91A215B21CAD926900927AEA /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A020EC62181008DD061 /* log.cpp */; }; + 91A215B31CAD926F00927AEA /* map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A000EC62181008DD061 /* map.cpp */; }; + 91A215B41CAD927700927AEA /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999F00EC62181008DD061 /* md5.cpp */; }; + 91A215B51CAD928C00927AEA /* mt_rng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC64D7641A085F120092EF75 /* mt_rng.cpp */; }; + 91A215B61CAD929700927AEA /* network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999DA0EC62181008DD061 /* network.cpp */; }; + 91A215B71CAD92A100927AEA /* seed_rng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC64D75F1A085CE60092EF75 /* seed_rng.cpp */; }; + 91A215B81CAD92AA00927AEA /* type_data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECE17E111A0DD79F00B76473 /* type_data.cpp */; }; + 91A215B91CAD92C000927AEA /* thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559998B0EC62181008DD061 /* thread.cpp */; }; + 91A215BA1CAD92CA00927AEA /* tag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F480CD3E14035038007175D6 /* tag.cpp */; }; + 91A215BB1CAD92D000927AEA /* tstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999810EC62181008DD061 /* tstring.cpp */; }; + 91A215BC1CAD92D400927AEA /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559996D0EC62181008DD061 /* util.cpp */; }; + 91A215BD1CAD94B400927AEA /* menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999510EC62181008DD061 /* menu.cpp */; }; + 91A215BE1CAD950500927AEA /* network_worker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999D60EC62181008DD061 /* network_worker.cpp */; }; + 91A215BF1CAD951A00927AEA /* lua_jailbreak_exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F419E44413354E620031448A /* lua_jailbreak_exception.cpp */; }; + 91A215C01CAD952C00927AEA /* game_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A800EC62181008DD061 /* game_config.cpp */; }; + 91A215C11CAD952C00927AEA /* game_config_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E4A1771E7E000C16B75 /* game_config_manager.cpp */; }; + 91A215C21CAD954C00927AEA /* filesystem_boost.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECF9D43C19F3FF9400E6C9D9 /* filesystem_boost.cpp */; }; + 91A215C31CAD960300927AEA /* filesystem_common.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC5C70BB19EEB54900432CF4 /* filesystem_common.cpp */; }; + 91A215C41CAD968400927AEA /* custom_tod.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49B4B8A9175E9F1300DB8C9B /* custom_tod.cpp */; }; + 91A215C51CAD968400927AEA /* edit_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F49F134815BC627C00B64B0B /* edit_label.cpp */; }; + 91A215C61CAD968400927AEA /* edit_scenario.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC95E50418612BB600F3A9EF /* edit_scenario.cpp */; }; + 91A215C71CAD968400927AEA /* edit_side.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC95E50618612BB600F3A9EF /* edit_side.cpp */; }; + 91A215C81CAD968400927AEA /* generate_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB40ECA805A002BE442 /* generate_map.cpp */; }; + 91A215C91CAD968400927AEA /* new_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB60ECA805A002BE442 /* new_map.cpp */; }; + 91A215CA1CAD968400927AEA /* resize_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB80ECA805A002BE442 /* resize_map.cpp */; }; + 91A215CB1CAD968400927AEA /* set_starting_position.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4728DAF145A59CF00F0E1E1 /* set_starting_position.cpp */; }; + 91A215CC1CAD969200927AEA /* data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04711234B1A00154E6C /* data.cpp */; }; + 91A215CD1CAD969200927AEA /* info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04911234B1A00154E6C /* info.cpp */; }; + 91A215CE1CAD969200927AEA /* lobby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6EF0FEA9F92006F6FBD /* lobby.cpp */; }; + 91A215CF1CAD969200927AEA /* player_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96EB1034796700A57C1A /* player_info.cpp */; }; + 91A215D01CAD96D900927AEA /* mp_alerts_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC5C70BE19EEB57400432CF4 /* mp_alerts_options.cpp */; }; + 91A215D11CAD96D900927AEA /* mp_change_control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA0D1D13550E1E000AFEBD /* mp_change_control.cpp */; }; + 91A215D21CAD96D900927AEA /* mp_cmd_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59915060F20E9FF00BAD4C1 /* mp_cmd_wrapper.cpp */; }; + 91A215D31CAD96D900927AEA /* mp_connect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC30ECA805A002BE442 /* mp_connect.cpp */; }; + 91A215D41CAD96D900927AEA /* mp_create_game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC50ECA805A002BE442 /* mp_create_game.cpp */; }; + 91A215D51CAD96D900927AEA /* mp_create_game_set_password.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5DBABF112AFF7F200B5B8DC /* mp_create_game_set_password.cpp */; }; + 91A215D61CAD96D900927AEA /* mp_host_game_prompt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 1EF6CE8014D9846D00ECBE58 /* mp_host_game_prompt.cpp */; }; + 91A215D71CAD96D900927AEA /* mp_join_game_password_prompt.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC349AAD1AE318B100A0767A /* mp_join_game_password_prompt.cpp */; }; + 91A215D81CAD96D900927AEA /* mp_login.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F40F1354FB970027E614 /* mp_login.cpp */; }; + 91A215D91CAD96D900927AEA /* mp_method_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC70ECA805A002BE442 /* mp_method_selection.cpp */; }; + 91A215DA1CAD96D900927AEA /* synced_choice_wait.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 919B37FA1BAF7A9D00E0094C /* synced_choice_wait.cpp */; }; + 91A215DB1CAD970800927AEA /* libboost_program_optionsw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5213AD4E35003C701D /* libboost_program_optionsw.dylib */; }; + 91A215DC1CAD970800927AEA /* libboost_regexw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5313AD4E35003C701D /* libboost_regexw.dylib */; }; + 91A215DD1CAD971800927AEA /* libboost_localew.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC4DF45919FEA838000EC086 /* libboost_localew.dylib */; }; + 91A215DE1CAD99E000927AEA /* libboost_filesystemw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = ECF9D43F19F4026D00E6C9D9 /* libboost_filesystemw.dylib */; }; + 91A215DF1CAD99E000927AEA /* libboost_iostreamsw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D4B13AD4D53003C701D /* libboost_iostreamsw.dylib */; }; + 91A215E01CAD99E000927AEA /* libboost_systemw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5413AD4E35003C701D /* libboost_systemw.dylib */; }; + 91A215E11CAD99E000927AEA /* libboost_threadw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5B13AD4E6D003C701D /* libboost_threadw.dylib */; }; + 91A215E21CAD9B9000927AEA /* libpango-1.0.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC5C242E18EF07B4001FA499 /* libpango-1.0.0.dylib */; }; + 91A215E31CAD9B9000927AEA /* libpangocairo-1.0.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC5C242F18EF07B4001FA499 /* libpangocairo-1.0.0.dylib */; }; + 91A215E41CAD9D4300927AEA /* button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCEA0ECA805A002BE442 /* button.cpp */; }; + 91A215E71CAD9D4300927AEA /* combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462861C7115C50050A9C9 /* combobox.cpp */; }; + 91A215E91CAD9D4300927AEA /* container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCEE0ECA805A002BE442 /* container.cpp */; }; + 91A215EB1CAD9D4300927AEA /* control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF00ECA805A002BE442 /* control.cpp */; }; + 91A215ED1CAD9D4300927AEA /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF20ECA805A002BE442 /* debug.cpp */; }; + 91A215EF1CAD9D4300927AEA /* drawing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F40C1354FB760027E614 /* drawing.cpp */; }; + 91A215F21CAD9D4300927AEA /* generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A670F05858100EB190E /* generator.cpp */; }; + 91A215F51CAD9D4300927AEA /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF70ECA805A002BE442 /* grid.cpp */; }; + 91A215F91CAD9D4300927AEA /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF90ECA805A002BE442 /* helper.cpp */; }; + 91A215FB1CAD9D4300927AEA /* horizontal_scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A610F05858100EB190E /* horizontal_scrollbar.cpp */; }; + 91A215FD1CAD9D4300927AEA /* image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCFB0ECA805A002BE442 /* image.cpp */; }; + 91A216001CAD9D4300927AEA /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCFD0ECA805A002BE442 /* label.cpp */; }; + 91A216021CAD9D4300927AEA /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8991213590500CFBDAB /* list.cpp */; }; + 91A216041CAD9D4300927AEA /* listbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCFF0ECA805A002BE442 /* listbox.cpp */; }; + 91A216061CAD9D4300927AEA /* matrix.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62579C811573E797003089D5 /* matrix.cpp */; }; + 91A216081CAD9D4300927AEA /* minimap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD030ECA805A002BE442 /* minimap.cpp */; }; + 91A2160A1CAD9D4300927AEA /* multi_page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6F80FEA9FA5006F6FBD /* multi_page.cpp */; }; + 91A2160C1CAD9D4300927AEA /* pane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62E4824E154D865E001DD4FC /* pane.cpp */; }; + 91A2160E1CAD9D4300927AEA /* panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD050ECA805A002BE442 /* panel.cpp */; }; + 91A216101CAD9D4300927AEA /* password_box.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59915270F20EA1400BAD4C1 /* password_box.cpp */; }; + 91A216121CAD9D4300927AEA /* progress_bar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE89B1213590500CFBDAB /* progress_bar.cpp */; }; + 91A216141CAD9D4300927AEA /* repeating_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59271F910E9577800A13911 /* repeating_button.cpp */; }; + 91A216161CAD9D4300927AEA /* scroll_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD070ECA805A002BE442 /* scroll_label.cpp */; }; + 91A216181CAD9D4300927AEA /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD090ECA805A002BE442 /* scrollbar.cpp */; }; + 91A2161A1CAD9D4300927AEA /* scrollbar_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A640F05858100EB190E /* scrollbar_container.cpp */; }; + 91A2161D1CAD9D4300927AEA /* scrollbar_panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6FB0FEA9FA5006F6FBD /* scrollbar_panel.cpp */; }; + 91A216201CAD9D4300927AEA /* settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0B0ECA805A002BE442 /* settings.cpp */; }; + 91A216221CAD9D4300927AEA /* slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0D0ECA805A002BE442 /* slider.cpp */; }; + 91A216241CAD9D4300927AEA /* spacer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0F0ECA805A002BE442 /* spacer.cpp */; }; + 91A216261CAD9D4300927AEA /* stacked_widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D2141001560100B12852 /* stacked_widget.cpp */; }; + 91A216281CAD9D4300927AEA /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD110ECA805A002BE442 /* text.cpp */; }; + 91A2162A1CAD9D4300927AEA /* text_box.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD130ECA805A002BE442 /* text_box.cpp */; }; + 91A2162C1CAD9D4300927AEA /* toggle_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD150ECA805A002BE442 /* toggle_button.cpp */; }; + 91A2162E1CAD9D4300927AEA /* toggle_panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD170ECA805A002BE442 /* toggle_panel.cpp */; }; + 91A216301CAD9D4300927AEA /* tree_view.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE05111234B3300154E6C /* tree_view.cpp */; }; + 91A216321CAD9D4400927AEA /* tree_view_node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04F11234B3300154E6C /* tree_view_node.cpp */; }; + 91A216341CAD9D4400927AEA /* unit_preview_pane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA6871C9066CC0030F8D0 /* unit_preview_pane.cpp */; }; + 91A216361CAD9D4400927AEA /* vertical_scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD1B0ECA805A002BE442 /* vertical_scrollbar.cpp */; }; + 91A216381CAD9D4400927AEA /* viewport.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6216A91B1551CCF700E13C2D /* viewport.cpp */; }; + 91A2163A1CAD9D4400927AEA /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD1F0ECA805A002BE442 /* widget.cpp */; }; + 91A2163C1CAD9D4400927AEA /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD210ECA805A002BE442 /* window.cpp */; }; 91A41F901CA22A98008B10D5 /* libreadline.6.dylib in CopyFiles */ = {isa = PBXBuildFile; fileRef = ECA9E7461CA20AA800A947D6 /* libreadline.6.dylib */; }; 91B6217C1B74E6D200B00E0F /* label_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B6217A1B74E6D100B00E0F /* label_settings.cpp */; }; 91B621A21B76A3CC00B00E0F /* build_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B621A11B76A3CC00B00E0F /* build_info.cpp */; }; @@ -144,42 +448,290 @@ 91B622231B76C0F400B00E0F /* libboost_systemw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5413AD4E35003C701D /* libboost_systemw.dylib */; }; 91B622241B76C0F400B00E0F /* libboost_threadw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5B13AD4E6D003C701D /* libboost_threadw.dylib */; }; 91DCA6891C9066CC0030F8D0 /* unit_preview_pane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA6871C9066CC0030F8D0 /* unit_preview_pane.cpp */; }; - 91DCA68A1C9066CC0030F8D0 /* unit_preview_pane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA6871C9066CC0030F8D0 /* unit_preview_pane.cpp */; }; 91DCA68D1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA68B1C9066EC0030F8D0 /* unit_recruit.cpp */; }; - 91DCA68E1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA68B1C9066EC0030F8D0 /* unit_recruit.cpp */; }; - 91DCA6901C9360610030F8D0 /* test_formula_core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA68F1C9360610030F8D0 /* test_formula_core.cpp */; }; + 91E355631CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 91E355621CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib */; }; + 91E356331CACC47F00774252 /* floating_point_emulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356081CACA6CB00774252 /* floating_point_emulation.cpp */; }; + 91E356341CACC47F00774252 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A90FACD42E00CE81F5 /* main.cpp */; }; + 91E356351CACC47F00774252 /* test_addons.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356091CACA6CB00774252 /* test_addons.cpp */; }; + 91E356361CACC47F00774252 /* test_commandline_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3560A1CACA6CB00774252 /* test_commandline_options.cpp */; }; + 91E356371CACC47F00774252 /* test_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3560B1CACA6CB00774252 /* test_config.cpp */; }; + 91E356381CACC47F00774252 /* test_config_cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A80FACD42E00CE81F5 /* test_config_cache.cpp */; }; + 91E356391CACC47F00774252 /* test_filesystem.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3560C1CACA6CB00774252 /* test_filesystem.cpp */; }; + 91E3563A1CACC47F00774252 /* test_formula_ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A70FACD42E00CE81F5 /* test_formula_ai.cpp */; }; + 91E3563B1CACC47F00774252 /* test_formula_core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA68F1C9360610030F8D0 /* test_formula_core.cpp */; }; + 91E3563C1CACC47F00774252 /* test_formula_function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3560D1CACA6CB00774252 /* test_formula_function.cpp */; }; + 91E3563D1CACC47F00774252 /* test_image_modifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3560E1CACA6CB00774252 /* test_image_modifications.cpp */; }; + 91E3563E1CACC47F00774252 /* test_lexical_cast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4AD0FACD42E00CE81F5 /* test_lexical_cast.cpp */; }; + 91E3563F1CACC47F00774252 /* test_lua.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3560F1CACA6CB00774252 /* test_lua.cpp */; }; + 91E356401CACC47F00774252 /* test_make_enum.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356101CACA6CB00774252 /* test_make_enum.cpp */; }; + 91E356411CACC47F00774252 /* test_map_location.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356111CACA6CB00774252 /* test_map_location.cpp */; }; + 91E356421CACC47F00774252 /* test_mp_connect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356121CACA6CB00774252 /* test_mp_connect.cpp */; }; + 91E356431CACC47F00774252 /* test_network_worker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4AC0FACD42E00CE81F5 /* test_network_worker.cpp */; }; + 91E356441CACC47F00774252 /* test_recall_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356131CACA6CB00774252 /* test_recall_list.cpp */; }; + 91E356451CACC47F00774252 /* test_rng.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356141CACA6CB00774252 /* test_rng.cpp */; }; + 91E356461CACC47F00774252 /* test_sdl_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356151CACA6CB00774252 /* test_sdl_utils.cpp */; }; + 91E356471CACC47F00774252 /* test_serialization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4AA0FACD42E00CE81F5 /* test_serialization.cpp */; }; + 91E356481CACC47F00774252 /* test_team.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A60FACD42E00CE81F5 /* test_team.cpp */; }; + 91E356491CACC47F00774252 /* test_unit_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356171CACA6CB00774252 /* test_unit_map.cpp */; }; + 91E3564A1CACC47F00774252 /* test_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A50FACD42E00CE81F5 /* test_util.cpp */; }; + 91E3564B1CACC47F00774252 /* test_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A40FACD42E00CE81F5 /* test_version.cpp */; }; + 91E3564C1CACC47F00774252 /* test_whiteboard_side_actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356181CACA6CB00774252 /* test_whiteboard_side_actions.cpp */; }; + 91E3564D1CACC62500774252 /* about.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AC60EC62181008DD061 /* about.cpp */; }; + 91E3564E1CACC62500774252 /* animated_game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AB50EC62181008DD061 /* animated_game.cpp */; }; + 91E3564F1CACC62500774252 /* attack_prediction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AD00EC62181008DD061 /* attack_prediction.cpp */; }; + 91E356501CACC62500774252 /* attack_prediction_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599ACA0EC62181008DD061 /* attack_prediction_display.cpp */; }; + 91E356511CACC62500774252 /* build_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B621A11B76A3CC00B00E0F /* build_info.cpp */; }; + 91E356521CACC62500774252 /* carryover.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFB9FA7193BFAD900146ED0 /* carryover.cpp */; }; + 91E356531CACC62500774252 /* commandline_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F46C5DCB13A5074C00DD0816 /* commandline_options.cpp */; }; + 91E356541CACC62500774252 /* config_cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA40EC62181008DD061 /* config_cache.cpp */; }; + 91E356551CACC62500774252 /* controller_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA00EC62181008DD061 /* controller_base.cpp */; }; + 91E356561CACC62500774252 /* countdown_clock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC45DEDC1AD1CEA300BD760C /* countdown_clock.cpp */; }; + 91E356571CACC67C00774252 /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A9B0EC62181008DD061 /* dialogs.cpp */; }; + 91E356581CACC67C00774252 /* display_chat_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC21944D1960649000420969 /* display_chat_manager.cpp */; }; + 91E356591CACC67C00774252 /* fake_unit_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECDEAF6D194FE84000DB2F47 /* fake_unit_manager.cpp */; }; + 91E3565A1CACC67C00774252 /* fake_unit_ptr.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC387E71195AFC8400FC0342 /* fake_unit_ptr.cpp */; }; + 91E3565B1CACC67C00774252 /* filechooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A950EC62181008DD061 /* filechooser.cpp */; }; + 91E3565C1CACC67C00774252 /* floating_textbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A920EC62181008DD061 /* floating_textbox.cpp */; }; + 91E3565D1CACC67C00774252 /* game_board.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECFB9FA9193BFB4B00146ED0 /* game_board.cpp */; }; + 91E3565E1CACC67C00774252 /* game_classification.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECDEAF78194FEA9D00DB2F47 /* game_classification.cpp */; }; + 91E3565F1CACC67C00774252 /* game_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A7E0EC62181008DD061 /* game_display.cpp */; }; + 91E356601CACC67C00774252 /* game_errors.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F4041354FB410027E614 /* game_errors.cpp */; }; + 91E356611CACC67C00774252 /* game_launcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2194471960634100420969 /* game_launcher.cpp */; }; + 91E356621CACC67C00774252 /* game_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A790EC62181008DD061 /* game_preferences.cpp */; }; + 91E356631CACC67C00774252 /* game_state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC387E6A195AFB1F00FC0342 /* game_state.cpp */; }; + 91E356641CACC6E000774252 /* halo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A150EC62181008DD061 /* halo.cpp */; }; + 91E356651CACC6E000774252 /* intro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0D0EC62181008DD061 /* intro.cpp */; }; + 91E356661CACC6E000774252 /* leader_scroll_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49E84DC017384EF800A4F376 /* leader_scroll_dialog.cpp */; }; + 91E356671CACC6E000774252 /* lobby_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8B2121359A600CFBDAB /* lobby_preferences.cpp */; }; + 91E356681CACC6E000774252 /* menu_events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999EE0EC62181008DD061 /* menu_events.cpp */; }; + 91E356691CACC6E000774252 /* mouse_events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999EA0EC62181008DD061 /* mouse_events.cpp */; }; + 91E3566A1CACC6E000774252 /* mouse_handler_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999E80EC62181008DD061 /* mouse_handler_base.cpp */; }; + 91E3566B1CACC6E000774252 /* movetype.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F468E6AC16DF872200A31A5A /* movetype.cpp */; }; + 91E3566C1CACC6E000774252 /* mp_game_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B469221071185800327599 /* mp_game_settings.cpp */; }; + 91E3566D1CACC6E000774252 /* mp_ui_alerts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC5C70C019EEB58300432CF4 /* mp_ui_alerts.cpp */; }; + 91E3566E1CACC6E000774252 /* network_asio.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F44490B413C5483F003B6442 /* network_asio.cpp */; }; + 91E3566F1CACC6E000774252 /* persist_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8B9121359A600CFBDAB /* persist_context.cpp */; }; + 91E356701CACC6E000774252 /* persist_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8BB121359A600CFBDAB /* persist_manager.cpp */; }; + 91E356711CACC6E000774252 /* persist_var.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8BD121359A600CFBDAB /* persist_var.cpp */; }; + 91E356721CACC6E000774252 /* play_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999D00EC62181008DD061 /* play_controller.cpp */; }; + 91E356731CACC6E000774252 /* playmp_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999CC0EC62181008DD061 /* playmp_controller.cpp */; }; + 91E356741CACC6E000774252 /* playsingle_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999CA0EC62181008DD061 /* playsingle_controller.cpp */; }; + 91E356751CACC6E000774252 /* playturn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C80EC62181008DD061 /* playturn.cpp */; }; + 91E356761CACC6E000774252 /* playturn_network_adapter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC51DB7618F8BFA4004621D9 /* playturn_network_adapter.cpp */; }; + 91E356771CACC71A00774252 /* random_new.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84245B18F30D9100FC1EEF /* random_new.cpp */; }; + 91E356781CACC71A00774252 /* random_new_deterministic.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84245718F30D9000FC1EEF /* random_new_deterministic.cpp */; }; + 91E356791CACC71A00774252 /* random_new_synced.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84245918F30D9000FC1EEF /* random_new_synced.cpp */; }; + 91E3567A1CACC71A00774252 /* recall_list_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC1CB20619524AD600B0FA78 /* recall_list_manager.cpp */; }; + 91E3567B1CACC71A00774252 /* replay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999BB0EC62181008DD061 /* replay.cpp */; }; + 91E3567C1CACC71A00774252 /* replay_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B90EC62181008DD061 /* replay_controller.cpp */; }; + 91E3567D1CACC71A00774252 /* replay_helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84245D18F30D9100FC1EEF /* replay_helper.cpp */; }; + 91E3567E1CACC71A00774252 /* replay_recorder_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC45DEDE1AD1CED100BD760C /* replay_recorder_base.cpp */; }; + 91E3567F1CACC71A00774252 /* resources.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A841013BB0800C10B66 /* resources.cpp */; }; + 91E356801CACC71A00774252 /* save_blocker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8BF121359A600CFBDAB /* save_blocker.cpp */; }; + 91E356811CACC71A00774252 /* save_index.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC28C59019423528003B0F5E /* save_index.cpp */; }; + 91E356821CACC71A00774252 /* saved_game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECD39891194B830300CF2125 /* saved_game.cpp */; }; + 91E356831CACC71A00774252 /* savegame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C2121359A600CFBDAB /* savegame.cpp */; }; + 91E356841CACC77E00774252 /* settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A50EC62181008DD061 /* settings.cpp */; }; + 91E356851CACC77E00774252 /* side_filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE46F712A0417D00D665EE /* side_filter.cpp */; }; + 91E356861CACC77E00774252 /* statistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559999B0EC62181008DD061 /* statistics.cpp */; }; + 91E356871CACC77E00774252 /* statistics_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999990EC62181008DD061 /* statistics_dialog.cpp */; }; + 91E356881CACC77E00774252 /* strftime.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4D40AD17FCCF14002E7C81 /* strftime.cpp */; }; + 91E356891CACC77E00774252 /* synced_checkup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84246018F30D9100FC1EEF /* synced_checkup.cpp */; }; + 91E3568A1CACC77E00774252 /* synced_commands.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84246218F30D9100FC1EEF /* synced_commands.cpp */; }; + 91E3568B1CACC77E00774252 /* synced_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC84246418F30D9100FC1EEF /* synced_context.cpp */; }; + 91E3568C1CACC77E00774252 /* synced_user_choice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 919B37F71BAF789D00E0094C /* synced_user_choice.cpp */; }; + 91E3568D1CACC77E00774252 /* syncmp_handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECDEAF76194FEA8400DB2F47 /* syncmp_handler.cpp */; }; + 91E3568E1CACC77E00774252 /* team.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999970EC62181008DD061 /* team.cpp */; }; + 91E3568F1CACC77E00774252 /* teambuilder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECB57C3F1A56E6DC001973A5 /* teambuilder.cpp */; }; + 91E356901CACC77E00774252 /* tod_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8821213585300CFBDAB /* tod_manager.cpp */; }; + 91E356911CACC78B00774252 /* variable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559996B0EC62181008DD061 /* variable.cpp */; }; + 91E356921CACC78B00774252 /* variable_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2864311967990500168DFF /* variable_info.cpp */; }; + 91E356931CACC78B00774252 /* wmi_pager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC219450196064A900420969 /* wmi_pager.cpp */; }; + 91E356941CACC7CE00774252 /* attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620A386215E9364E00A4F513 /* attack.cpp */; }; + 91E356951CACC7CE00774252 /* create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620A386415E9364E00A4F513 /* create.cpp */; }; + 91E356961CACC7CE00774252 /* heal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620A386615E9364E00A4F513 /* heal.cpp */; }; + 91E356971CACC7CE00774252 /* move.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620A386815E9364E00A4F513 /* move.cpp */; }; + 91E356981CACC7CE00774252 /* shroud_clearing_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB844E1B0C1933001A3EB7 /* shroud_clearing_action.cpp */; }; + 91E356991CACC7CE00774252 /* undo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620A386A15E9364E00A4F513 /* undo.cpp */; }; + 91E3569A1CACC7CE00774252 /* undo_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB844F1B0C1933001A3EB7 /* undo_action.cpp */; }; + 91E3569B1CACC7CE00774252 /* undo_dismiss_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB84501B0C1933001A3EB7 /* undo_dismiss_action.cpp */; }; + 91E3569C1CACC7CE00774252 /* undo_move_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB84511B0C1934001A3EB7 /* undo_move_action.cpp */; }; + 91E3569D1CACC7CE00774252 /* undo_recall_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB84521B0C1934001A3EB7 /* undo_recall_action.cpp */; }; + 91E3569E1CACC7CE00774252 /* undo_recruit_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB84531B0C1934001A3EB7 /* undo_recruit_action.cpp */; }; + 91E3569F1CACC7CE00774252 /* undo_update_shroud_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECAB84541B0C1934001A3EB7 /* undo_update_shroud_action.cpp */; }; + 91E356A01CACC7CE00774252 /* unit_creator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91ECD5D01BA11A5200B25CF1 /* unit_creator.cpp */; }; + 91E356A11CACC7CE00774252 /* vision.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620A386C15E9364E00A4F513 /* vision.cpp */; }; + 91E356A21CACC7E300774252 /* client.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4D2DECA14DCA1D000CAFF31 /* client.cpp */; }; + 91E356A31CACC7E300774252 /* info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F419A2C114F5BCFE002F9ADC /* info.cpp */; }; + 91E356A41CACC7E300774252 /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9A91213640400CFBDAB /* manager.cpp */; }; + 91E356A51CACC7E300774252 /* manager_ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F419A31014F8868A002F9ADC /* manager_ui.cpp */; }; + 91E356A61CACC7E300774252 /* state.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 620EC87214FEEE6D006BBD1F /* state.cpp */; }; + 91E356A71CACC7E300774252 /* validation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9AB1213640400CFBDAB /* validation.cpp */; }; + 91E356A81CACC81A00774252 /* actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC68D0FEA9E8F006F6FBD /* actions.cpp */; }; + 91E356A91CACC81A00774252 /* configuration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC68F0FEA9E8F006F6FBD /* configuration.cpp */; }; + 91E356AA1CACC81A00774252 /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBDB0FC082AB00CE81F5 /* contexts.cpp */; }; + 91E356AB1CACC81A00774252 /* game_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBE10FC082AB00CE81F5 /* game_info.cpp */; }; + 91E356AC1CACC81A00774252 /* gamestate_observer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE03811234AC700154E6C /* gamestate_observer.cpp */; }; + 91E356AD1CACC81A00774252 /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6930FEA9E8F006F6FBD /* manager.cpp */; }; + 91E356AE1CACC81A00774252 /* registry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6950FEA9E8F006F6FBD /* registry.cpp */; }; + 91E356AF1CACC81A00774252 /* simulated_actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC4E3B2119B2D8880049CBD7 /* simulated_actions.cpp */; }; + 91E356B01CACC81A00774252 /* testing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBE30FC082AB00CE81F5 /* testing.cpp */; }; + 91E356B11CACC82D00774252 /* ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A40FEA9EB5006F6FBD /* ai.cpp */; }; + 91E356B21CACC82D00774252 /* aspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96D1103478C900A57C1A /* aspect.cpp */; }; + 91E356B31CACC82D00774252 /* component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F366104B1042001369F5 /* component.cpp */; }; + 91E356B41CACC82D00774252 /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A60FEA9EB5006F6FBD /* contexts.cpp */; }; + 91E356B51CACC82D00774252 /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A80FEA9EB5006F6FBD /* engine.cpp */; }; + 91E356B61CACC82D00774252 /* goal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96D3103478C900A57C1A /* goal.cpp */; }; + 91E356B71CACC82D00774252 /* rca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6AC0FEA9EB5006F6FBD /* rca.cpp */; }; + 91E356B81CACC82D00774252 /* stage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6AE0FEA9EB5006F6FBD /* stage.cpp */; }; + 91E356B91CACC8A100774252 /* aspect_attacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96E51034791200A57C1A /* aspect_attacks.cpp */; }; + 91E356BA1CACC8A100774252 /* attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6B30FEA9EB5006F6FBD /* attack.cpp */; }; + 91E356BB1CACC8A100774252 /* ca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6C10FEA9EB5006F6FBD /* ca.cpp */; }; + 91E356BC1CACC8A100774252 /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6B40FEA9EB5006F6FBD /* contexts.cpp */; }; + 91E356BD1CACC8A100774252 /* engine_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6AA0FEA9EB5006F6FBD /* engine_cpp.cpp */; }; + 91E356BE1CACC8A100774252 /* recruitment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC48D74B17F3148300DE80BF /* recruitment.cpp */; }; + 91E356BF1CACC8A100774252 /* ca_move_to_targets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B552D92A108694BB002D8F86 /* ca_move_to_targets.cpp */; }; + 91E356C01CACC8A100774252 /* stage_rca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6C50FEA9EB5006F6FBD /* stage_rca.cpp */; }; + 91E356C11CACC8B800774252 /* ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6BC0FEA9EB5006F6FBD /* ai.cpp */; }; + 91E356C21CACC8B800774252 /* callable_objects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A971013BB5A00C10B66 /* callable_objects.cpp */; }; + 91E356C31CACC8B800774252 /* candidates.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6BE0FEA9EB5006F6FBD /* candidates.cpp */; }; + 91E356C41CACC8B800774252 /* engine_fai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D191100146E300B12852 /* engine_fai.cpp */; }; + 91E356C51CACC8B800774252 /* function_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A991013BB5A00C10B66 /* function_table.cpp */; }; + 91E356C61CACC8B800774252 /* stage_side_formulas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96DB103478DE00A57C1A /* stage_side_formulas.cpp */; }; + 91E356C71CACC8B800774252 /* stage_unit_formulas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96DD103478DE00A57C1A /* stage_unit_formulas.cpp */; }; + 91E356C81CACC8C400774252 /* aspect_advancements.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 627F1ED9175AF35C000042E0 /* aspect_advancements.cpp */; }; + 91E356C91CACC8C400774252 /* core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9A4121363EB00CFBDAB /* core.cpp */; }; + 91E356CA1CACC8C400774252 /* engine_lua.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE03C11234AD700154E6C /* engine_lua.cpp */; }; + 91E356CB1CACC8C400774252 /* lua_object.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F46C5DD313A5089100DD0816 /* lua_object.cpp */; }; + 91E356CC1CACC8DA00774252 /* notifications.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC74C119197576F500B85A1A /* notifications.cpp */; }; + 91E356CD1CACC8DA00774252 /* open.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC74C11B197576F500B85A1A /* open.cpp */; }; + 91E356CE1CACC8DA00774252 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B621B91B76B2C900B00E0F /* version.cpp */; }; + 91E356CF1CACC8F200774252 /* editor_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECB58C8B19E71347007D074F /* editor_controller.cpp */; }; + 91E356D01CACC8F200774252 /* editor_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599FFF0EC8FE2E008DD061 /* editor_display.cpp */; }; + 91E356D11CACC8F200774252 /* editor_main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559A0030EC8FE2E008DD061 /* editor_main.cpp */; }; + 91E356D21CACC8F200774252 /* editor_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F38F104B11F7001369F5 /* editor_preferences.cpp */; }; + 91E356D31CACC90100774252 /* action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3A7150FC95C0077D8C5 /* action.cpp */; }; + 91E356D41CACC90100774252 /* action_item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62114CC01750B97F00CA42C7 /* action_item.cpp */; }; + 91E356D51CACC90100774252 /* action_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3AA150FC95C0077D8C5 /* action_label.cpp */; }; + 91E356D61CACC90100774252 /* action_select.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E4E1774C4E800C16B75 /* action_select.cpp */; }; + 91E356D71CACC90100774252 /* action_unit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3AC150FC95C0077D8C5 /* action_unit.cpp */; }; + 91E356D81CACC90100774252 /* action_village.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62973FDC15C2EA7800D18140 /* action_village.cpp */; }; + 91E356D91CACC90B00774252 /* mouse_action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3AF150FC95C0077D8C5 /* mouse_action.cpp */; }; + 91E356DA1CACC90B00774252 /* mouse_action_item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62114CC41750B99800CA42C7 /* mouse_action_item.cpp */; }; + 91E356DB1CACC90B00774252 /* mouse_action_map_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3B1150FC95C0077D8C5 /* mouse_action_map_label.cpp */; }; + 91E356DC1CACC90B00774252 /* mouse_action_select.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E511774C4F800C16B75 /* mouse_action_select.cpp */; }; + 91E356DD1CACC90B00774252 /* mouse_action_unit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3B3150FC95C0077D8C5 /* mouse_action_unit.cpp */; }; + 91E356DE1CACC90B00774252 /* mouse_action_village.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62973FE015C2EAF300D18140 /* mouse_action_village.cpp */; }; + 91E356DF1CACC92000774252 /* context_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62D24F311519987400350848 /* context_manager.cpp */; }; + 91E356E01CACC92000774252 /* editor_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3BC150FC9750077D8C5 /* editor_map.cpp */; }; + 91E356E11CACC92000774252 /* map_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3BE150FC9750077D8C5 /* map_context.cpp */; }; + 91E356E21CACC92000774252 /* map_fragment.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3C0150FC9750077D8C5 /* map_fragment.cpp */; }; + 91E356E31CACC93000774252 /* editor_palettes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3CB150FC9EB0077D8C5 /* editor_palettes.cpp */; }; + 91E356E41CACC93000774252 /* item_palette.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62114CC71750B9AF00CA42C7 /* item_palette.cpp */; }; + 91E356E51CACC93000774252 /* palette_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62D24F341519995200350848 /* palette_manager.cpp */; }; + 91E356E61CACC93000774252 /* terrain_palettes.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3D0150FC9EB0077D8C5 /* terrain_palettes.cpp */; }; + 91E356E71CACC93000774252 /* tristate_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49478712172FF6F8002B7ABA /* tristate_button.cpp */; }; + 91E356E81CACC93000774252 /* unit_palette.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 6295C3D2150FC9EB0077D8C5 /* unit_palette.cpp */; }; + 91E356E91CACC93600774252 /* brush.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62D24F271519982500350848 /* brush.cpp */; }; + 91E356EA1CACC93600774252 /* editor_toolkit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62D24F2B1519982500350848 /* editor_toolkit.cpp */; }; + 91E356EB1CACC95100774252 /* callable_objects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AB00EC62181008DD061 /* callable_objects.cpp */; }; + 91E356EC1CACC95100774252 /* debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A8121359A600CFBDAB /* debugger.cpp */; }; + 91E356ED1CACC95100774252 /* debugger_fwd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A6121359A600CFBDAB /* debugger_fwd.cpp */; }; + 91E356EE1CACC95100774252 /* formula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A8C0EC62181008DD061 /* formula.cpp */; }; + 91E356EF1CACC95100774252 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A860EC62181008DD061 /* function.cpp */; }; + 91E356F01CACC95100774252 /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8AA121359A600CFBDAB /* string_utils.cpp */; }; + 91E356F11CACC95100774252 /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A830EC62181008DD061 /* tokenizer.cpp */; }; + 91E356F21CACC95100774252 /* variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999690EC62181008DD061 /* variant.cpp */; }; + 91E356F31CACC97400774252 /* action_wml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E6A17B9063D00C16B75 /* action_wml.cpp */; }; + 91E356F41CACC97400774252 /* conditional_wml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E6C17B9063D00C16B75 /* conditional_wml.cpp */; }; + 91E356F51CACC97400774252 /* entity_location.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E6E17B9063D00C16B75 /* entity_location.cpp */; }; + 91E356F61CACC97400774252 /* handlers.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E7017B9063D00C16B75 /* handlers.cpp */; }; + 91E356F71CACC97400774252 /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECDF181F1A3FE0DE00D157A6 /* manager.cpp */; }; + 91E356F81CACC97400774252 /* manager_impl.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECDF181E1A3FE0DE00D157A6 /* manager_impl.cpp */; }; + 91E356F91CACC97400774252 /* menu_item.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC44E37E181DDAF90037A62F /* menu_item.cpp */; }; + 91E356FA1CACC97400774252 /* pump.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62CC8E7217B9063D00C16B75 /* pump.cpp */; }; + 91E356FB1CACC97400774252 /* wmi_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC44E380181DDAF90037A62F /* wmi_container.cpp */; }; + 91E356FC1CACC9B200774252 /* configure_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F5FFD1A048E210018C9D6 /* configure_engine.cpp */; }; + 91E356FD1CACC9B200774252 /* connect_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F5FFE1A048E210018C9D6 /* connect_engine.cpp */; }; + 91E356FE1CACC9B200774252 /* create_engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F5FFF1A048E210018C9D6 /* create_engine.cpp */; }; + 91E356FF1CACC9B200774252 /* depcheck.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60001A048E210018C9D6 /* depcheck.cpp */; }; + 91E357001CACC9B200774252 /* flg_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60011A048E210018C9D6 /* flg_manager.cpp */; }; + 91E357011CACC9B200774252 /* mp_game_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60021A048E210018C9D6 /* mp_game_utils.cpp */; }; + 91E357021CACC9B200774252 /* mp_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60031A048E210018C9D6 /* mp_options.cpp */; }; + 91E357031CACC9B200774252 /* multiplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F600A1A048E210018C9D6 /* multiplayer.cpp */; }; + 91E357041CACC9B200774252 /* multiplayer_configure.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60041A048E210018C9D6 /* multiplayer_configure.cpp */; }; + 91E357051CACC9B200774252 /* multiplayer_connect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60051A048E210018C9D6 /* multiplayer_connect.cpp */; }; + 91E357061CACC9B200774252 /* multiplayer_create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60061A048E210018C9D6 /* multiplayer_create.cpp */; }; + 91E357071CACC9B200774252 /* multiplayer_lobby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60071A048E210018C9D6 /* multiplayer_lobby.cpp */; }; + 91E357081CACC9B200774252 /* multiplayer_ui.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60081A048E210018C9D6 /* multiplayer_ui.cpp */; }; + 91E357091CACC9B200774252 /* multiplayer_wait.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F60091A048E210018C9D6 /* multiplayer_wait.cpp */; }; + 91E3570A1CACC9B200774252 /* playcampaign.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F600B1A048E210018C9D6 /* playcampaign.cpp */; }; + 91E3570B1CACC9B200774252 /* singleplayer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F600C1A048E220018C9D6 /* singleplayer.cpp */; }; + 91E3570C1CACC9FF00774252 /* old_markup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470B12A0422800D665EE /* old_markup.cpp */; }; + 91E3570D1CACCA0600774252 /* iterator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA0D2B13550E9B000AFEBD /* iterator.cpp */; }; + 91E3570E1CACCA0600774252 /* walker_grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA0D2C13550E9B000AFEBD /* walker_grid.cpp */; }; + 91E3570F1CACCA0600774252 /* walker_widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 49DA0D2D13550E9B000AFEBD /* walker_widget.cpp */; }; + 91E357101CACCA5700774252 /* canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC510FC08E0100CE81F5 /* canvas.cpp */; }; + 91E357111CACCA5700774252 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC550FC08E0100CE81F5 /* log.cpp */; }; + 91E357121CACCA5700774252 /* placer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4D5AFEA1571208B0062EAFC /* placer.cpp */; }; + 91E357131CACCA5700774252 /* point.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4C5DD66158CFD5E0044F754 /* point.cpp */; }; + 91E357141CACCA5700774252 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CF7BBA10D55F5A00A8BEB5 /* timer.cpp */; }; + 91E357151CACCA5700774252 /* tips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B504B94A1284C06B00261FE9 /* tips.cpp */; }; + 91E357161CACCA5700774252 /* widget_definition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B4692E107118B200327599 /* widget_definition.cpp */; }; + 91E357171CACCA5700774252 /* window_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC570FC08E0100CE81F5 /* window_builder.cpp */; }; + 91E357181CACCA9900774252 /* dispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B46933107118C400327599 /* dispatcher.cpp */; }; + 91E357191CACCA9900774252 /* distributor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B552D92210869477002D8F86 /* distributor.cpp */; }; + 91E3571A1CACCA9900774252 /* handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B46936107118C400327599 /* handler.cpp */; }; + 91E3571B1CACCA9900774252 /* horizontal_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4D5AFF0157120B30062EAFC /* horizontal_list.cpp */; }; + 91E3571C1CACCA9900774252 /* vertical_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4D5AFF2157120B30062EAFC /* vertical_list.cpp */; }; + 91E3571D1CACCA9900774252 /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D1E7100155F300B12852 /* helper.cpp */; }; + 91E3571E1CACCA9900774252 /* instance.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 62579C781573E70C003089D5 /* instance.cpp */; }; + 91E3571F1CACCAC900774252 /* advanced_graphics_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F601D1A0490970018C9D6 /* advanced_graphics_options.cpp */; }; + 91E357211CACCAC900774252 /* campaign_difficulty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE46FF12A041EF00D665EE /* campaign_difficulty.cpp */; }; + 91E357231CACCAC900774252 /* campaign_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5F4D7170F5B3B25005E204A /* campaign_selection.cpp */; }; + 91E357251CACCAC900774252 /* campaign_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECD0C4AA199C0B72005C2173 /* campaign_settings.cpp */; }; + 91E357271CACCAC900774252 /* chat_log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F4D5DF37149CE9B500294046 /* chat_log.cpp */; }; + 91E357291CACCAC900774252 /* core_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECBBD73E1928F41500E434C6 /* core_selection.cpp */; }; + 91E3572B1CACCAC900774252 /* debug_clock.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 4944F40E1354FB970027E614 /* debug_clock.cpp */; }; + 91E3572D1CACCAC900774252 /* depcheck_confirm_change.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC74C10D1975765F00B85A1A /* depcheck_confirm_change.cpp */; }; + 91E3572F1CACCAC900774252 /* depcheck_select_new.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC74C10E1975765F00B85A1A /* depcheck_select_new.cpp */; }; + 91E357311CACCAC900774252 /* dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB20ECA805A002BE442 /* dialog.cpp */; }; + 91E357331CACCAC900774252 /* drop_down_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462921C7117400050A9C9 /* drop_down_list.cpp */; }; + 91E357351CACCAC900774252 /* edit_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470112A041EF00D665EE /* edit_label.cpp */; }; + 91E357371CACCAC900774252 /* edit_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 497455CC174066A800E89E30 /* edit_text.cpp */; }; + 91E357391CACCB4000774252 /* folder_create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = F444917513C5562C003B6442 /* folder_create.cpp */; }; + 91E3573B1CACCB4000774252 /* formula_debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F36E104B11B6001369F5 /* formula_debugger.cpp */; }; + 91E3573D1CACCB4000774252 /* game_cache_options.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC79D70C19548D5000EC7C1F /* game_cache_options.cpp */; }; + 91E3573F1CACCB4100774252 /* game_delete.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A931013BB3400C10B66 /* game_delete.cpp */; }; + 91E357411CACCB4100774252 /* game_load.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B595EFE0100436C900C10B66 /* game_load.cpp */; }; + 91E357431CACCB4100774252 /* game_save.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC620FC08E5D00CE81F5 /* game_save.cpp */; }; + 91E357451CACCB4100774252 /* game_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = ECABDA341B6A9461001407C1 /* game_version.cpp */; }; + 91E357461CACCB4100774252 /* gamestate_inspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B4692A1071189700327599 /* gamestate_inspector.cpp */; }; + 91E357491CACCB4100774252 /* label_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91B6217A1B74E6D100B00E0F /* label_settings.cpp */; }; + 91E3574B1CACCB4100774252 /* language_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCBF0ECA805A002BE442 /* language_selection.cpp */; }; + 91E3574D1CACCB4200774252 /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9122417A1CAAB7B7008B347F /* loadscreen.cpp */; }; + 91E3574F1CACCC3E00774252 /* lua_interpreter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC2F9A031A18112D00A14878 /* lua_interpreter.cpp */; }; + 91E357501CACCC3E00774252 /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC10ECA805A002BE442 /* message.cpp */; }; 91ECD5D21BA11A5200B25CF1 /* unit_creator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91ECD5D01BA11A5200B25CF1 /* unit_creator.cpp */; }; - 91EF6C051C9E22EA00E2A733 /* sha1.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91EF6C011C9E22E400E2A733 /* sha1.cpp */; }; 91F462841C71139C0050A9C9 /* preferences_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462821C71139B0050A9C9 /* preferences_dialog.cpp */; }; - 91F462851C71139C0050A9C9 /* preferences_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462821C71139B0050A9C9 /* preferences_dialog.cpp */; }; 91F462881C7115C50050A9C9 /* combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462861C7115C50050A9C9 /* combobox.cpp */; }; - 91F462891C7115C50050A9C9 /* combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462861C7115C50050A9C9 /* combobox.cpp */; }; 91F462941C7117400050A9C9 /* drop_down_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462921C7117400050A9C9 /* drop_down_list.cpp */; }; - 91F462951C7117400050A9C9 /* drop_down_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462921C7117400050A9C9 /* drop_down_list.cpp */; }; B504B94C1284C06B00261FE9 /* tips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B504B94A1284C06B00261FE9 /* tips.cpp */; }; - B504B94D1284C06B00261FE9 /* tips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B504B94A1284C06B00261FE9 /* tips.cpp */; }; B508D13F10013BF900B12852 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B508D13E10013BF900B12852 /* Growl.framework */; }; B508D14B10013E4700B12852 /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = B508D14A10013E4700B12852 /* Growl Registration Ticket.growlRegDict */; }; B508D15F10013F8100B12852 /* Growl.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = B508D13E10013BF900B12852 /* Growl.framework */; }; B508D193100146E300B12852 /* engine_fai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D191100146E300B12852 /* engine_fai.cpp */; }; - B508D194100146E300B12852 /* engine_fai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D191100146E300B12852 /* engine_fai.cpp */; }; B508D1FB100155F300B12852 /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D1E7100155F300B12852 /* helper.cpp */; }; - B508D205100155F300B12852 /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D1E7100155F300B12852 /* helper.cpp */; }; B508D2161001560100B12852 /* stacked_widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D2141001560100B12852 /* stacked_widget.cpp */; }; - B508D2171001560100B12852 /* stacked_widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B508D2141001560100B12852 /* stacked_widget.cpp */; }; B513B1E70ED345EB0006E551 /* pango.modules in Resources */ = {isa = PBXBuildFile; fileRef = B513B1C80ED345EA0006E551 /* pango.modules */; }; B513B21E0ED346090006E551 /* pango in Resources */ = {isa = PBXBuildFile; fileRef = B513B2000ED346090006E551 /* pango */; }; B513B2290ED36BFB0006E551 /* libcairo.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B513B2270ED36BFB0006E551 /* libcairo.2.dylib */; }; B513B2790ED372210006E551 /* SDL2_ttf.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = B5599E9B0EC68BF2008DD061 /* SDL2_ttf.framework */; }; B514C70B0F5450CC00E273F0 /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B514C7090F5450CC00E273F0 /* list.cpp */; }; B52EE8841213585300CFBDAB /* tod_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8821213585300CFBDAB /* tod_manager.cpp */; }; - B52EE8851213585300CFBDAB /* tod_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8821213585300CFBDAB /* tod_manager.cpp */; }; B52EE88C1213589100CFBDAB /* unit_attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8891213589100CFBDAB /* unit_attack.cpp */; }; - B52EE88E1213589100CFBDAB /* unit_attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8891213589100CFBDAB /* unit_attack.cpp */; }; B52EE89D1213590500CFBDAB /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8991213590500CFBDAB /* list.cpp */; }; B52EE89E1213590500CFBDAB /* progress_bar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE89B1213590500CFBDAB /* progress_bar.cpp */; }; - B52EE89F1213590500CFBDAB /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8991213590500CFBDAB /* list.cpp */; }; - B52EE8A01213590500CFBDAB /* progress_bar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE89B1213590500CFBDAB /* progress_bar.cpp */; }; B52EE8CB121359A600CFBDAB /* arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A1121359A600CFBDAB /* arrow.cpp */; }; B52EE8CD121359A600CFBDAB /* debugger_fwd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A6121359A600CFBDAB /* debugger_fwd.cpp */; }; B52EE8CE121359A600CFBDAB /* debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A8121359A600CFBDAB /* debugger.cpp */; }; @@ -193,19 +745,6 @@ B52EE8DB121359A600CFBDAB /* savegame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C2121359A600CFBDAB /* savegame.cpp */; }; B52EE8DC121359A600CFBDAB /* sound_music_track.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C4121359A600CFBDAB /* sound_music_track.cpp */; }; B52EE8DD121359A600CFBDAB /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C7121359A600CFBDAB /* helper.cpp */; }; - B52EE8DF121359A600CFBDAB /* arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A1121359A600CFBDAB /* arrow.cpp */; }; - B52EE8E1121359A600CFBDAB /* debugger_fwd.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A6121359A600CFBDAB /* debugger_fwd.cpp */; }; - B52EE8E2121359A600CFBDAB /* debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A8121359A600CFBDAB /* debugger.cpp */; }; - B52EE8E3121359A600CFBDAB /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8AA121359A600CFBDAB /* string_utils.cpp */; }; - B52EE8E4121359A600CFBDAB /* hash.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8AD121359A600CFBDAB /* hash.cpp */; }; - B52EE8E6121359A600CFBDAB /* lobby_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8B2121359A600CFBDAB /* lobby_preferences.cpp */; }; - B52EE8EA121359A600CFBDAB /* persist_context.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8B9121359A600CFBDAB /* persist_context.cpp */; }; - B52EE8EB121359A600CFBDAB /* persist_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8BB121359A600CFBDAB /* persist_manager.cpp */; }; - B52EE8EC121359A600CFBDAB /* persist_var.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8BD121359A600CFBDAB /* persist_var.cpp */; }; - B52EE8ED121359A600CFBDAB /* save_blocker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8BF121359A600CFBDAB /* save_blocker.cpp */; }; - B52EE8EF121359A600CFBDAB /* savegame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C2121359A600CFBDAB /* savegame.cpp */; }; - B52EE8F0121359A600CFBDAB /* sound_music_track.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C4121359A600CFBDAB /* sound_music_track.cpp */; }; - B52EE8F1121359A600CFBDAB /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8C7121359A600CFBDAB /* helper.cpp */; }; B52EE91512135AC300CFBDAB /* action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8FE12135AC300CFBDAB /* action.cpp */; }; B52EE91612135AC300CFBDAB /* attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90012135AC300CFBDAB /* attack.cpp */; }; B52EE91812135AC300CFBDAB /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90412135AC300CFBDAB /* manager.cpp */; }; @@ -213,45 +752,16 @@ B52EE91B12135AC300CFBDAB /* recall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90A12135AC300CFBDAB /* recall.cpp */; }; B52EE91C12135AC300CFBDAB /* recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90C12135AC300CFBDAB /* recruit.cpp */; }; B52EE91D12135AC300CFBDAB /* side_actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90E12135AC300CFBDAB /* side_actions.cpp */; }; - B52EE92012135AC300CFBDAB /* action.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8FE12135AC300CFBDAB /* action.cpp */; }; - B52EE92112135AC300CFBDAB /* attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90012135AC300CFBDAB /* attack.cpp */; }; - B52EE92312135AC300CFBDAB /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90412135AC300CFBDAB /* manager.cpp */; }; - B52EE92512135AC300CFBDAB /* move.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90812135AC300CFBDAB /* move.cpp */; }; - B52EE92612135AC300CFBDAB /* recall.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90A12135AC300CFBDAB /* recall.cpp */; }; - B52EE92712135AC300CFBDAB /* recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90C12135AC300CFBDAB /* recruit.cpp */; }; - B52EE92812135AC300CFBDAB /* side_actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE90E12135AC300CFBDAB /* side_actions.cpp */; }; B52EE9A6121363EB00CFBDAB /* core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9A4121363EB00CFBDAB /* core.cpp */; }; - B52EE9A7121363EB00CFBDAB /* core.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9A4121363EB00CFBDAB /* core.cpp */; }; B52EE9AD1213640400CFBDAB /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9A91213640400CFBDAB /* manager.cpp */; }; B52EE9AE1213640400CFBDAB /* validation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9AB1213640400CFBDAB /* validation.cpp */; }; - B52EE9AF1213640400CFBDAB /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9A91213640400CFBDAB /* manager.cpp */; }; - B52EE9B01213640400CFBDAB /* validation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE9AB1213640400CFBDAB /* validation.cpp */; }; B54AC6800FEA9C4A006F6FBD /* player_network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6790FEA9C4A006F6FBD /* player_network.cpp */; }; B54AC6810FEA9C4A006F6FBD /* room.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC67B0FEA9C4A006F6FBD /* room.cpp */; }; B54AC6820FEA9C4A006F6FBD /* room_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC67D0FEA9C4A006F6FBD /* room_manager.cpp */; }; - B54AC6830FEA9C4A006F6FBD /* player_network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6790FEA9C4A006F6FBD /* player_network.cpp */; }; - B54AC6840FEA9C4A006F6FBD /* room.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC67B0FEA9C4A006F6FBD /* room.cpp */; }; - B54AC6850FEA9C4A006F6FBD /* room_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC67D0FEA9C4A006F6FBD /* room_manager.cpp */; }; - B54AC6970FEA9E8F006F6FBD /* actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC68D0FEA9E8F006F6FBD /* actions.cpp */; }; - B54AC6980FEA9E8F006F6FBD /* configuration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC68F0FEA9E8F006F6FBD /* configuration.cpp */; }; - B54AC69A0FEA9E8F006F6FBD /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6930FEA9E8F006F6FBD /* manager.cpp */; }; - B54AC69B0FEA9E8F006F6FBD /* registry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6950FEA9E8F006F6FBD /* registry.cpp */; }; B54AC69C0FEA9E8F006F6FBD /* actions.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC68D0FEA9E8F006F6FBD /* actions.cpp */; }; B54AC69D0FEA9E8F006F6FBD /* configuration.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC68F0FEA9E8F006F6FBD /* configuration.cpp */; }; B54AC69F0FEA9E8F006F6FBD /* manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6930FEA9E8F006F6FBD /* manager.cpp */; }; B54AC6A00FEA9E8F006F6FBD /* registry.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6950FEA9E8F006F6FBD /* registry.cpp */; }; - B54AC6C70FEA9EB5006F6FBD /* ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A40FEA9EB5006F6FBD /* ai.cpp */; }; - B54AC6C80FEA9EB5006F6FBD /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A60FEA9EB5006F6FBD /* contexts.cpp */; }; - B54AC6C90FEA9EB5006F6FBD /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A80FEA9EB5006F6FBD /* engine.cpp */; }; - B54AC6CA0FEA9EB5006F6FBD /* engine_cpp.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6AA0FEA9EB5006F6FBD /* engine_cpp.cpp */; }; - B54AC6CB0FEA9EB5006F6FBD /* rca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6AC0FEA9EB5006F6FBD /* rca.cpp */; }; - B54AC6CC0FEA9EB5006F6FBD /* stage.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6AE0FEA9EB5006F6FBD /* stage.cpp */; }; - B54AC6CE0FEA9EB5006F6FBD /* attack.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6B30FEA9EB5006F6FBD /* attack.cpp */; }; - B54AC6CF0FEA9EB5006F6FBD /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6B40FEA9EB5006F6FBD /* contexts.cpp */; }; - B54AC6D30FEA9EB5006F6FBD /* ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6BC0FEA9EB5006F6FBD /* ai.cpp */; }; - B54AC6D40FEA9EB5006F6FBD /* candidates.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6BE0FEA9EB5006F6FBD /* candidates.cpp */; }; - B54AC6D50FEA9EB5006F6FBD /* ca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6C10FEA9EB5006F6FBD /* ca.cpp */; }; - B54AC6D70FEA9EB5006F6FBD /* stage_rca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6C50FEA9EB5006F6FBD /* stage_rca.cpp */; }; B54AC6D80FEA9EB5006F6FBD /* ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A40FEA9EB5006F6FBD /* ai.cpp */; }; B54AC6D90FEA9EB5006F6FBD /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A60FEA9EB5006F6FBD /* contexts.cpp */; }; B54AC6DA0FEA9EB5006F6FBD /* engine.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6A80FEA9EB5006F6FBD /* engine.cpp */; }; @@ -264,20 +774,13 @@ B54AC6E50FEA9EB5006F6FBD /* candidates.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6BE0FEA9EB5006F6FBD /* candidates.cpp */; }; B54AC6E60FEA9EB5006F6FBD /* ca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6C10FEA9EB5006F6FBD /* ca.cpp */; }; B54AC6E80FEA9EB5006F6FBD /* stage_rca.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6C50FEA9EB5006F6FBD /* stage_rca.cpp */; }; - B54AC6F30FEA9F92006F6FBD /* lobby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6EF0FEA9F92006F6FBD /* lobby.cpp */; }; - B54AC6F40FEA9F92006F6FBD /* transient_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6F10FEA9F92006F6FBD /* transient_message.cpp */; }; B54AC6F50FEA9F92006F6FBD /* lobby.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6EF0FEA9F92006F6FBD /* lobby.cpp */; }; B54AC6F60FEA9F92006F6FBD /* transient_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6F10FEA9F92006F6FBD /* transient_message.cpp */; }; - B54AC6FE0FEA9FA5006F6FBD /* multi_page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6F80FEA9FA5006F6FBD /* multi_page.cpp */; }; - B54AC6FF0FEA9FA5006F6FBD /* scrollbar_panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6FB0FEA9FA5006F6FBD /* scrollbar_panel.cpp */; }; B54AC7000FEA9FA5006F6FBD /* multi_page.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6F80FEA9FA5006F6FBD /* multi_page.cpp */; }; B54AC7010FEA9FA5006F6FBD /* scrollbar_panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B54AC6FB0FEA9FA5006F6FBD /* scrollbar_panel.cpp */; }; B552D92410869477002D8F86 /* distributor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B552D92210869477002D8F86 /* distributor.cpp */; }; - B552D92510869477002D8F86 /* distributor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B552D92210869477002D8F86 /* distributor.cpp */; }; B552D92D108694BB002D8F86 /* ca_move_to_targets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B552D92A108694BB002D8F86 /* ca_move_to_targets.cpp */; }; - B552D92F108694BB002D8F86 /* ca_move_to_targets.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B552D92A108694BB002D8F86 /* ca_move_to_targets.cpp */; }; B553B6BA12189C5900CC8C58 /* utility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B553B6B812189C5900CC8C58 /* utility.cpp */; }; - B553B6BB12189C5900CC8C58 /* utility.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B553B6B812189C5900CC8C58 /* utility.cpp */; }; B559986C0EC616B3008DD061 /* SDLMain.mm in Sources */ = {isa = PBXBuildFile; fileRef = B559986B0EC616B3008DD061 /* SDLMain.mm */; settings = {COMPILER_FLAGS = "-w"; }; }; B55998F80EC61EA5008DD061 /* SDL2.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B55998F70EC61EA5008DD061 /* SDL2.framework */; }; B55999250EC61F59008DD061 /* SDL2_image.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B55999220EC61F59008DD061 /* SDL2_image.framework */; }; @@ -395,56 +898,24 @@ B55A80540EDF3DFB00C9D97A /* wml_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55A80520EDF3DFB00C9D97A /* wml_message.cpp */; }; B55BE03211234AAB00154E6C /* astarsearch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE02D11234AAB00154E6C /* astarsearch.cpp */; }; B55BE03311234AAB00154E6C /* pathfind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE02E11234AAB00154E6C /* pathfind.cpp */; }; - B55BE03511234AAB00154E6C /* astarsearch.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE02D11234AAB00154E6C /* astarsearch.cpp */; }; - B55BE03611234AAB00154E6C /* pathfind.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE02E11234AAB00154E6C /* pathfind.cpp */; }; B55BE03A11234AC700154E6C /* gamestate_observer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE03811234AC700154E6C /* gamestate_observer.cpp */; }; - B55BE03B11234AC700154E6C /* gamestate_observer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE03811234AC700154E6C /* gamestate_observer.cpp */; }; B55BE04011234AD700154E6C /* engine_lua.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE03C11234AD700154E6C /* engine_lua.cpp */; }; - B55BE04111234AD700154E6C /* engine_lua.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE03C11234AD700154E6C /* engine_lua.cpp */; }; B55BE04B11234B1A00154E6C /* data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04711234B1A00154E6C /* data.cpp */; }; B55BE04C11234B1A00154E6C /* info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04911234B1A00154E6C /* info.cpp */; }; - B55BE04D11234B1A00154E6C /* data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04711234B1A00154E6C /* data.cpp */; }; - B55BE04E11234B1A00154E6C /* info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04911234B1A00154E6C /* info.cpp */; }; B55BE05311234B3300154E6C /* tree_view_node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04F11234B3300154E6C /* tree_view_node.cpp */; }; B55BE05411234B3300154E6C /* tree_view.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE05111234B3300154E6C /* tree_view.cpp */; }; - B55BE05511234B3300154E6C /* tree_view_node.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE04F11234B3300154E6C /* tree_view_node.cpp */; }; - B55BE05611234B3300154E6C /* tree_view.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55BE05111234B3300154E6C /* tree_view.cpp */; }; B561F368104B1042001369F5 /* component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F366104B1042001369F5 /* component.cpp */; }; - B561F369104B1042001369F5 /* component.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F366104B1042001369F5 /* component.cpp */; }; B561F370104B11B6001369F5 /* formula_debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F36E104B11B6001369F5 /* formula_debugger.cpp */; }; - B561F371104B11B6001369F5 /* formula_debugger.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F36E104B11B6001369F5 /* formula_debugger.cpp */; }; B561F391104B11F7001369F5 /* editor_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F38F104B11F7001369F5 /* editor_preferences.cpp */; }; - B561F392104B11F7001369F5 /* editor_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B561F38F104B11F7001369F5 /* editor_preferences.cpp */; }; B5795A680F05858100EB190E /* horizontal_scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A610F05858100EB190E /* horizontal_scrollbar.cpp */; }; B5795A690F05858100EB190E /* scrollbar_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A640F05858100EB190E /* scrollbar_container.cpp */; }; B5795A6A0F05858100EB190E /* generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A670F05858100EB190E /* generator.cpp */; }; B59271FB10E9577800A13911 /* repeating_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59271F910E9577800A13911 /* repeating_button.cpp */; }; - B59271FC10E9577800A13911 /* repeating_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59271F910E9577800A13911 /* repeating_button.cpp */; }; B5951A8F1013BB0800C10B66 /* resources.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A841013BB0800C10B66 /* resources.cpp */; }; - B5951A911013BB0800C10B66 /* resources.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A841013BB0800C10B66 /* resources.cpp */; }; B5951A951013BB3400C10B66 /* game_delete.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A931013BB3400C10B66 /* game_delete.cpp */; }; - B5951A961013BB3400C10B66 /* game_delete.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A931013BB3400C10B66 /* game_delete.cpp */; }; B5951A9B1013BB5A00C10B66 /* callable_objects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A971013BB5A00C10B66 /* callable_objects.cpp */; }; B5951A9C1013BB5A00C10B66 /* function_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A991013BB5A00C10B66 /* function_table.cpp */; }; - B5951A9D1013BB5A00C10B66 /* callable_objects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A971013BB5A00C10B66 /* callable_objects.cpp */; }; - B5951A9E1013BB5A00C10B66 /* function_table.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5951A991013BB5A00C10B66 /* function_table.cpp */; }; B595EFE2100436C900C10B66 /* game_load.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B595EFE0100436C900C10B66 /* game_load.cpp */; }; - B595EFE3100436C900C10B66 /* game_load.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B595EFE0100436C900C10B66 /* game_load.cpp */; }; - B597C4AE0FACD42E00CE81F5 /* test_version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A40FACD42E00CE81F5 /* test_version.cpp */; }; - B597C4AF0FACD42E00CE81F5 /* test_util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A50FACD42E00CE81F5 /* test_util.cpp */; }; - B597C4B00FACD42E00CE81F5 /* test_team.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A60FACD42E00CE81F5 /* test_team.cpp */; }; - B597C4B10FACD42E00CE81F5 /* test_formula_ai.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A70FACD42E00CE81F5 /* test_formula_ai.cpp */; }; - B597C4B20FACD42E00CE81F5 /* test_config_cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A80FACD42E00CE81F5 /* test_config_cache.cpp */; }; - B597C4B30FACD42E00CE81F5 /* main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4A90FACD42E00CE81F5 /* main.cpp */; }; - B597C4B40FACD42E00CE81F5 /* test_serialization.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4AA0FACD42E00CE81F5 /* test_serialization.cpp */; }; - B597C4B60FACD42E00CE81F5 /* test_network_worker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4AC0FACD42E00CE81F5 /* test_network_worker.cpp */; }; - B597C4B70FACD42E00CE81F5 /* test_lexical_cast.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4AD0FACD42E00CE81F5 /* test_lexical_cast.cpp */; }; - B597C4D00FACD43B00CE81F5 /* fake_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C00FACD43B00CE81F5 /* fake_display.cpp */; }; - B597C4D10FACD43B00CE81F5 /* fake_event_source.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C20FACD43B00CE81F5 /* fake_event_source.cpp */; }; - B597C4D20FACD43B00CE81F5 /* game_config_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C40FACD43B00CE81F5 /* game_config_manager.cpp */; }; - B597C4D30FACD43B00CE81F5 /* play_scenario.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4C60FACD43B00CE81F5 /* play_scenario.cpp */; }; - B597C4D40FACD43B00CE81F5 /* test_drop_target.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4CE0FACD43B00CE81F5 /* test_drop_target.cpp */; }; - B597C4D50FACD43B00CE81F5 /* test_save_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4CF0FACD43B00CE81F5 /* test_save_dialog.cpp */; }; B597C51D0FACD56200CE81F5 /* libcairo.2.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B513B2270ED36BFB0006E551 /* libcairo.2.dylib */; }; B597C51E0FACD56600CE81F5 /* libpixman-1.0.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B513B2280ED36BFB0006E551 /* libpixman-1.0.dylib */; }; B597C51F0FACD56A00CE81F5 /* libfreetype.6.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = B5599FC90EC8FBCB008DD061 /* libfreetype.6.dylib */; }; @@ -453,191 +924,27 @@ B597C5280FACD58400CE81F5 /* SDL2_image.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B55999220EC61F59008DD061 /* SDL2_image.framework */; }; B597C5290FACD58400CE81F5 /* SDL2_net.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B55999230EC61F59008DD061 /* SDL2_net.framework */; }; B597C52A0FACD58400CE81F5 /* SDL2_mixer.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B55999240EC61F59008DD061 /* SDL2_mixer.framework */; }; - B597C5310FACD6CA00CE81F5 /* callable_objects.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AB00EC62181008DD061 /* callable_objects.cpp */; }; - B597C5330FACD6CA00CE81F5 /* generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A670F05858100EB190E /* generator.cpp */; }; - B597C5340FACD6CA00CE81F5 /* cursor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A9D0EC62181008DD061 /* cursor.cpp */; }; - B597C5350FACD6CA00CE81F5 /* playsingle_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999CA0EC62181008DD061 /* playsingle_controller.cpp */; }; - B597C5370FACD6CA00CE81F5 /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A830EC62181008DD061 /* tokenizer.cpp */; }; - B597C5380FACD6CA00CE81F5 /* textbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559995E0EC62181008DD061 /* textbox.cpp */; }; - B597C53A0FACD6CA00CE81F5 /* race.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C00EC62181008DD061 /* race.cpp */; }; - B597C53B0FACD6CA00CE81F5 /* minimap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999EC0EC62181008DD061 /* minimap.cpp */; }; - B597C53C0FACD6CA00CE81F5 /* replay_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B90EC62181008DD061 /* replay_controller.cpp */; }; - B597C53D0FACD6CA00CE81F5 /* playturn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C80EC62181008DD061 /* playturn.cpp */; }; - B597C53E0FACD6CA00CE81F5 /* util.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559996D0EC62181008DD061 /* util.cpp */; }; - B597C53F0FACD6CA00CE81F5 /* file_menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994D0EC62181008DD061 /* file_menu.cpp */; }; - B597C5400FACD6CA00CE81F5 /* grid.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF70ECA805A002BE442 /* grid.cpp */; }; - B597C5410FACD6CA00CE81F5 /* editor_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599FFF0EC8FE2E008DD061 /* editor_display.cpp */; }; - B597C5430FACD6CA00CE81F5 /* play_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999D00EC62181008DD061 /* play_controller.cpp */; }; - B597C5440FACD6CA00CE81F5 /* animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997B0EC62181008DD061 /* animation.cpp */; }; - B597C5450FACD6CA00CE81F5 /* config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA80EC62181008DD061 /* config.cpp */; }; - B597C5470FACD6CA00CE81F5 /* show_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A10EC62181008DD061 /* show_dialog.cpp */; }; - B597C54A0FACD6CA00CE81F5 /* spacer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0F0ECA805A002BE442 /* spacer.cpp */; }; - B597C54D0FACD6CA00CE81F5 /* floating_textbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A920EC62181008DD061 /* floating_textbox.cpp */; }; - B597C5500FACD6CA00CE81F5 /* drop_target.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994B0EC62181008DD061 /* drop_target.cpp */; }; - B597C5510FACD6CA00CE81F5 /* events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A970EC62181008DD061 /* events.cpp */; }; - B597C5530FACD6CA00CE81F5 /* team.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999970EC62181008DD061 /* team.cpp */; }; - B597C5540FACD6CA00CE81F5 /* preprocessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AD0EC62181008DD061 /* preprocessor.cpp */; }; - B597C5550FACD6CA00CE81F5 /* menu_style.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999530EC62181008DD061 /* menu_style.cpp */; }; - B597C5560FACD6CA00CE81F5 /* text_box.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD130ECA805A002BE442 /* text_box.cpp */; }; - B597C5580FACD6CA00CE81F5 /* mouse_handler_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999E80EC62181008DD061 /* mouse_handler_base.cpp */; }; - B597C5590FACD6CA00CE81F5 /* menu.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999510EC62181008DD061 /* menu.cpp */; }; - B597C55A0FACD6CA00CE81F5 /* video.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999650EC62181008DD061 /* video.cpp */; }; - B597C55B0FACD6CA00CE81F5 /* halo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A150EC62181008DD061 /* halo.cpp */; }; - B597C55C0FACD6CA00CE81F5 /* helper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF90ECA805A002BE442 /* helper.cpp */; }; - B597C55D0FACD6CA00CE81F5 /* network_worker.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999D60EC62181008DD061 /* network_worker.cpp */; }; - B597C55F0FACD6CA00CE81F5 /* generic_event.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A730EC62181008DD061 /* generic_event.cpp */; }; - B597C5600FACD6CA00CE81F5 /* binary_or_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A70EC62181008DD061 /* binary_or_text.cpp */; }; - B597C5610FACD6CA00CE81F5 /* password_box.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59915270F20EA1400BAD4C1 /* password_box.cpp */; }; - B597C5620FACD6CA00CE81F5 /* variable.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559996B0EC62181008DD061 /* variable.cpp */; }; - B597C5630FACD6CA00CE81F5 /* settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0B0ECA805A002BE442 /* settings.cpp */; }; - B597C5640FACD6CA00CE81F5 /* new_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB60ECA805A002BE442 /* new_map.cpp */; }; - B597C5650FACD6CA00CE81F5 /* message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC10ECA805A002BE442 /* message.cpp */; }; - B597C5670FACD6CA00CE81F5 /* sound.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559999F0EC62181008DD061 /* sound.cpp */; }; - B597C5680FACD6CA00CE81F5 /* settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A50EC62181008DD061 /* settings.cpp */; }; - B597C5690FACD6CA00CE81F5 /* button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCEA0ECA805A002BE442 /* button.cpp */; }; - B597C56B0FACD6CA00CE81F5 /* unit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997F0EC62181008DD061 /* unit.cpp */; }; - B597C56C0FACD6CA00CE81F5 /* mouse_events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999EA0EC62181008DD061 /* mouse_events.cpp */; }; - B597C56D0FACD6CA00CE81F5 /* game_config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A800EC62181008DD061 /* game_config.cpp */; }; - B597C56F0FACD6CA00CE81F5 /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD090ECA805A002BE442 /* scrollbar.cpp */; }; - B597C5700FACD6CA00CE81F5 /* tooltips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999830EC62181008DD061 /* tooltips.cpp */; }; - B597C5730FACD6CA00CE81F5 /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD110ECA805A002BE442 /* text.cpp */; }; - B597C5750FACD6CA00CE81F5 /* font.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A900EC62181008DD061 /* font.cpp */; }; - B597C5760FACD6CA00CE81F5 /* scrollarea.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999560EC62181008DD061 /* scrollarea.cpp */; }; - B597C5770FACD6CA00CE81F5 /* game_preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A790EC62181008DD061 /* game_preferences.cpp */; }; - B597C5780FACD6CA00CE81F5 /* reports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B70EC62181008DD061 /* reports.cpp */; }; - B597C57A0FACD6CA00CE81F5 /* debug.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF20ECA805A002BE442 /* debug.cpp */; }; - B597C57B0FACD6CA00CE81F5 /* wml_message.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55A80520EDF3DFB00C9D97A /* wml_message.cpp */; }; - B597C57C0FACD6CA00CE81F5 /* vertical_scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD1B0ECA805A002BE442 /* vertical_scrollbar.cpp */; }; - B597C57E0FACD6CA00CE81F5 /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994F0EC62181008DD061 /* label.cpp */; }; - B597C57F0FACD6CA00CE81F5 /* game_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A7E0EC62181008DD061 /* game_display.cpp */; }; - B597C5800FACD6CA00CE81F5 /* mp_cmd_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59915060F20E9FF00BAD4C1 /* mp_cmd_wrapper.cpp */; }; - B597C5820FACD6CA00CE81F5 /* about.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AC60EC62181008DD061 /* about.cpp */; }; - B597C5830FACD6CA00CE81F5 /* intro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0D0EC62181008DD061 /* intro.cpp */; }; - B597C5850FACD6CA00CE81F5 /* replay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999BB0EC62181008DD061 /* replay.cpp */; }; - B597C5860FACD6CA00CE81F5 /* frame.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999770EC62181008DD061 /* frame.cpp */; }; - B597C5880FACD6CA00CE81F5 /* generate_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB40ECA805A002BE442 /* generate_map.cpp */; }; - B597C5890FACD6CA00CE81F5 /* statistics_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999990EC62181008DD061 /* statistics_dialog.cpp */; }; - B597C58C0FACD6CA00CE81F5 /* soundsource.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559999D0EC62181008DD061 /* soundsource.cpp */; }; - B597C58D0FACD6CA00CE81F5 /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B10EC62181008DD061 /* tokenizer.cpp */; }; - B597C58F0FACD6CA00CE81F5 /* thread.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559998B0EC62181008DD061 /* thread.cpp */; }; - B597C5900FACD6CA00CE81F5 /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999FB0EC62181008DD061 /* label.cpp */; }; - B597C5920FACD6CA00CE81F5 /* marked-up_text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999F20EC62181008DD061 /* marked-up_text.cpp */; }; - B597C5930FACD6CA00CE81F5 /* minimap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD030ECA805A002BE442 /* minimap.cpp */; }; - B597C5950FACD6CA00CE81F5 /* progressbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999540EC62181008DD061 /* progressbar.cpp */; }; - B597C5970FACD6CA00CE81F5 /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999600EC62181008DD061 /* widget.cpp */; }; - B597C5980FACD6CA00CE81F5 /* location.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999F90EC62181008DD061 /* location.cpp */; }; - B597C5990FACD6CA00CE81F5 /* abilities.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997D0EC62181008DD061 /* abilities.cpp */; }; - B597C59A0FACD6CA00CE81F5 /* editor_main.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559A0030EC8FE2E008DD061 /* editor_main.cpp */; }; - B597C59B0FACD6CA00CE81F5 /* listbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCFF0ECA805A002BE442 /* listbox.cpp */; }; - B597C59E0FACD6CA00CE81F5 /* color_range.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AAA0EC62181008DD061 /* color_range.cpp */; }; - B597C5A00FACD6CA00CE81F5 /* theme.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559998D0EC62181008DD061 /* theme.cpp */; }; - B597C5A20FACD6CA00CE81F5 /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AF0EC62181008DD061 /* string_utils.cpp */; }; - B597C5A30FACD6CA00CE81F5 /* mp_connect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC30ECA805A002BE442 /* mp_connect.cpp */; }; - B597C5A40FACD6CA00CE81F5 /* wml_exception.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999430EC62181008DD061 /* wml_exception.cpp */; }; - B597C5A50FACD6CA00CE81F5 /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCFD0ECA805A002BE442 /* label.cpp */; }; - B597C5A60FACD6CA00CE81F5 /* tstring.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999810EC62181008DD061 /* tstring.cpp */; }; - B597C5A70FACD6CA00CE81F5 /* slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0D0ECA805A002BE442 /* slider.cpp */; }; - B597C5A80FACD6CA00CE81F5 /* resize_map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB80ECA805A002BE442 /* resize_map.cpp */; }; - B597C5AD0FACD6CA00CE81F5 /* animated_game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AB50EC62181008DD061 /* animated_game.cpp */; }; - B597C5AE0FACD6CA00CE81F5 /* attack_prediction_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599ACA0EC62181008DD061 /* attack_prediction_display.cpp */; }; - B597C5B00FACD6CA00CE81F5 /* time_of_day.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999870EC62181008DD061 /* time_of_day.cpp */; }; - B597C5B10FACD6CA00CE81F5 /* function.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A860EC62181008DD061 /* function.cpp */; }; - B597C5B30FACD6CA00CE81F5 /* dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB20ECA805A002BE442 /* dialog.cpp */; }; - B597C5B40FACD6CA00CE81F5 /* scrollpane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559995A0EC62181008DD061 /* scrollpane.cpp */; }; - B597C5B60FACD6CA00CE81F5 /* map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999730EC62181008DD061 /* map.cpp */; }; - B597C5B70FACD6CA00CE81F5 /* connect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCB00ECA805A002BE442 /* connect.cpp */; }; - B597C5B80FACD6CA00CE81F5 /* campaign_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5F4D7170F5B3B25005E204A /* campaign_selection.cpp */; }; - B597C5B90FACD6CA00CE81F5 /* map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A000EC62181008DD061 /* map.cpp */; }; - B597C5BB0FACD6CA00CE81F5 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A020EC62181008DD061 /* log.cpp */; }; - B597C5BC0FACD6CA00CE81F5 /* image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0F0EC62181008DD061 /* image.cpp */; }; - B597C5BE0FACD6CA00CE81F5 /* construct_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA20EC62181008DD061 /* construct_dialog.cpp */; }; - B597C5BF0FACD6CA00CE81F5 /* image.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCFB0ECA805A002BE442 /* image.cpp */; }; - B597C5C00FACD6CA00CE81F5 /* list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B514C7090F5450CC00E273F0 /* list.cpp */; }; - B597C5C10FACD6CA00CE81F5 /* version.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999670EC62181008DD061 /* version.cpp */; }; - B597C5C20FACD6CA00CE81F5 /* horizontal_scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A610F05858100EB190E /* horizontal_scrollbar.cpp */; }; - B597C5C30FACD6CA00CE81F5 /* language_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCBF0ECA805A002BE442 /* language_selection.cpp */; }; - B597C5C40FACD6CA00CE81F5 /* md5.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999F00EC62181008DD061 /* md5.cpp */; }; - B597C5C60FACD6CA00CE81F5 /* dialogs.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A9B0EC62181008DD061 /* dialogs.cpp */; }; - B597C5CB0FACD6CA00CE81F5 /* container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCEE0ECA805A002BE442 /* container.cpp */; }; - B597C5CC0FACD6CA00CE81F5 /* display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A990EC62181008DD061 /* display.cpp */; }; - B597C5CD0FACD6CA00CE81F5 /* controller_base.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA00EC62181008DD061 /* controller_base.cpp */; }; - B597C5CE0FACD6CA00CE81F5 /* scroll_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD070ECA805A002BE442 /* scroll_label.cpp */; }; - B597C5D00FACD6CA00CE81F5 /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD210ECA805A002BE442 /* window.cpp */; }; - B597C5D10FACD6CA00CE81F5 /* combo.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999470EC62181008DD061 /* combo.cpp */; }; - B597C5D30FACD6CA00CE81F5 /* id.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999750EC62181008DD061 /* id.cpp */; }; - B597C5D60FACD6CA00CE81F5 /* widget.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD1F0ECA805A002BE442 /* widget.cpp */; }; - B597C5D70FACD6CA00CE81F5 /* network.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999DA0EC62181008DD061 /* network.cpp */; }; - B597C5D80FACD6CA00CE81F5 /* toggle_button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD150ECA805A002BE442 /* toggle_button.cpp */; }; - B597C5D90FACD6CA00CE81F5 /* text.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559998F0EC62181008DD061 /* text.cpp */; }; - B597C5DA0FACD6CA00CE81F5 /* filechooser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A950EC62181008DD061 /* filechooser.cpp */; }; - B597C5DB0FACD6CA00CE81F5 /* mp_method_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC70ECA805A002BE442 /* mp_method_selection.cpp */; }; - B597C5DD0FACD6CA00CE81F5 /* statistics.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559999B0EC62181008DD061 /* statistics.cpp */; }; - B597C5DE0FACD6CA00CE81F5 /* terrain.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999950EC62181008DD061 /* terrain.cpp */; }; - B597C5E00FACD6CA00CE81F5 /* preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C40EC62181008DD061 /* preferences.cpp */; }; - B597C5E10FACD6CA00CE81F5 /* key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0B0EC62181008DD061 /* key.cpp */; }; - B597C5E20FACD6CA00CE81F5 /* language.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A090EC62181008DD061 /* language.cpp */; }; - B597C5E30FACD6CA00CE81F5 /* combo_drag.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999490EC62181008DD061 /* combo_drag.cpp */; }; - B597C5E40FACD6CA00CE81F5 /* filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999930EC62181008DD061 /* filter.cpp */; }; - B597C5E60FACD6CA00CE81F5 /* variant.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999690EC62181008DD061 /* variant.cpp */; }; - B597C5E70FACD6CA00CE81F5 /* title_screen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC90ECA805A002BE442 /* title_screen.cpp */; }; - B597C5E80FACD6CA00CE81F5 /* mp_create_game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCC50ECA805A002BE442 /* mp_create_game.cpp */; }; - B597C5EA0FACD6CA00CE81F5 /* formula.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A8C0EC62181008DD061 /* formula.cpp */; }; - B597C5ED0FACD6CA00CE81F5 /* parser.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AB0EC62181008DD061 /* parser.cpp */; }; - B597C5EE0FACD6CA00CE81F5 /* scrollbar_container.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5795A640F05858100EB190E /* scrollbar_container.cpp */; }; - B597C5EF0FACD6CA00CE81F5 /* panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD050ECA805A002BE442 /* panel.cpp */; }; - B597C5F00FACD6CA00CE81F5 /* toggle_panel.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD170ECA805A002BE442 /* toggle_panel.cpp */; }; - B597C5F20FACD6CA00CE81F5 /* translation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999910EC62181008DD061 /* translation.cpp */; }; - B597C5F30FACD6CA00CE81F5 /* control.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BCF00ECA805A002BE442 /* control.cpp */; }; - B597C5F40FACD6CA00CE81F5 /* menu_events.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999EE0EC62181008DD061 /* menu_events.cpp */; }; - B597C5F60FACD6CA00CE81F5 /* attack_prediction.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AD00EC62181008DD061 /* attack_prediction.cpp */; }; - B597C5F70FACD6CA00CE81F5 /* pathutils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999D20EC62181008DD061 /* pathutils.cpp */; }; - B597C5F80FACD6CA00CE81F5 /* preferences_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C20EC62181008DD061 /* preferences_display.cpp */; }; - B597C5FC0FACD6CA00CE81F5 /* playmp_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999CC0EC62181008DD061 /* playmp_controller.cpp */; }; - B597C5FE0FACD6CA00CE81F5 /* config_cache.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA40EC62181008DD061 /* config_cache.cpp */; }; - B597C5FF0FACD6CA00CE81F5 /* types.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999710EC62181008DD061 /* types.cpp */; }; - B597C6030FACD6CA00CE81F5 /* udisplay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999790EC62181008DD061 /* udisplay.cpp */; }; - B597C65A0FACDDE800CE81F5 /* button.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999450EC62181008DD061 /* button.cpp */; }; B597C6F30FACDE1100CE81F5 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; - B597C71D0FACE4A600CE81F5 /* slider.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559995C0EC62181008DD061 /* slider.cpp */; }; - B597C7270FACE67E00CE81F5 /* scrollbar.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999580EC62181008DD061 /* scrollbar.cpp */; }; B597EBEE0FC082AB00CE81F5 /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBDB0FC082AB00CE81F5 /* contexts.cpp */; }; B597EBF10FC082AB00CE81F5 /* game_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBE10FC082AB00CE81F5 /* game_info.cpp */; }; B597EBF20FC082AB00CE81F5 /* testing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBE30FC082AB00CE81F5 /* testing.cpp */; }; - B597EBFC0FC082AB00CE81F5 /* contexts.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBDB0FC082AB00CE81F5 /* contexts.cpp */; }; - B597EBFF0FC082AB00CE81F5 /* game_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBE10FC082AB00CE81F5 /* game_info.cpp */; }; - B597EC000FC082AB00CE81F5 /* testing.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EBE30FC082AB00CE81F5 /* testing.cpp */; }; B597EC140FC0835900CE81F5 /* controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC0C0FC0835900CE81F5 /* controller.cpp */; }; B597EC150FC0835900CE81F5 /* interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC0E0FC0835900CE81F5 /* interface.cpp */; }; B597EC160FC0835900CE81F5 /* part.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC100FC0835900CE81F5 /* part.cpp */; }; B597EC170FC0835900CE81F5 /* render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC120FC0835900CE81F5 /* render.cpp */; }; - B597EC180FC0835900CE81F5 /* controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC0C0FC0835900CE81F5 /* controller.cpp */; }; - B597EC190FC0835900CE81F5 /* interface.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC0E0FC0835900CE81F5 /* interface.cpp */; }; - B597EC1A0FC0835900CE81F5 /* part.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC100FC0835900CE81F5 /* part.cpp */; }; - B597EC1B0FC0835900CE81F5 /* render.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC120FC0835900CE81F5 /* render.cpp */; }; B597EC5A0FC08E0100CE81F5 /* canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC510FC08E0100CE81F5 /* canvas.cpp */; }; B597EC5B0FC08E0100CE81F5 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC550FC08E0100CE81F5 /* log.cpp */; }; B597EC5C0FC08E0100CE81F5 /* window_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC570FC08E0100CE81F5 /* window_builder.cpp */; }; - B597EC5D0FC08E0100CE81F5 /* canvas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC510FC08E0100CE81F5 /* canvas.cpp */; }; - B597EC5E0FC08E0100CE81F5 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC550FC08E0100CE81F5 /* log.cpp */; }; - B597EC5F0FC08E0100CE81F5 /* window_builder.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC570FC08E0100CE81F5 /* window_builder.cpp */; }; B597EC630FC08E5D00CE81F5 /* game_save.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC620FC08E5D00CE81F5 /* game_save.cpp */; }; - B597EC640FC08E5D00CE81F5 /* game_save.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597EC620FC08E5D00CE81F5 /* game_save.cpp */; }; B59915070F20E9FF00BAD4C1 /* mp_cmd_wrapper.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59915060F20E9FF00BAD4C1 /* mp_cmd_wrapper.cpp */; }; B59915280F20EA1400BAD4C1 /* password_box.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59915270F20EA1400BAD4C1 /* password_box.cpp */; }; B59F96D5103478C900A57C1A /* aspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96D1103478C900A57C1A /* aspect.cpp */; }; B59F96D6103478C900A57C1A /* goal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96D3103478C900A57C1A /* goal.cpp */; }; - B59F96D7103478C900A57C1A /* aspect.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96D1103478C900A57C1A /* aspect.cpp */; }; - B59F96D8103478C900A57C1A /* goal.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96D3103478C900A57C1A /* goal.cpp */; }; B59F96E0103478DE00A57C1A /* stage_side_formulas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96DB103478DE00A57C1A /* stage_side_formulas.cpp */; }; B59F96E1103478DE00A57C1A /* stage_unit_formulas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96DD103478DE00A57C1A /* stage_unit_formulas.cpp */; }; - B59F96E3103478DE00A57C1A /* stage_side_formulas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96DB103478DE00A57C1A /* stage_side_formulas.cpp */; }; - B59F96E4103478DE00A57C1A /* stage_unit_formulas.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96DD103478DE00A57C1A /* stage_unit_formulas.cpp */; }; B59F96E71034791200A57C1A /* aspect_attacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96E51034791200A57C1A /* aspect_attacks.cpp */; }; - B59F96E81034791200A57C1A /* aspect_attacks.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96E51034791200A57C1A /* aspect_attacks.cpp */; }; B59F96ED1034796700A57C1A /* player_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96EB1034796700A57C1A /* player_info.cpp */; }; - B59F96EE1034796700A57C1A /* player_info.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F96EB1034796700A57C1A /* player_info.cpp */; }; B59F9733103716E400A57C1A /* unit_create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F9731103716E400A57C1A /* unit_create.cpp */; }; - B59F9734103716E400A57C1A /* unit_create.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B59F9731103716E400A57C1A /* unit_create.cpp */; }; B5A9B2290ECA4074002BE442 /* fonts in Resources */ = {isa = PBXBuildFile; fileRef = B5A9914A0ECA4064002BE442 /* fonts */; }; B5A9B22B0ECA4074002BE442 /* images in Resources */ = {isa = PBXBuildFile; fileRef = B5A9B0780ECA4074002BE442 /* images */; }; B5A9B22C0ECA4074002BE442 /* sounds in Resources */ = {isa = PBXBuildFile; fileRef = B5A9B2140ECA4074002BE442 /* sounds */; }; @@ -676,15 +983,10 @@ B5A9BD760ECA805A002BE442 /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD210ECA805A002BE442 /* window.cpp */; }; B5A9BE2A0ECE927C002BE442 /* icon.icns in Resources */ = {isa = PBXBuildFile; fileRef = B5A9BE290ECE927C002BE442 /* icon.icns */; }; B5B469241071185800327599 /* mp_game_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B469221071185800327599 /* mp_game_settings.cpp */; }; - B5B469251071185800327599 /* mp_game_settings.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B469221071185800327599 /* mp_game_settings.cpp */; }; B5B4692C1071189700327599 /* gamestate_inspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B4692A1071189700327599 /* gamestate_inspector.cpp */; }; - B5B4692D1071189700327599 /* gamestate_inspector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B4692A1071189700327599 /* gamestate_inspector.cpp */; }; B5B46930107118B200327599 /* widget_definition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B4692E107118B200327599 /* widget_definition.cpp */; }; - B5B46931107118B200327599 /* widget_definition.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B4692E107118B200327599 /* widget_definition.cpp */; }; B5B46938107118C400327599 /* dispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B46933107118C400327599 /* dispatcher.cpp */; }; B5B46939107118C400327599 /* handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B46936107118C400327599 /* handler.cpp */; }; - B5B4693A107118C400327599 /* dispatcher.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B46933107118C400327599 /* dispatcher.cpp */; }; - B5B4693B107118C400327599 /* handler.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5B46936107118C400327599 /* handler.cpp */; }; B5BB6B7D0F893E7500444FBF /* game.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5BB6B5A0F893E7500444FBF /* game.cpp */; }; B5BB6B7E0F893E7500444FBF /* input_stream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5BB6B5B0F893E7500444FBF /* input_stream.cpp */; }; B5BB6B820F893E7500444FBF /* simple_wml.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5BB6B6D0F893E7500444FBF /* simple_wml.cpp */; }; @@ -717,19 +1019,12 @@ B5BB6D040F8949CF00444FBF /* wesnothd in CopyFiles */ = {isa = PBXBuildFile; fileRef = B5BB6B4B0F890FBA00444FBF /* wesnothd */; }; B5BB6EFE0F93B83500444FBF /* SDLMain.nib in Resources */ = {isa = PBXBuildFile; fileRef = B5BB6EFD0F93B83500444FBF /* SDLMain.nib */; }; B5CE46F912A0417D00D665EE /* side_filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE46F712A0417D00D665EE /* side_filter.cpp */; }; - B5CE46FA12A0417D00D665EE /* side_filter.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE46F712A0417D00D665EE /* side_filter.cpp */; }; B5CE470512A041EF00D665EE /* campaign_difficulty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE46FF12A041EF00D665EE /* campaign_difficulty.cpp */; }; B5CE470612A041EF00D665EE /* edit_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470112A041EF00D665EE /* edit_label.cpp */; }; B5CE470712A041EF00D665EE /* simple_item_selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470312A041EF00D665EE /* simple_item_selector.cpp */; }; - B5CE470812A041EF00D665EE /* campaign_difficulty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE46FF12A041EF00D665EE /* campaign_difficulty.cpp */; }; - B5CE470912A041EF00D665EE /* edit_label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470112A041EF00D665EE /* edit_label.cpp */; }; - B5CE470A12A041EF00D665EE /* simple_item_selector.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470312A041EF00D665EE /* simple_item_selector.cpp */; }; B5CE470D12A0422800D665EE /* old_markup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470B12A0422800D665EE /* old_markup.cpp */; }; - B5CE470E12A0422800D665EE /* old_markup.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CE470B12A0422800D665EE /* old_markup.cpp */; }; B5CF7BBC10D55F5A00A8BEB5 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CF7BBA10D55F5A00A8BEB5 /* timer.cpp */; }; - B5CF7BBD10D55F5A00A8BEB5 /* timer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5CF7BBA10D55F5A00A8BEB5 /* timer.cpp */; }; B5DBABF312AFF7F200B5B8DC /* mp_create_game_set_password.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5DBABF112AFF7F200B5B8DC /* mp_create_game_set_password.cpp */; }; - B5DBABF412AFF7F200B5B8DC /* mp_create_game_set_password.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5DBABF112AFF7F200B5B8DC /* mp_create_game_set_password.cpp */; }; B5F4D7180F5B3B25005E204A /* campaign_selection.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5F4D7170F5B3B25005E204A /* campaign_selection.cpp */; }; B5F9C5950F93BB0B00C02205 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = B5F9C5930F93BB0B00C02205 /* InfoPlist.strings */; }; EC08023C194D0A80009E0050 /* formula_manager.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC08023A194D0A80009E0050 /* formula_manager.cpp */; }; @@ -1251,6 +1546,7 @@ 919B37F91BAF78AB00E0094C /* synced_user_choice.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = synced_user_choice.hpp; sourceTree = ""; }; 919B37FA1BAF7A9D00E0094C /* synced_choice_wait.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = synced_choice_wait.cpp; sourceTree = ""; }; 919B37FB1BAF7A9D00E0094C /* synced_choice_wait.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = synced_choice_wait.hpp; sourceTree = ""; }; + 91A214E41CAD618700927AEA /* gettext.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = gettext.hpp; sourceTree = ""; }; 91B6217A1B74E6D100B00E0F /* label_settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = label_settings.cpp; sourceTree = ""; }; 91B6217B1B74E6D100B00E0F /* label_settings.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = label_settings.hpp; sourceTree = ""; }; 91B621801B766ED500B00E0F /* buffered_istream.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = buffered_istream.hpp; sourceTree = ""; }; @@ -1364,6 +1660,28 @@ 91DCA68B1C9066EC0030F8D0 /* unit_recruit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unit_recruit.cpp; sourceTree = ""; }; 91DCA68C1C9066EC0030F8D0 /* unit_recruit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unit_recruit.hpp; sourceTree = ""; }; 91DCA68F1C9360610030F8D0 /* test_formula_core.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_formula_core.cpp; sourceTree = ""; }; + 91E355621CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libboost_unit_test_frameworkw.dylib; path = lib/libboost_unit_test_frameworkw.dylib; sourceTree = ""; }; + 91E356081CACA6CB00774252 /* floating_point_emulation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = floating_point_emulation.cpp; sourceTree = ""; }; + 91E356091CACA6CB00774252 /* test_addons.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_addons.cpp; sourceTree = ""; }; + 91E3560A1CACA6CB00774252 /* test_commandline_options.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_commandline_options.cpp; sourceTree = ""; }; + 91E3560B1CACA6CB00774252 /* test_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_config.cpp; sourceTree = ""; }; + 91E3560C1CACA6CB00774252 /* test_filesystem.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_filesystem.cpp; sourceTree = ""; }; + 91E3560D1CACA6CB00774252 /* test_formula_function.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_formula_function.cpp; sourceTree = ""; }; + 91E3560E1CACA6CB00774252 /* test_image_modifications.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_image_modifications.cpp; sourceTree = ""; }; + 91E3560F1CACA6CB00774252 /* test_lua.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_lua.cpp; sourceTree = ""; }; + 91E356101CACA6CB00774252 /* test_make_enum.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_make_enum.cpp; sourceTree = ""; }; + 91E356111CACA6CB00774252 /* test_map_location.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_map_location.cpp; sourceTree = ""; }; + 91E356121CACA6CB00774252 /* test_mp_connect.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_mp_connect.cpp; sourceTree = ""; }; + 91E356131CACA6CB00774252 /* test_recall_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_recall_list.cpp; sourceTree = ""; }; + 91E356141CACA6CB00774252 /* test_rng.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_rng.cpp; sourceTree = ""; }; + 91E356151CACA6CB00774252 /* test_sdl_utils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_sdl_utils.cpp; sourceTree = ""; }; + 91E356161CACA6CB00774252 /* test_sdl_utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_sdl_utils.hpp; sourceTree = ""; }; + 91E356171CACA6CB00774252 /* test_unit_map.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_unit_map.cpp; sourceTree = ""; }; + 91E356181CACA6CB00774252 /* test_whiteboard_side_actions.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_whiteboard_side_actions.cpp; sourceTree = ""; }; + 91E3562A1CACA6E600774252 /* fire_event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fire_event.cpp; sourceTree = ""; }; + 91E3562B1CACA6E600774252 /* iterator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = iterator.cpp; sourceTree = ""; }; + 91E3562C1CACA6E600774252 /* test_gui2.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_gui2.cpp; sourceTree = ""; }; + 91E3562D1CACA6E600774252 /* visitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = visitor.cpp; sourceTree = ""; }; 91ECD5D01BA11A5200B25CF1 /* unit_creator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unit_creator.cpp; sourceTree = ""; }; 91ECD5D11BA11A5200B25CF1 /* unit_creator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unit_creator.hpp; sourceTree = ""; }; 91EF6BFB1C9E22E400E2A733 /* boost_function_guarded.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = boost_function_guarded.hpp; sourceTree = ""; }; @@ -1521,9 +1839,9 @@ B55999220EC61F59008DD061 /* SDL2_image.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2_image.framework; path = lib/SDL2_image.framework; sourceTree = ""; }; B55999230EC61F59008DD061 /* SDL2_net.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2_net.framework; path = lib/SDL2_net.framework; sourceTree = ""; }; B55999240EC61F59008DD061 /* SDL2_mixer.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2_mixer.framework; path = lib/SDL2_mixer.framework; sourceTree = ""; }; - B55999410EC62181008DD061 /* wml_separators.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = wml_separators.hpp; path = ../src/wml_separators.hpp; sourceTree = ""; }; - B55999420EC62181008DD061 /* wml_exception.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = wml_exception.hpp; path = ../src/wml_exception.hpp; sourceTree = ""; }; - B55999430EC62181008DD061 /* wml_exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = wml_exception.cpp; path = ../src/wml_exception.cpp; sourceTree = ""; }; + B55999410EC62181008DD061 /* wml_separators.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = wml_separators.hpp; sourceTree = ""; }; + B55999420EC62181008DD061 /* wml_exception.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = wml_exception.hpp; sourceTree = ""; }; + B55999430EC62181008DD061 /* wml_exception.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wml_exception.cpp; sourceTree = ""; }; B55999450EC62181008DD061 /* button.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = button.cpp; sourceTree = ""; }; B55999460EC62181008DD061 /* button.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = button.hpp; sourceTree = ""; }; B55999470EC62181008DD061 /* combo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = combo.cpp; sourceTree = ""; }; @@ -1553,17 +1871,17 @@ B559995F0EC62181008DD061 /* textbox.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = textbox.hpp; sourceTree = ""; }; B55999600EC62181008DD061 /* widget.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = widget.cpp; sourceTree = ""; }; B55999610EC62181008DD061 /* widget.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = widget.hpp; sourceTree = ""; }; - B55999620EC62181008DD061 /* wesconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = wesconfig.h; path = ../src/wesconfig.h; sourceTree = ""; }; - B55999640EC62181008DD061 /* video.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = video.hpp; path = ../src/video.hpp; sourceTree = ""; }; - B55999650EC62181008DD061 /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = video.cpp; path = ../src/video.cpp; sourceTree = ""; }; - B55999660EC62181008DD061 /* version.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = version.hpp; path = ../src/version.hpp; sourceTree = ""; }; - B55999670EC62181008DD061 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = version.cpp; path = ../src/version.cpp; sourceTree = ""; }; + B55999620EC62181008DD061 /* wesconfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wesconfig.h; sourceTree = ""; }; + B55999640EC62181008DD061 /* video.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = video.hpp; sourceTree = ""; }; + B55999650EC62181008DD061 /* video.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = video.cpp; sourceTree = ""; }; + B55999660EC62181008DD061 /* version.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = version.hpp; sourceTree = ""; }; + B55999670EC62181008DD061 /* version.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = version.cpp; sourceTree = ""; }; B55999680EC62181008DD061 /* variant.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = variant.hpp; sourceTree = ""; }; B55999690EC62181008DD061 /* variant.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = variant.cpp; sourceTree = ""; }; - B559996A0EC62181008DD061 /* variable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = variable.hpp; path = ../src/variable.hpp; sourceTree = ""; }; - B559996B0EC62181008DD061 /* variable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = variable.cpp; path = ../src/variable.cpp; sourceTree = ""; }; - B559996C0EC62181008DD061 /* util.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = util.hpp; path = ../src/util.hpp; sourceTree = ""; }; - B559996D0EC62181008DD061 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = util.cpp; path = ../src/util.cpp; sourceTree = ""; }; + B559996A0EC62181008DD061 /* variable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = variable.hpp; sourceTree = ""; }; + B559996B0EC62181008DD061 /* variable.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = variable.cpp; sourceTree = ""; }; + B559996C0EC62181008DD061 /* util.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = util.hpp; sourceTree = ""; }; + B559996D0EC62181008DD061 /* util.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = util.cpp; sourceTree = ""; }; B55999700EC62181008DD061 /* types.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = types.hpp; sourceTree = ""; }; B55999710EC62181008DD061 /* types.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = types.cpp; sourceTree = ""; }; B55999720EC62181008DD061 /* map.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = map.hpp; sourceTree = ""; }; @@ -1580,38 +1898,38 @@ B559997D0EC62181008DD061 /* abilities.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = abilities.cpp; sourceTree = ""; }; B559997E0EC62181008DD061 /* unit.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unit.hpp; sourceTree = ""; }; B559997F0EC62181008DD061 /* unit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unit.cpp; sourceTree = ""; }; - B55999800EC62181008DD061 /* tstring.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = tstring.hpp; path = ../src/tstring.hpp; sourceTree = ""; }; - B55999810EC62181008DD061 /* tstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tstring.cpp; path = ../src/tstring.cpp; sourceTree = ""; }; - B55999820EC62181008DD061 /* tooltips.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = tooltips.hpp; path = ../src/tooltips.hpp; sourceTree = ""; }; - B55999830EC62181008DD061 /* tooltips.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = tooltips.cpp; path = ../src/tooltips.cpp; sourceTree = ""; }; - B55999860EC62181008DD061 /* time_of_day.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = time_of_day.hpp; path = ../src/time_of_day.hpp; sourceTree = ""; }; - B55999870EC62181008DD061 /* time_of_day.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = time_of_day.cpp; path = ../src/time_of_day.cpp; sourceTree = ""; }; - B559998A0EC62181008DD061 /* thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = thread.hpp; path = ../src/thread.hpp; sourceTree = ""; }; - B559998B0EC62181008DD061 /* thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = thread.cpp; path = ../src/thread.cpp; sourceTree = ""; }; - B559998C0EC62181008DD061 /* theme.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = theme.hpp; path = ../src/theme.hpp; sourceTree = ""; }; - B559998D0EC62181008DD061 /* theme.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = theme.cpp; path = ../src/theme.cpp; sourceTree = ""; }; - B559998E0EC62181008DD061 /* text.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = text.hpp; path = ../src/text.hpp; sourceTree = ""; }; - B559998F0EC62181008DD061 /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = text.cpp; path = ../src/text.cpp; sourceTree = ""; }; + B55999800EC62181008DD061 /* tstring.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tstring.hpp; sourceTree = ""; }; + B55999810EC62181008DD061 /* tstring.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tstring.cpp; sourceTree = ""; }; + B55999820EC62181008DD061 /* tooltips.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tooltips.hpp; sourceTree = ""; }; + B55999830EC62181008DD061 /* tooltips.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tooltips.cpp; sourceTree = ""; }; + B55999860EC62181008DD061 /* time_of_day.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = time_of_day.hpp; sourceTree = ""; }; + B55999870EC62181008DD061 /* time_of_day.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = time_of_day.cpp; sourceTree = ""; }; + B559998A0EC62181008DD061 /* thread.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = thread.hpp; sourceTree = ""; }; + B559998B0EC62181008DD061 /* thread.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = thread.cpp; sourceTree = ""; }; + B559998C0EC62181008DD061 /* theme.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = theme.hpp; sourceTree = ""; }; + B559998D0EC62181008DD061 /* theme.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = theme.cpp; sourceTree = ""; }; + B559998E0EC62181008DD061 /* text.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = text.hpp; sourceTree = ""; }; + B559998F0EC62181008DD061 /* text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = text.cpp; sourceTree = ""; }; B55999900EC62181008DD061 /* translation.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = translation.hpp; sourceTree = ""; }; B55999910EC62181008DD061 /* translation.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = translation.cpp; sourceTree = ""; }; B55999920EC62181008DD061 /* filter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = filter.hpp; sourceTree = ""; }; B55999930EC62181008DD061 /* filter.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filter.cpp; sourceTree = ""; }; B55999940EC62181008DD061 /* terrain.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = terrain.hpp; sourceTree = ""; }; B55999950EC62181008DD061 /* terrain.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = terrain.cpp; sourceTree = ""; }; - B55999960EC62181008DD061 /* team.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = team.hpp; path = ../src/team.hpp; sourceTree = ""; }; - B55999970EC62181008DD061 /* team.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = team.cpp; path = ../src/team.cpp; sourceTree = ""; }; - B55999980EC62181008DD061 /* statistics_dialog.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = statistics_dialog.hpp; path = ../src/statistics_dialog.hpp; sourceTree = ""; }; - B55999990EC62181008DD061 /* statistics_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = statistics_dialog.cpp; path = ../src/statistics_dialog.cpp; sourceTree = ""; }; - B559999A0EC62181008DD061 /* statistics.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = statistics.hpp; path = ../src/statistics.hpp; sourceTree = ""; }; - B559999B0EC62181008DD061 /* statistics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = statistics.cpp; path = ../src/statistics.cpp; sourceTree = ""; }; - B559999C0EC62181008DD061 /* soundsource.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = soundsource.hpp; path = ../src/soundsource.hpp; sourceTree = ""; }; - B559999D0EC62181008DD061 /* soundsource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = soundsource.cpp; path = ../src/soundsource.cpp; sourceTree = ""; }; - B559999E0EC62181008DD061 /* sound.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = sound.hpp; path = ../src/sound.hpp; sourceTree = ""; }; - B559999F0EC62181008DD061 /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = sound.cpp; path = ../src/sound.cpp; sourceTree = ""; }; - B55999A00EC62181008DD061 /* show_dialog.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = show_dialog.hpp; path = ../src/show_dialog.hpp; sourceTree = ""; }; - B55999A10EC62181008DD061 /* show_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = show_dialog.cpp; path = ../src/show_dialog.cpp; sourceTree = ""; }; - B55999A40EC62181008DD061 /* settings.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = settings.hpp; path = ../src/settings.hpp; sourceTree = ""; }; - B55999A50EC62181008DD061 /* settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = settings.cpp; path = ../src/settings.cpp; sourceTree = ""; }; + B55999960EC62181008DD061 /* team.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = team.hpp; sourceTree = ""; }; + B55999970EC62181008DD061 /* team.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = team.cpp; sourceTree = ""; }; + B55999980EC62181008DD061 /* statistics_dialog.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = statistics_dialog.hpp; sourceTree = ""; }; + B55999990EC62181008DD061 /* statistics_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = statistics_dialog.cpp; sourceTree = ""; }; + B559999A0EC62181008DD061 /* statistics.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = statistics.hpp; sourceTree = ""; }; + B559999B0EC62181008DD061 /* statistics.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = statistics.cpp; sourceTree = ""; }; + B559999C0EC62181008DD061 /* soundsource.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = soundsource.hpp; sourceTree = ""; }; + B559999D0EC62181008DD061 /* soundsource.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = soundsource.cpp; sourceTree = ""; }; + B559999E0EC62181008DD061 /* sound.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = sound.hpp; sourceTree = ""; }; + B559999F0EC62181008DD061 /* sound.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = sound.cpp; sourceTree = ""; }; + B55999A00EC62181008DD061 /* show_dialog.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = show_dialog.hpp; sourceTree = ""; }; + B55999A10EC62181008DD061 /* show_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = show_dialog.cpp; sourceTree = ""; }; + B55999A40EC62181008DD061 /* settings.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = settings.hpp; sourceTree = ""; }; + B55999A50EC62181008DD061 /* settings.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = settings.cpp; sourceTree = ""; }; B55999A70EC62181008DD061 /* binary_or_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = binary_or_text.cpp; sourceTree = ""; }; B55999A80EC62181008DD061 /* binary_or_text.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = binary_or_text.hpp; sourceTree = ""; }; B55999AB0EC62181008DD061 /* parser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = parser.cpp; sourceTree = ""; }; @@ -1622,46 +1940,46 @@ B55999B00EC62181008DD061 /* string_utils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = string_utils.hpp; sourceTree = ""; }; B55999B10EC62181008DD061 /* tokenizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tokenizer.cpp; sourceTree = ""; }; B55999B20EC62181008DD061 /* tokenizer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tokenizer.hpp; sourceTree = ""; }; - B55999B50EC62181008DD061 /* scoped_resource.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = scoped_resource.hpp; path = ../src/scoped_resource.hpp; sourceTree = ""; }; - B55999B60EC62181008DD061 /* reports.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = reports.hpp; path = ../src/reports.hpp; sourceTree = ""; }; - B55999B70EC62181008DD061 /* reports.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = reports.cpp; path = ../src/reports.cpp; sourceTree = ""; }; - B55999B80EC62181008DD061 /* replay_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = replay_controller.hpp; path = ../src/replay_controller.hpp; sourceTree = ""; }; - B55999B90EC62181008DD061 /* replay_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = replay_controller.cpp; path = ../src/replay_controller.cpp; sourceTree = ""; }; - B55999BA0EC62181008DD061 /* replay.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = replay.hpp; path = ../src/replay.hpp; sourceTree = ""; }; - B55999BB0EC62181008DD061 /* replay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = replay.cpp; path = ../src/replay.cpp; sourceTree = ""; }; - B55999BC0EC62181008DD061 /* reference_counted_object.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = reference_counted_object.hpp; path = ../src/reference_counted_object.hpp; sourceTree = ""; }; - B55999BF0EC62181008DD061 /* race.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = race.hpp; path = ../src/race.hpp; sourceTree = ""; }; - B55999C00EC62181008DD061 /* race.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = race.cpp; path = ../src/race.cpp; sourceTree = ""; }; - B55999C10EC62181008DD061 /* preferences_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = preferences_display.hpp; path = ../src/preferences_display.hpp; sourceTree = ""; }; - B55999C20EC62181008DD061 /* preferences_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = preferences_display.cpp; path = ../src/preferences_display.cpp; sourceTree = ""; }; - B55999C30EC62181008DD061 /* preferences.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = preferences.hpp; path = ../src/preferences.hpp; sourceTree = ""; }; - B55999C40EC62181008DD061 /* preferences.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = preferences.cpp; path = ../src/preferences.cpp; sourceTree = ""; }; - B55999C70EC62181008DD061 /* playturn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = playturn.hpp; path = ../src/playturn.hpp; sourceTree = ""; }; - B55999C80EC62181008DD061 /* playturn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playturn.cpp; path = ../src/playturn.cpp; sourceTree = ""; }; - B55999C90EC62181008DD061 /* playsingle_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = playsingle_controller.hpp; path = ../src/playsingle_controller.hpp; sourceTree = ""; }; - B55999CA0EC62181008DD061 /* playsingle_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playsingle_controller.cpp; path = ../src/playsingle_controller.cpp; sourceTree = ""; }; - B55999CB0EC62181008DD061 /* playmp_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = playmp_controller.hpp; path = ../src/playmp_controller.hpp; sourceTree = ""; }; - B55999CC0EC62181008DD061 /* playmp_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = playmp_controller.cpp; path = ../src/playmp_controller.cpp; sourceTree = ""; }; - B55999CF0EC62181008DD061 /* play_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = play_controller.hpp; path = ../src/play_controller.hpp; sourceTree = ""; }; - B55999D00EC62181008DD061 /* play_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = play_controller.cpp; path = ../src/play_controller.cpp; sourceTree = ""; }; - B55999D10EC62181008DD061 /* pathutils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = pathutils.hpp; path = ../src/pathutils.hpp; sourceTree = ""; }; - B55999D20EC62181008DD061 /* pathutils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = pathutils.cpp; path = ../src/pathutils.cpp; sourceTree = ""; }; - B55999D50EC62181008DD061 /* network_worker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = network_worker.hpp; path = ../src/network_worker.hpp; sourceTree = ""; }; - B55999D60EC62181008DD061 /* network_worker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = network_worker.cpp; path = ../src/network_worker.cpp; sourceTree = ""; }; - B55999D90EC62181008DD061 /* network.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = network.hpp; path = ../src/network.hpp; sourceTree = ""; }; - B55999DA0EC62181008DD061 /* network.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = network.cpp; path = ../src/network.cpp; sourceTree = ""; }; - B55999E70EC62181008DD061 /* mouse_handler_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = mouse_handler_base.hpp; path = ../src/mouse_handler_base.hpp; sourceTree = ""; }; - B55999E80EC62181008DD061 /* mouse_handler_base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mouse_handler_base.cpp; path = ../src/mouse_handler_base.cpp; sourceTree = ""; }; - B55999E90EC62181008DD061 /* mouse_events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = mouse_events.hpp; path = ../src/mouse_events.hpp; sourceTree = ""; }; - B55999EA0EC62181008DD061 /* mouse_events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = mouse_events.cpp; path = ../src/mouse_events.cpp; sourceTree = ""; }; - B55999EB0EC62181008DD061 /* minimap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = minimap.hpp; path = ../src/minimap.hpp; sourceTree = ""; }; - B55999EC0EC62181008DD061 /* minimap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = minimap.cpp; path = ../src/minimap.cpp; sourceTree = ""; }; - B55999ED0EC62181008DD061 /* menu_events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = menu_events.hpp; path = ../src/menu_events.hpp; sourceTree = ""; }; - B55999EE0EC62181008DD061 /* menu_events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = menu_events.cpp; path = ../src/menu_events.cpp; sourceTree = ""; }; - B55999EF0EC62181008DD061 /* md5.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = md5.hpp; path = ../src/md5.hpp; sourceTree = ""; }; - B55999F00EC62181008DD061 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = md5.cpp; path = ../src/md5.cpp; sourceTree = ""; }; - B55999F10EC62181008DD061 /* marked-up_text.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = "marked-up_text.hpp"; path = "../src/marked-up_text.hpp"; sourceTree = ""; }; - B55999F20EC62181008DD061 /* marked-up_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "marked-up_text.cpp"; path = "../src/marked-up_text.cpp"; sourceTree = ""; }; + B55999B50EC62181008DD061 /* scoped_resource.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = scoped_resource.hpp; sourceTree = ""; }; + B55999B60EC62181008DD061 /* reports.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = reports.hpp; sourceTree = ""; }; + B55999B70EC62181008DD061 /* reports.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = reports.cpp; sourceTree = ""; }; + B55999B80EC62181008DD061 /* replay_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = replay_controller.hpp; sourceTree = ""; }; + B55999B90EC62181008DD061 /* replay_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = replay_controller.cpp; sourceTree = ""; }; + B55999BA0EC62181008DD061 /* replay.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = replay.hpp; sourceTree = ""; }; + B55999BB0EC62181008DD061 /* replay.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = replay.cpp; sourceTree = ""; }; + B55999BC0EC62181008DD061 /* reference_counted_object.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = reference_counted_object.hpp; sourceTree = ""; }; + B55999BF0EC62181008DD061 /* race.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = race.hpp; sourceTree = ""; }; + B55999C00EC62181008DD061 /* race.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = race.cpp; sourceTree = ""; }; + B55999C10EC62181008DD061 /* preferences_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = preferences_display.hpp; sourceTree = ""; }; + B55999C20EC62181008DD061 /* preferences_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = preferences_display.cpp; sourceTree = ""; }; + B55999C30EC62181008DD061 /* preferences.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = preferences.hpp; sourceTree = ""; }; + B55999C40EC62181008DD061 /* preferences.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = preferences.cpp; sourceTree = ""; }; + B55999C70EC62181008DD061 /* playturn.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = playturn.hpp; sourceTree = ""; }; + B55999C80EC62181008DD061 /* playturn.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = playturn.cpp; sourceTree = ""; }; + B55999C90EC62181008DD061 /* playsingle_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = playsingle_controller.hpp; sourceTree = ""; }; + B55999CA0EC62181008DD061 /* playsingle_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = playsingle_controller.cpp; sourceTree = ""; }; + B55999CB0EC62181008DD061 /* playmp_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = playmp_controller.hpp; sourceTree = ""; }; + B55999CC0EC62181008DD061 /* playmp_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = playmp_controller.cpp; sourceTree = ""; }; + B55999CF0EC62181008DD061 /* play_controller.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = play_controller.hpp; sourceTree = ""; }; + B55999D00EC62181008DD061 /* play_controller.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = play_controller.cpp; sourceTree = ""; }; + B55999D10EC62181008DD061 /* pathutils.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = pathutils.hpp; sourceTree = ""; }; + B55999D20EC62181008DD061 /* pathutils.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = pathutils.cpp; sourceTree = ""; }; + B55999D50EC62181008DD061 /* network_worker.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = network_worker.hpp; sourceTree = ""; }; + B55999D60EC62181008DD061 /* network_worker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network_worker.cpp; sourceTree = ""; }; + B55999D90EC62181008DD061 /* network.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = network.hpp; sourceTree = ""; }; + B55999DA0EC62181008DD061 /* network.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = network.cpp; sourceTree = ""; }; + B55999E70EC62181008DD061 /* mouse_handler_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mouse_handler_base.hpp; sourceTree = ""; }; + B55999E80EC62181008DD061 /* mouse_handler_base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mouse_handler_base.cpp; sourceTree = ""; }; + B55999E90EC62181008DD061 /* mouse_events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = mouse_events.hpp; sourceTree = ""; }; + B55999EA0EC62181008DD061 /* mouse_events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = mouse_events.cpp; sourceTree = ""; }; + B55999EB0EC62181008DD061 /* minimap.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = minimap.hpp; sourceTree = ""; }; + B55999EC0EC62181008DD061 /* minimap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = minimap.cpp; sourceTree = ""; }; + B55999ED0EC62181008DD061 /* menu_events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = menu_events.hpp; sourceTree = ""; }; + B55999EE0EC62181008DD061 /* menu_events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = menu_events.cpp; sourceTree = ""; }; + B55999EF0EC62181008DD061 /* md5.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = md5.hpp; sourceTree = ""; }; + B55999F00EC62181008DD061 /* md5.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = md5.cpp; sourceTree = ""; }; + B55999F10EC62181008DD061 /* marked-up_text.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = "marked-up_text.hpp"; sourceTree = ""; }; + B55999F20EC62181008DD061 /* marked-up_text.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "marked-up_text.cpp"; sourceTree = ""; }; B55999F80EC62181008DD061 /* location.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = location.hpp; sourceTree = ""; }; B55999F90EC62181008DD061 /* location.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = location.cpp; sourceTree = ""; }; B55999FA0EC62181008DD061 /* label.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = label.hpp; sourceTree = ""; }; @@ -1669,28 +1987,28 @@ B55999FC0EC62181008DD061 /* exception.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = exception.hpp; sourceTree = ""; }; B55999FF0EC62181008DD061 /* map.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = map.hpp; sourceTree = ""; }; B5599A000EC62181008DD061 /* map.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map.cpp; sourceTree = ""; }; - B5599A010EC62181008DD061 /* log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = log.hpp; path = ../src/log.hpp; sourceTree = ""; }; - B5599A020EC62181008DD061 /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = log.cpp; path = ../src/log.cpp; sourceTree = ""; }; - B5599A080EC62181008DD061 /* language.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = language.hpp; path = ../src/language.hpp; sourceTree = ""; }; - B5599A090EC62181008DD061 /* language.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = language.cpp; path = ../src/language.cpp; sourceTree = ""; }; - B5599A0A0EC62181008DD061 /* key.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = key.hpp; path = ../src/key.hpp; sourceTree = ""; }; - B5599A0B0EC62181008DD061 /* key.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = key.cpp; path = ../src/key.cpp; sourceTree = ""; }; - B5599A0C0EC62181008DD061 /* intro.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = intro.hpp; path = ../src/intro.hpp; sourceTree = ""; }; - B5599A0D0EC62181008DD061 /* intro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = intro.cpp; path = ../src/intro.cpp; sourceTree = ""; }; - B5599A0E0EC62181008DD061 /* image.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = image.hpp; path = ../src/image.hpp; sourceTree = ""; }; - B5599A0F0EC62181008DD061 /* image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = image.cpp; path = ../src/image.cpp; sourceTree = ""; }; - B5599A140EC62181008DD061 /* halo.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = halo.hpp; path = ../src/halo.hpp; sourceTree = ""; }; - B5599A150EC62181008DD061 /* halo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = halo.cpp; path = ../src/halo.cpp; sourceTree = ""; }; - B5599A6F0EC62181008DD061 /* global.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = global.hpp; path = ../src/global.hpp; sourceTree = ""; }; - B5599A720EC62181008DD061 /* generic_event.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = generic_event.hpp; path = ../src/generic_event.hpp; sourceTree = ""; }; - B5599A730EC62181008DD061 /* generic_event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = generic_event.cpp; path = ../src/generic_event.cpp; sourceTree = ""; }; - B5599A780EC62181008DD061 /* game_preferences.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = game_preferences.hpp; path = ../src/game_preferences.hpp; sourceTree = ""; }; - B5599A790EC62181008DD061 /* game_preferences.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = game_preferences.cpp; path = ../src/game_preferences.cpp; sourceTree = ""; }; - B5599A7C0EC62181008DD061 /* game_errors.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = game_errors.hpp; path = ../src/game_errors.hpp; sourceTree = ""; }; - B5599A7D0EC62181008DD061 /* game_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = game_display.hpp; path = ../src/game_display.hpp; sourceTree = ""; }; - B5599A7E0EC62181008DD061 /* game_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = game_display.cpp; path = ../src/game_display.cpp; sourceTree = ""; }; - B5599A7F0EC62181008DD061 /* game_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = game_config.hpp; path = ../src/game_config.hpp; sourceTree = ""; }; - B5599A800EC62181008DD061 /* game_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = game_config.cpp; path = ../src/game_config.cpp; sourceTree = ""; }; + B5599A010EC62181008DD061 /* log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = log.hpp; sourceTree = ""; }; + B5599A020EC62181008DD061 /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = log.cpp; sourceTree = ""; }; + B5599A080EC62181008DD061 /* language.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = language.hpp; sourceTree = ""; }; + B5599A090EC62181008DD061 /* language.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = language.cpp; sourceTree = ""; }; + B5599A0A0EC62181008DD061 /* key.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = key.hpp; sourceTree = ""; }; + B5599A0B0EC62181008DD061 /* key.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = key.cpp; sourceTree = ""; }; + B5599A0C0EC62181008DD061 /* intro.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = intro.hpp; sourceTree = ""; }; + B5599A0D0EC62181008DD061 /* intro.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = intro.cpp; sourceTree = ""; }; + B5599A0E0EC62181008DD061 /* image.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = image.hpp; sourceTree = ""; }; + B5599A0F0EC62181008DD061 /* image.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = image.cpp; sourceTree = ""; }; + B5599A140EC62181008DD061 /* halo.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = halo.hpp; sourceTree = ""; }; + B5599A150EC62181008DD061 /* halo.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = halo.cpp; sourceTree = ""; }; + B5599A6F0EC62181008DD061 /* global.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = global.hpp; sourceTree = ""; }; + B5599A720EC62181008DD061 /* generic_event.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = generic_event.hpp; sourceTree = ""; }; + B5599A730EC62181008DD061 /* generic_event.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generic_event.cpp; sourceTree = ""; }; + B5599A780EC62181008DD061 /* game_preferences.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = game_preferences.hpp; sourceTree = ""; }; + B5599A790EC62181008DD061 /* game_preferences.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game_preferences.cpp; sourceTree = ""; }; + B5599A7C0EC62181008DD061 /* game_errors.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = game_errors.hpp; sourceTree = ""; }; + B5599A7D0EC62181008DD061 /* game_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = game_display.hpp; sourceTree = ""; }; + B5599A7E0EC62181008DD061 /* game_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game_display.cpp; sourceTree = ""; }; + B5599A7F0EC62181008DD061 /* game_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = game_config.hpp; sourceTree = ""; }; + B5599A800EC62181008DD061 /* game_config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game_config.cpp; sourceTree = ""; }; B5599A820EC62181008DD061 /* tokenizer.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tokenizer.hpp; sourceTree = ""; }; B5599A830EC62181008DD061 /* tokenizer.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tokenizer.cpp; sourceTree = ""; }; B5599A840EC62181008DD061 /* formula_fwd.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = formula_fwd.hpp; sourceTree = ""; }; @@ -1700,43 +2018,43 @@ B5599A880EC62181008DD061 /* callable.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = callable.hpp; sourceTree = ""; }; B5599A8B0EC62181008DD061 /* formula.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = formula.hpp; sourceTree = ""; }; B5599A8C0EC62181008DD061 /* formula.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = formula.cpp; sourceTree = ""; }; - B5599A8D0EC62181008DD061 /* formatter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = formatter.hpp; path = ../src/formatter.hpp; sourceTree = ""; }; - B5599A8F0EC62181008DD061 /* font.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = font.hpp; path = ../src/font.hpp; sourceTree = ""; }; - B5599A900EC62181008DD061 /* font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = font.cpp; path = ../src/font.cpp; sourceTree = ""; }; - B5599A910EC62181008DD061 /* floating_textbox.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = floating_textbox.hpp; path = ../src/floating_textbox.hpp; sourceTree = ""; }; - B5599A920EC62181008DD061 /* floating_textbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = floating_textbox.cpp; path = ../src/floating_textbox.cpp; sourceTree = ""; }; - B5599A950EC62181008DD061 /* filechooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = filechooser.cpp; path = ../src/filechooser.cpp; sourceTree = ""; }; - B5599A960EC62181008DD061 /* events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = events.hpp; path = ../src/events.hpp; sourceTree = ""; }; - B5599A970EC62181008DD061 /* events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = events.cpp; path = ../src/events.cpp; sourceTree = ""; }; - B5599A980EC62181008DD061 /* display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = display.hpp; path = ../src/display.hpp; sourceTree = ""; }; - B5599A990EC62181008DD061 /* display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = display.cpp; path = ../src/display.cpp; sourceTree = ""; }; - B5599A9A0EC62181008DD061 /* dialogs.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = dialogs.hpp; path = ../src/dialogs.hpp; sourceTree = ""; }; - B5599A9B0EC62181008DD061 /* dialogs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = dialogs.cpp; path = ../src/dialogs.cpp; sourceTree = ""; }; - B5599A9C0EC62181008DD061 /* cursor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = cursor.hpp; path = ../src/cursor.hpp; sourceTree = ""; }; - B5599A9D0EC62181008DD061 /* cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = cursor.cpp; path = ../src/cursor.cpp; sourceTree = ""; }; - B5599A9F0EC62181008DD061 /* controller_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = controller_base.hpp; path = ../src/controller_base.hpp; sourceTree = ""; }; - B5599AA00EC62181008DD061 /* controller_base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = controller_base.cpp; path = ../src/controller_base.cpp; sourceTree = ""; }; - B5599AA10EC62181008DD061 /* construct_dialog.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = construct_dialog.hpp; path = ../src/construct_dialog.hpp; sourceTree = ""; }; - B5599AA20EC62181008DD061 /* construct_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = construct_dialog.cpp; path = ../src/construct_dialog.cpp; sourceTree = ""; }; - B5599AA30EC62181008DD061 /* config_cache.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = config_cache.hpp; path = ../src/config_cache.hpp; sourceTree = ""; }; - B5599AA40EC62181008DD061 /* config_cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = config_cache.cpp; path = ../src/config_cache.cpp; sourceTree = ""; }; - B5599AA70EC62181008DD061 /* config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = config.hpp; path = ../src/config.hpp; sourceTree = ""; }; - B5599AA80EC62181008DD061 /* config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = config.cpp; path = ../src/config.cpp; sourceTree = ""; }; - B5599AA90EC62181008DD061 /* color_range.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = color_range.hpp; path = ../src/color_range.hpp; sourceTree = ""; }; - B5599AAA0EC62181008DD061 /* color_range.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = color_range.cpp; path = ../src/color_range.cpp; sourceTree = ""; }; + B5599A8D0EC62181008DD061 /* formatter.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = formatter.hpp; sourceTree = ""; }; + B5599A8F0EC62181008DD061 /* font.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = font.hpp; sourceTree = ""; }; + B5599A900EC62181008DD061 /* font.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = font.cpp; sourceTree = ""; }; + B5599A910EC62181008DD061 /* floating_textbox.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = floating_textbox.hpp; sourceTree = ""; }; + B5599A920EC62181008DD061 /* floating_textbox.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = floating_textbox.cpp; sourceTree = ""; }; + B5599A950EC62181008DD061 /* filechooser.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = filechooser.cpp; sourceTree = ""; }; + B5599A960EC62181008DD061 /* events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = events.hpp; sourceTree = ""; }; + B5599A970EC62181008DD061 /* events.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = events.cpp; sourceTree = ""; }; + B5599A980EC62181008DD061 /* display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = display.hpp; sourceTree = ""; }; + B5599A990EC62181008DD061 /* display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = display.cpp; sourceTree = ""; }; + B5599A9A0EC62181008DD061 /* dialogs.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = dialogs.hpp; sourceTree = ""; }; + B5599A9B0EC62181008DD061 /* dialogs.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = dialogs.cpp; sourceTree = ""; }; + B5599A9C0EC62181008DD061 /* cursor.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = cursor.hpp; sourceTree = ""; }; + B5599A9D0EC62181008DD061 /* cursor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = cursor.cpp; sourceTree = ""; }; + B5599A9F0EC62181008DD061 /* controller_base.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = controller_base.hpp; sourceTree = ""; }; + B5599AA00EC62181008DD061 /* controller_base.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = controller_base.cpp; sourceTree = ""; }; + B5599AA10EC62181008DD061 /* construct_dialog.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = construct_dialog.hpp; sourceTree = ""; }; + B5599AA20EC62181008DD061 /* construct_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = construct_dialog.cpp; sourceTree = ""; }; + B5599AA30EC62181008DD061 /* config_cache.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = config_cache.hpp; sourceTree = ""; }; + B5599AA40EC62181008DD061 /* config_cache.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = config_cache.cpp; sourceTree = ""; }; + B5599AA70EC62181008DD061 /* config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = config.hpp; sourceTree = ""; }; + B5599AA80EC62181008DD061 /* config.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = config.cpp; sourceTree = ""; }; + B5599AA90EC62181008DD061 /* color_range.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = color_range.hpp; sourceTree = ""; }; + B5599AAA0EC62181008DD061 /* color_range.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = color_range.cpp; sourceTree = ""; }; B5599AAF0EC62181008DD061 /* callable_objects.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = callable_objects.hpp; sourceTree = ""; }; B5599AB00EC62181008DD061 /* callable_objects.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = callable_objects.cpp; sourceTree = ""; }; - B5599AB20EC62181008DD061 /* filechooser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = filechooser.hpp; path = ../src/filechooser.hpp; sourceTree = ""; }; - B5599AB40EC62181008DD061 /* array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = array.hpp; path = ../src/array.hpp; sourceTree = ""; }; + B5599AB20EC62181008DD061 /* filechooser.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = filechooser.hpp; sourceTree = ""; }; + B5599AB40EC62181008DD061 /* array.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = array.hpp; sourceTree = ""; }; B5599AB50EC62181008DD061 /* animated_game.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = animated_game.cpp; sourceTree = ""; }; - B5599AB70EC62181008DD061 /* animated.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = animated.hpp; path = ../src/animated.hpp; sourceTree = ""; }; - B5599ABC0EC62181008DD061 /* about.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = about.hpp; path = ../src/about.hpp; sourceTree = ""; }; - B5599AC60EC62181008DD061 /* about.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = about.cpp; path = ../src/about.cpp; sourceTree = ""; }; - B5599AC80EC62181008DD061 /* boilerplate-header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = "boilerplate-header.cpp"; path = "../src/boilerplate-header.cpp"; sourceTree = ""; }; - B5599AC90EC62181008DD061 /* attack_prediction_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = attack_prediction_display.hpp; path = ../src/attack_prediction_display.hpp; sourceTree = ""; }; - B5599ACA0EC62181008DD061 /* attack_prediction_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = attack_prediction_display.cpp; path = ../src/attack_prediction_display.cpp; sourceTree = ""; }; - B5599ACB0EC62181008DD061 /* attack_prediction.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = attack_prediction.hpp; path = ../src/attack_prediction.hpp; sourceTree = ""; }; - B5599AD00EC62181008DD061 /* attack_prediction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = attack_prediction.cpp; path = ../src/attack_prediction.cpp; sourceTree = ""; }; + B5599AB70EC62181008DD061 /* animated.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = animated.hpp; sourceTree = ""; }; + B5599ABC0EC62181008DD061 /* about.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = about.hpp; sourceTree = ""; }; + B5599AC60EC62181008DD061 /* about.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = about.cpp; sourceTree = ""; }; + B5599AC80EC62181008DD061 /* boilerplate-header.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = "boilerplate-header.cpp"; sourceTree = ""; }; + B5599AC90EC62181008DD061 /* attack_prediction_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = attack_prediction_display.hpp; sourceTree = ""; }; + B5599ACA0EC62181008DD061 /* attack_prediction_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = attack_prediction_display.cpp; sourceTree = ""; }; + B5599ACB0EC62181008DD061 /* attack_prediction.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = attack_prediction.hpp; sourceTree = ""; }; + B5599AD00EC62181008DD061 /* attack_prediction.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = attack_prediction.cpp; sourceTree = ""; }; B5599E9B0EC68BF2008DD061 /* SDL2_ttf.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = SDL2_ttf.framework; path = lib/SDL2_ttf.framework; sourceTree = ""; }; B5599FC90EC8FBCB008DD061 /* libfreetype.6.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libfreetype.6.dylib; path = lib/libfreetype.6.dylib; sourceTree = ""; }; B5599FFC0EC8FE2E008DD061 /* editor_common.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = editor_common.hpp; sourceTree = ""; }; @@ -1781,11 +2099,11 @@ B5795A670F05858100EB190E /* generator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = generator.cpp; sourceTree = ""; }; B59271F910E9577800A13911 /* repeating_button.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = repeating_button.cpp; sourceTree = ""; }; B59271FA10E9577800A13911 /* repeating_button.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = repeating_button.hpp; sourceTree = ""; }; - B5951A811013BB0800C10B66 /* chat_events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = chat_events.hpp; path = ../src/chat_events.hpp; sourceTree = ""; }; - B5951A831013BB0800C10B66 /* multiplayer_error_codes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = multiplayer_error_codes.hpp; path = ../src/multiplayer_error_codes.hpp; sourceTree = ""; }; - B5951A841013BB0800C10B66 /* resources.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = resources.cpp; path = ../src/resources.cpp; sourceTree = ""; }; - B5951A851013BB0800C10B66 /* resources.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = resources.hpp; path = ../src/resources.hpp; sourceTree = ""; }; - B5951A871013BB0800C10B66 /* savegame_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = savegame_config.hpp; path = ../src/savegame_config.hpp; sourceTree = ""; }; + B5951A811013BB0800C10B66 /* chat_events.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = chat_events.hpp; sourceTree = ""; }; + B5951A831013BB0800C10B66 /* multiplayer_error_codes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = multiplayer_error_codes.hpp; sourceTree = ""; }; + B5951A841013BB0800C10B66 /* resources.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resources.cpp; sourceTree = ""; }; + B5951A851013BB0800C10B66 /* resources.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = resources.hpp; sourceTree = ""; }; + B5951A871013BB0800C10B66 /* savegame_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = savegame_config.hpp; sourceTree = ""; }; B5951A931013BB3400C10B66 /* game_delete.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game_delete.cpp; sourceTree = ""; }; B5951A941013BB3400C10B66 /* game_delete.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = game_delete.hpp; sourceTree = ""; }; B5951A971013BB5A00C10B66 /* callable_objects.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = callable_objects.cpp; sourceTree = ""; }; @@ -1805,7 +2123,6 @@ B597C4AC0FACD42E00CE81F5 /* test_network_worker.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_network_worker.cpp; sourceTree = ""; }; B597C4AD0FACD42E00CE81F5 /* test_lexical_cast.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_lexical_cast.cpp; sourceTree = ""; }; B597C4BE0FACD43B00CE81F5 /* auto_parameterized.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = auto_parameterized.hpp; sourceTree = ""; }; - B597C4BF0FACD43B00CE81F5 /* boost_unit_test_suite_1_34_0.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = boost_unit_test_suite_1_34_0.hpp; sourceTree = ""; }; B597C4C00FACD43B00CE81F5 /* fake_display.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fake_display.cpp; sourceTree = ""; }; B597C4C10FACD43B00CE81F5 /* fake_display.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = fake_display.hpp; sourceTree = ""; }; B597C4C20FACD43B00CE81F5 /* fake_event_source.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = fake_event_source.cpp; sourceTree = ""; }; @@ -1815,7 +2132,6 @@ B597C4C60FACD43B00CE81F5 /* play_scenario.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = play_scenario.cpp; sourceTree = ""; }; B597C4C70FACD43B00CE81F5 /* play_scenario.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = play_scenario.hpp; sourceTree = ""; }; B597C4C80FACD43B00CE81F5 /* predicate.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = predicate.hpp; sourceTree = ""; }; - B597C4C90FACD43B00CE81F5 /* test_support.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = test_support.hpp; sourceTree = ""; }; B597C4CE0FACD43B00CE81F5 /* test_drop_target.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_drop_target.cpp; sourceTree = ""; }; B597C4CF0FACD43B00CE81F5 /* test_save_dialog.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = test_save_dialog.cpp; sourceTree = ""; }; B597EBDB0FC082AB00CE81F5 /* contexts.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = contexts.cpp; sourceTree = ""; }; @@ -2385,6 +2701,19 @@ B597C5290FACD58400CE81F5 /* SDL2_net.framework in Frameworks */, B597C5270FACD58400CE81F5 /* SDL2_ttf.framework in Frameworks */, B597C5260FACD58400CE81F5 /* SDL2.framework in Frameworks */, + 91E355631CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib in Frameworks */, + 91A215281CAD699200927AEA /* libfontconfig.1.dylib in Frameworks */, + 91A215DB1CAD970800927AEA /* libboost_program_optionsw.dylib in Frameworks */, + 91A215DC1CAD970800927AEA /* libboost_regexw.dylib in Frameworks */, + 91A215DD1CAD971800927AEA /* libboost_localew.dylib in Frameworks */, + 91A215DE1CAD99E000927AEA /* libboost_filesystemw.dylib in Frameworks */, + 91A215DF1CAD99E000927AEA /* libboost_iostreamsw.dylib in Frameworks */, + 91A215E01CAD99E000927AEA /* libboost_systemw.dylib in Frameworks */, + 91A215E11CAD99E000927AEA /* libboost_threadw.dylib in Frameworks */, + 91A215E21CAD9B9000927AEA /* libpango-1.0.0.dylib in Frameworks */, + 91A215E31CAD9B9000927AEA /* libpangocairo-1.0.0.dylib in Frameworks */, + 916718EB1CADA88800B055A9 /* libgobject-2.0.0.dylib in Frameworks */, + 916719071CADAC0D00B055A9 /* libboost_randomw.dylib in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -2571,6 +2900,7 @@ 62CC8E7917B9064B00C16B75 /* generators */, B5599A730EC62181008DD061 /* generic_event.cpp */, B5599A720EC62181008DD061 /* generic_event.hpp */, + 91A214E41CAD618700927AEA /* gettext.hpp */, EC4DF45419FEA7A8000EC086 /* gettext_boost.cpp */, B5599A6F0EC62181008DD061 /* global.hpp */, B5A9BCA10ECA805A002BE442 /* gui */, @@ -2806,6 +3136,7 @@ F4EF0D5313AD4E35003C701D /* libboost_regexw.dylib */, F4EF0D5413AD4E35003C701D /* libboost_systemw.dylib */, F4EF0D5B13AD4E6D003C701D /* libboost_threadw.dylib */, + 91E355621CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib */, EC5C242218EF07B4001FA499 /* libbz2.1.0.dylib */, B513B2270ED36BFB0006E551 /* libcairo.2.dylib */, EC5C242318EF07B4001FA499 /* libexpat.1.dylib */, @@ -3484,14 +3815,14 @@ B54AC6B30FEA9EB5006F6FBD /* attack.cpp */, B54AC6C10FEA9EB5006F6FBD /* ca.cpp */, B54AC6C20FEA9EB5006F6FBD /* ca.hpp */, + B552D92A108694BB002D8F86 /* ca_move_to_targets.cpp */, + B552D92B108694BB002D8F86 /* ca_move_to_targets.hpp */, B54AC6B40FEA9EB5006F6FBD /* contexts.cpp */, B54AC6B50FEA9EB5006F6FBD /* contexts.hpp */, B54AC6AA0FEA9EB5006F6FBD /* engine_cpp.cpp */, B54AC6AB0FEA9EB5006F6FBD /* engine_cpp.hpp */, EC48D74B17F3148300DE80BF /* recruitment.cpp */, EC48D74C17F3148300DE80BF /* recruitment.hpp */, - B552D92A108694BB002D8F86 /* ca_move_to_targets.cpp */, - B552D92B108694BB002D8F86 /* ca_move_to_targets.hpp */, B54AC6C50FEA9EB5006F6FBD /* stage_rca.cpp */, B54AC6C60FEA9EB5006F6FBD /* stage_rca.hpp */, ); @@ -3646,17 +3977,34 @@ B597C49D0FACD3F900CE81F5 /* tests */ = { isa = PBXGroup; children = ( + 91E356081CACA6CB00774252 /* floating_point_emulation.cpp */, B597C4CA0FACD43B00CE81F5 /* gui */, B597C4A90FACD42E00CE81F5 /* main.cpp */, + 91E356091CACA6CB00774252 /* test_addons.cpp */, + 91E3560A1CACA6CB00774252 /* test_commandline_options.cpp */, + 91E3560B1CACA6CB00774252 /* test_config.cpp */, B597C4A80FACD42E00CE81F5 /* test_config_cache.cpp */, + 91E3560C1CACA6CB00774252 /* test_filesystem.cpp */, B597C4A70FACD42E00CE81F5 /* test_formula_ai.cpp */, 91DCA68F1C9360610030F8D0 /* test_formula_core.cpp */, + 91E3560D1CACA6CB00774252 /* test_formula_function.cpp */, + 91E3560E1CACA6CB00774252 /* test_image_modifications.cpp */, B597C4AD0FACD42E00CE81F5 /* test_lexical_cast.cpp */, + 91E3560F1CACA6CB00774252 /* test_lua.cpp */, + 91E356101CACA6CB00774252 /* test_make_enum.cpp */, + 91E356111CACA6CB00774252 /* test_map_location.cpp */, + 91E356121CACA6CB00774252 /* test_mp_connect.cpp */, B597C4AC0FACD42E00CE81F5 /* test_network_worker.cpp */, + 91E356131CACA6CB00774252 /* test_recall_list.cpp */, + 91E356141CACA6CB00774252 /* test_rng.cpp */, + 91E356151CACA6CB00774252 /* test_sdl_utils.cpp */, + 91E356161CACA6CB00774252 /* test_sdl_utils.hpp */, B597C4AA0FACD42E00CE81F5 /* test_serialization.cpp */, B597C4A60FACD42E00CE81F5 /* test_team.cpp */, + 91E356171CACA6CB00774252 /* test_unit_map.cpp */, B597C4A50FACD42E00CE81F5 /* test_util.cpp */, B597C4A40FACD42E00CE81F5 /* test_version.cpp */, + 91E356181CACA6CB00774252 /* test_whiteboard_side_actions.cpp */, B597C4B80FACD43B00CE81F5 /* utils */, ); name = tests; @@ -3666,9 +4014,7 @@ B597C4B80FACD43B00CE81F5 /* utils */ = { isa = PBXGroup; children = ( - B597C4B90FACD43B00CE81F5 /* .deps */, B597C4BE0FACD43B00CE81F5 /* auto_parameterized.hpp */, - B597C4BF0FACD43B00CE81F5 /* boost_unit_test_suite_1_34_0.hpp */, B597C4C00FACD43B00CE81F5 /* fake_display.cpp */, B597C4C10FACD43B00CE81F5 /* fake_display.hpp */, B597C4C20FACD43B00CE81F5 /* fake_event_source.cpp */, @@ -3678,35 +4024,23 @@ B597C4C60FACD43B00CE81F5 /* play_scenario.cpp */, B597C4C70FACD43B00CE81F5 /* play_scenario.hpp */, B597C4C80FACD43B00CE81F5 /* predicate.hpp */, - B597C4C90FACD43B00CE81F5 /* test_support.hpp */, ); path = utils; sourceTree = ""; }; - B597C4B90FACD43B00CE81F5 /* .deps */ = { - isa = PBXGroup; - children = ( - ); - path = .deps; - sourceTree = ""; - }; B597C4CA0FACD43B00CE81F5 /* gui */ = { isa = PBXGroup; children = ( - B597C4CB0FACD43B00CE81F5 /* .deps */, + 91E3562A1CACA6E600774252 /* fire_event.cpp */, + 91E3562B1CACA6E600774252 /* iterator.cpp */, B597C4CE0FACD43B00CE81F5 /* test_drop_target.cpp */, + 91E3562C1CACA6E600774252 /* test_gui2.cpp */, B597C4CF0FACD43B00CE81F5 /* test_save_dialog.cpp */, + 91E3562D1CACA6E600774252 /* visitor.cpp */, ); path = gui; sourceTree = ""; }; - B597C4CB0FACD43B00CE81F5 /* .deps */ = { - isa = PBXGroup; - children = ( - ); - path = .deps; - sourceTree = ""; - }; B597EBCA0FC082AB00CE81F5 /* ai */ = { isa = PBXGroup; children = ( @@ -4841,280 +5175,561 @@ isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - B597C5820FACD6CA00CE81F5 /* about.cpp in Sources */, - B52EE92012135AC300CFBDAB /* action.cpp in Sources */, - B54AC6970FEA9E8F006F6FBD /* actions.cpp in Sources */, - B597C5B70FACD6CA00CE81F5 /* connect.cpp in Sources */, - B597C5C00FACD6CA00CE81F5 /* list.cpp in Sources */, - B54AC6C70FEA9EB5006F6FBD /* ai.cpp in Sources */, - B54AC6D30FEA9EB5006F6FBD /* ai.cpp in Sources */, - B597C5AD0FACD6CA00CE81F5 /* animated_game.cpp in Sources */, - B52EE8DF121359A600CFBDAB /* arrow.cpp in Sources */, - B59F96E81034791200A57C1A /* aspect_attacks.cpp in Sources */, - B59F96D7103478C900A57C1A /* aspect.cpp in Sources */, - B55BE03511234AAB00154E6C /* astarsearch.cpp in Sources */, - B597C5AE0FACD6CA00CE81F5 /* attack_prediction_display.cpp in Sources */, - B597C5F60FACD6CA00CE81F5 /* attack_prediction.cpp in Sources */, - B54AC6CE0FEA9EB5006F6FBD /* attack.cpp in Sources */, - B52EE92112135AC300CFBDAB /* attack.cpp in Sources */, - B597C5600FACD6CA00CE81F5 /* binary_or_text.cpp in Sources */, - B597C5690FACD6CA00CE81F5 /* button.cpp in Sources */, - B597C65A0FACDDE800CE81F5 /* button.cpp in Sources */, - B552D92F108694BB002D8F86 /* ca_move_to_targets.cpp in Sources */, - B54AC6D50FEA9EB5006F6FBD /* ca.cpp in Sources */, - B597C5310FACD6CA00CE81F5 /* callable_objects.cpp in Sources */, - B5951A9D1013BB5A00C10B66 /* callable_objects.cpp in Sources */, - B5CE470812A041EF00D665EE /* campaign_difficulty.cpp in Sources */, - B597C5B80FACD6CA00CE81F5 /* campaign_selection.cpp in Sources */, - B54AC6D40FEA9EB5006F6FBD /* candidates.cpp in Sources */, - B597EC5D0FC08E0100CE81F5 /* canvas.cpp in Sources */, - B597C59E0FACD6CA00CE81F5 /* color_range.cpp in Sources */, - B597C5E30FACD6CA00CE81F5 /* combo_drag.cpp in Sources */, - B597C5D10FACD6CA00CE81F5 /* combo.cpp in Sources */, - B561F369104B1042001369F5 /* component.cpp in Sources */, - B597C5FE0FACD6CA00CE81F5 /* config_cache.cpp in Sources */, - B597C5450FACD6CA00CE81F5 /* config.cpp in Sources */, - B54AC6980FEA9E8F006F6FBD /* configuration.cpp in Sources */, - B597C5BE0FACD6CA00CE81F5 /* construct_dialog.cpp in Sources */, - B597C5CB0FACD6CA00CE81F5 /* container.cpp in Sources */, - B597EBFC0FC082AB00CE81F5 /* contexts.cpp in Sources */, - B54AC6C80FEA9EB5006F6FBD /* contexts.cpp in Sources */, - B54AC6CF0FEA9EB5006F6FBD /* contexts.cpp in Sources */, - B597C5F30FACD6CA00CE81F5 /* control.cpp in Sources */, - B597C5CD0FACD6CA00CE81F5 /* controller_base.cpp in Sources */, - B597EC180FC0835900CE81F5 /* controller.cpp in Sources */, - B52EE9A7121363EB00CFBDAB /* core.cpp in Sources */, - B597C5340FACD6CA00CE81F5 /* cursor.cpp in Sources */, - B597C57A0FACD6CA00CE81F5 /* debug.cpp in Sources */, - B597C5B30FACD6CA00CE81F5 /* dialog.cpp in Sources */, - B597C5C60FACD6CA00CE81F5 /* dialogs.cpp in Sources */, - B5B4693A107118C400327599 /* dispatcher.cpp in Sources */, - B597C5CC0FACD6CA00CE81F5 /* display.cpp in Sources */, - B552D92510869477002D8F86 /* distributor.cpp in Sources */, - B597C5500FACD6CA00CE81F5 /* drop_target.cpp in Sources */, - B5CE470912A041EF00D665EE /* edit_label.cpp in Sources */, - B597C5410FACD6CA00CE81F5 /* editor_display.cpp in Sources */, - B597C5880FACD6CA00CE81F5 /* generate_map.cpp in Sources */, - B597C59A0FACD6CA00CE81F5 /* editor_main.cpp in Sources */, - B597C5640FACD6CA00CE81F5 /* new_map.cpp in Sources */, - B561F392104B11F7001369F5 /* editor_preferences.cpp in Sources */, - B597C5A80FACD6CA00CE81F5 /* resize_map.cpp in Sources */, - B54AC6CA0FEA9EB5006F6FBD /* engine_cpp.cpp in Sources */, - B508D194100146E300B12852 /* engine_fai.cpp in Sources */, - B55BE04111234AD700154E6C /* engine_lua.cpp in Sources */, - B54AC6C90FEA9EB5006F6FBD /* engine.cpp in Sources */, - B597C5510FACD6CA00CE81F5 /* events.cpp in Sources */, - B597C4D00FACD43B00CE81F5 /* fake_display.cpp in Sources */, - B597C4D10FACD43B00CE81F5 /* fake_event_source.cpp in Sources */, - B597C53F0FACD6CA00CE81F5 /* file_menu.cpp in Sources */, - B597C5DA0FACD6CA00CE81F5 /* filechooser.cpp in Sources */, - B597C54D0FACD6CA00CE81F5 /* floating_textbox.cpp in Sources */, - B597C5750FACD6CA00CE81F5 /* font.cpp in Sources */, - B52EE8E1121359A600CFBDAB /* debugger_fwd.cpp in Sources */, - B561F371104B11B6001369F5 /* formula_debugger.cpp in Sources */, - B52EE8E2121359A600CFBDAB /* debugger.cpp in Sources */, - B597C5B10FACD6CA00CE81F5 /* function.cpp in Sources */, - B52EE8E3121359A600CFBDAB /* string_utils.cpp in Sources */, - B597C5370FACD6CA00CE81F5 /* tokenizer.cpp in Sources */, - B597C5EA0FACD6CA00CE81F5 /* formula.cpp in Sources */, - B5951A9E1013BB5A00C10B66 /* function_table.cpp in Sources */, - B597C4D20FACD43B00CE81F5 /* game_config_manager.cpp in Sources */, - B597C56D0FACD6CA00CE81F5 /* game_config.cpp in Sources */, - B5951A961013BB3400C10B66 /* game_delete.cpp in Sources */, - B597C57F0FACD6CA00CE81F5 /* game_display.cpp in Sources */, - B597EBFF0FC082AB00CE81F5 /* game_info.cpp in Sources */, - B595EFE3100436C900C10B66 /* game_load.cpp in Sources */, - B597C5770FACD6CA00CE81F5 /* game_preferences.cpp in Sources */, - B597EC640FC08E5D00CE81F5 /* game_save.cpp in Sources */, - B5B4692D1071189700327599 /* gamestate_inspector.cpp in Sources */, - B55BE03B11234AC700154E6C /* gamestate_observer.cpp in Sources */, - B597C5330FACD6CA00CE81F5 /* generator.cpp in Sources */, - B597C55F0FACD6CA00CE81F5 /* generic_event.cpp in Sources */, - B59F96D8103478C900A57C1A /* goal.cpp in Sources */, - B597C5400FACD6CA00CE81F5 /* grid.cpp in Sources */, - B597C55B0FACD6CA00CE81F5 /* halo.cpp in Sources */, - B5B4693B107118C400327599 /* handler.cpp in Sources */, - B52EE8E4121359A600CFBDAB /* hash.cpp in Sources */, - B597C55C0FACD6CA00CE81F5 /* helper.cpp in Sources */, - B508D205100155F300B12852 /* helper.cpp in Sources */, - B597C5C20FACD6CA00CE81F5 /* horizontal_scrollbar.cpp in Sources */, - B597C5BC0FACD6CA00CE81F5 /* image.cpp in Sources */, - B597C5BF0FACD6CA00CE81F5 /* image.cpp in Sources */, - B597EC190FC0835900CE81F5 /* interface.cpp in Sources */, - B597C5830FACD6CA00CE81F5 /* intro.cpp in Sources */, - B597C5E10FACD6CA00CE81F5 /* key.cpp in Sources */, - B597C57E0FACD6CA00CE81F5 /* label.cpp in Sources */, - B597C5A50FACD6CA00CE81F5 /* label.cpp in Sources */, - B597C5C30FACD6CA00CE81F5 /* language_selection.cpp in Sources */, - B597C5E20FACD6CA00CE81F5 /* language.cpp in Sources */, - B52EE89F1213590500CFBDAB /* list.cpp in Sources */, - B597C59B0FACD6CA00CE81F5 /* listbox.cpp in Sources */, - B55BE04D11234B1A00154E6C /* data.cpp in Sources */, - B55BE04E11234B1A00154E6C /* info.cpp in Sources */, - B54AC6F30FEA9F92006F6FBD /* lobby.cpp in Sources */, - B59F96EE1034796700A57C1A /* player_info.cpp in Sources */, - B52EE8E6121359A600CFBDAB /* lobby_preferences.cpp in Sources */, - B597C5BB0FACD6CA00CE81F5 /* log.cpp in Sources */, - B597EC5E0FC08E0100CE81F5 /* log.cpp in Sources */, - B597C4B30FACD42E00CE81F5 /* main.cpp in Sources */, - B54AC69A0FEA9E8F006F6FBD /* manager.cpp in Sources */, - B52EE92312135AC300CFBDAB /* manager.cpp in Sources */, - B52EE9AF1213640400CFBDAB /* manager.cpp in Sources */, - B597C5900FACD6CA00CE81F5 /* label.cpp in Sources */, - B597C5980FACD6CA00CE81F5 /* location.cpp in Sources */, - B597C5B90FACD6CA00CE81F5 /* map.cpp in Sources */, - B597C5920FACD6CA00CE81F5 /* marked-up_text.cpp in Sources */, - B597C5C40FACD6CA00CE81F5 /* md5.cpp in Sources */, - B597C5F40FACD6CA00CE81F5 /* menu_events.cpp in Sources */, - B597C5550FACD6CA00CE81F5 /* menu_style.cpp in Sources */, - B597C5590FACD6CA00CE81F5 /* menu.cpp in Sources */, - B597C5650FACD6CA00CE81F5 /* message.cpp in Sources */, - B597C53B0FACD6CA00CE81F5 /* minimap.cpp in Sources */, - B597C5930FACD6CA00CE81F5 /* minimap.cpp in Sources */, - B597C56C0FACD6CA00CE81F5 /* mouse_events.cpp in Sources */, - B597C5580FACD6CA00CE81F5 /* mouse_handler_base.cpp in Sources */, - B52EE92512135AC300CFBDAB /* move.cpp in Sources */, - B597C5800FACD6CA00CE81F5 /* mp_cmd_wrapper.cpp in Sources */, - B597C5A30FACD6CA00CE81F5 /* mp_connect.cpp in Sources */, - B5DBABF412AFF7F200B5B8DC /* mp_create_game_set_password.cpp in Sources */, - B597C5E80FACD6CA00CE81F5 /* mp_create_game.cpp in Sources */, - B5B469251071185800327599 /* mp_game_settings.cpp in Sources */, - B597C5DB0FACD6CA00CE81F5 /* mp_method_selection.cpp in Sources */, - B54AC6FE0FEA9FA5006F6FBD /* multi_page.cpp in Sources */, - B597C55D0FACD6CA00CE81F5 /* network_worker.cpp in Sources */, - B597C5D70FACD6CA00CE81F5 /* network.cpp in Sources */, - B5CE470E12A0422800D665EE /* old_markup.cpp in Sources */, - B597C5EF0FACD6CA00CE81F5 /* panel.cpp in Sources */, - B597C5ED0FACD6CA00CE81F5 /* parser.cpp in Sources */, - B597EC1A0FC0835900CE81F5 /* part.cpp in Sources */, - B597C5610FACD6CA00CE81F5 /* password_box.cpp in Sources */, - B55BE03611234AAB00154E6C /* pathfind.cpp in Sources */, - B597C5F70FACD6CA00CE81F5 /* pathutils.cpp in Sources */, - B52EE8EA121359A600CFBDAB /* persist_context.cpp in Sources */, - B52EE8EB121359A600CFBDAB /* persist_manager.cpp in Sources */, - B52EE8EC121359A600CFBDAB /* persist_var.cpp in Sources */, - B597C5430FACD6CA00CE81F5 /* play_controller.cpp in Sources */, - B597C4D30FACD43B00CE81F5 /* play_scenario.cpp in Sources */, - B54AC6830FEA9C4A006F6FBD /* player_network.cpp in Sources */, - B597C5FC0FACD6CA00CE81F5 /* playmp_controller.cpp in Sources */, - B597C5350FACD6CA00CE81F5 /* playsingle_controller.cpp in Sources */, - B597C53D0FACD6CA00CE81F5 /* playturn.cpp in Sources */, - B597C5F80FACD6CA00CE81F5 /* preferences_display.cpp in Sources */, - B597C5E00FACD6CA00CE81F5 /* preferences.cpp in Sources */, - B597C5540FACD6CA00CE81F5 /* preprocessor.cpp in Sources */, - B52EE8A01213590500CFBDAB /* progress_bar.cpp in Sources */, - B597C5950FACD6CA00CE81F5 /* progressbar.cpp in Sources */, - B597C53A0FACD6CA00CE81F5 /* race.cpp in Sources */, - B54AC6CB0FEA9EB5006F6FBD /* rca.cpp in Sources */, - B52EE92612135AC300CFBDAB /* recall.cpp in Sources */, - B52EE92712135AC300CFBDAB /* recruit.cpp in Sources */, - B54AC69B0FEA9E8F006F6FBD /* registry.cpp in Sources */, - B597EC1B0FC0835900CE81F5 /* render.cpp in Sources */, - B59271FC10E9577800A13911 /* repeating_button.cpp in Sources */, - B597C53C0FACD6CA00CE81F5 /* replay_controller.cpp in Sources */, - B597C5850FACD6CA00CE81F5 /* replay.cpp in Sources */, - B597C5780FACD6CA00CE81F5 /* reports.cpp in Sources */, - B5951A911013BB0800C10B66 /* resources.cpp in Sources */, - B54AC6850FEA9C4A006F6FBD /* room_manager.cpp in Sources */, - B54AC6840FEA9C4A006F6FBD /* room.cpp in Sources */, - B52EE8ED121359A600CFBDAB /* save_blocker.cpp in Sources */, - B52EE8EF121359A600CFBDAB /* savegame.cpp in Sources */, - B597C5CE0FACD6CA00CE81F5 /* scroll_label.cpp in Sources */, - B597C5760FACD6CA00CE81F5 /* scrollarea.cpp in Sources */, - B597C5EE0FACD6CA00CE81F5 /* scrollbar_container.cpp in Sources */, - B54AC6FF0FEA9FA5006F6FBD /* scrollbar_panel.cpp in Sources */, - B597C56F0FACD6CA00CE81F5 /* scrollbar.cpp in Sources */, - B597C7270FACE67E00CE81F5 /* scrollbar.cpp in Sources */, - B597C5B40FACD6CA00CE81F5 /* scrollpane.cpp in Sources */, - B597C5630FACD6CA00CE81F5 /* settings.cpp in Sources */, - B597C5680FACD6CA00CE81F5 /* settings.cpp in Sources */, - B597C5470FACD6CA00CE81F5 /* show_dialog.cpp in Sources */, - B52EE92812135AC300CFBDAB /* side_actions.cpp in Sources */, - B5CE46FA12A0417D00D665EE /* side_filter.cpp in Sources */, - B5CE470A12A041EF00D665EE /* simple_item_selector.cpp in Sources */, - B597C5A70FACD6CA00CE81F5 /* slider.cpp in Sources */, - B597C71D0FACE4A600CE81F5 /* slider.cpp in Sources */, - B52EE8F0121359A600CFBDAB /* sound_music_track.cpp in Sources */, - B597C5670FACD6CA00CE81F5 /* sound.cpp in Sources */, - B597C58C0FACD6CA00CE81F5 /* soundsource.cpp in Sources */, - B597C54A0FACD6CA00CE81F5 /* spacer.cpp in Sources */, - B508D2171001560100B12852 /* stacked_widget.cpp in Sources */, - B54AC6D70FEA9EB5006F6FBD /* stage_rca.cpp in Sources */, - B59F96E3103478DE00A57C1A /* stage_side_formulas.cpp in Sources */, - B59F96E4103478DE00A57C1A /* stage_unit_formulas.cpp in Sources */, - B54AC6CC0FEA9EB5006F6FBD /* stage.cpp in Sources */, - B597C5890FACD6CA00CE81F5 /* statistics_dialog.cpp in Sources */, - B597C5DD0FACD6CA00CE81F5 /* statistics.cpp in Sources */, - B597C5A20FACD6CA00CE81F5 /* string_utils.cpp in Sources */, - B597C5530FACD6CA00CE81F5 /* team.cpp in Sources */, - B597C5E40FACD6CA00CE81F5 /* filter.cpp in Sources */, - B597C5F20FACD6CA00CE81F5 /* translation.cpp in Sources */, - B597C5DE0FACD6CA00CE81F5 /* terrain.cpp in Sources */, - B597C4B20FACD42E00CE81F5 /* test_config_cache.cpp in Sources */, - B597C4D40FACD43B00CE81F5 /* test_drop_target.cpp in Sources */, - B597C4B10FACD42E00CE81F5 /* test_formula_ai.cpp in Sources */, - B597C4B70FACD42E00CE81F5 /* test_lexical_cast.cpp in Sources */, - B597C4B60FACD42E00CE81F5 /* test_network_worker.cpp in Sources */, - B597C4D50FACD43B00CE81F5 /* test_save_dialog.cpp in Sources */, - B597C4B40FACD42E00CE81F5 /* test_serialization.cpp in Sources */, - B597C4B00FACD42E00CE81F5 /* test_team.cpp in Sources */, - B597C4AF0FACD42E00CE81F5 /* test_util.cpp in Sources */, - B597C4AE0FACD42E00CE81F5 /* test_version.cpp in Sources */, - B597EC000FC082AB00CE81F5 /* testing.cpp in Sources */, - B597C5560FACD6CA00CE81F5 /* text_box.cpp in Sources */, - B597C5730FACD6CA00CE81F5 /* text.cpp in Sources */, - B597C5D90FACD6CA00CE81F5 /* text.cpp in Sources */, - B597C5380FACD6CA00CE81F5 /* textbox.cpp in Sources */, - B597C5A00FACD6CA00CE81F5 /* theme.cpp in Sources */, - B597C58F0FACD6CA00CE81F5 /* thread.cpp in Sources */, - B597C5B00FACD6CA00CE81F5 /* time_of_day.cpp in Sources */, - B5CF7BBD10D55F5A00A8BEB5 /* timer.cpp in Sources */, - B504B94D1284C06B00261FE9 /* tips.cpp in Sources */, - B597C5E70FACD6CA00CE81F5 /* title_screen.cpp in Sources */, - B52EE8851213585300CFBDAB /* tod_manager.cpp in Sources */, - B597C5D80FACD6CA00CE81F5 /* toggle_button.cpp in Sources */, - B597C5F00FACD6CA00CE81F5 /* toggle_panel.cpp in Sources */, - B597C58D0FACD6CA00CE81F5 /* tokenizer.cpp in Sources */, - B597C5700FACD6CA00CE81F5 /* tooltips.cpp in Sources */, - B54AC6F40FEA9F92006F6FBD /* transient_message.cpp in Sources */, - B55BE05511234B3300154E6C /* tree_view_node.cpp in Sources */, - B55BE05611234B3300154E6C /* tree_view.cpp in Sources */, - B597C5A60FACD6CA00CE81F5 /* tstring.cpp in Sources */, - B597C5990FACD6CA00CE81F5 /* abilities.cpp in Sources */, - B597C5440FACD6CA00CE81F5 /* animation.cpp in Sources */, - B52EE88E1213589100CFBDAB /* unit_attack.cpp in Sources */, - B59F9734103716E400A57C1A /* unit_create.cpp in Sources */, - B597C6030FACD6CA00CE81F5 /* udisplay.cpp in Sources */, - B597C5860FACD6CA00CE81F5 /* frame.cpp in Sources */, - B52EE8F1121359A600CFBDAB /* helper.cpp in Sources */, - B597C5D30FACD6CA00CE81F5 /* id.cpp in Sources */, - B597C5B60FACD6CA00CE81F5 /* map.cpp in Sources */, - B597C5FF0FACD6CA00CE81F5 /* types.cpp in Sources */, - B597C56B0FACD6CA00CE81F5 /* unit.cpp in Sources */, - B597C53E0FACD6CA00CE81F5 /* util.cpp in Sources */, - B553B6BB12189C5900CC8C58 /* utility.cpp in Sources */, - B52EE9B01213640400CFBDAB /* validation.cpp in Sources */, - B597C5620FACD6CA00CE81F5 /* variable.cpp in Sources */, - B597C5E60FACD6CA00CE81F5 /* variant.cpp in Sources */, - B597C5C10FACD6CA00CE81F5 /* version.cpp in Sources */, - B597C57C0FACD6CA00CE81F5 /* vertical_scrollbar.cpp in Sources */, - B597C55A0FACD6CA00CE81F5 /* video.cpp in Sources */, - B5B46931107118B200327599 /* widget_definition.cpp in Sources */, - B597C5970FACD6CA00CE81F5 /* widget.cpp in Sources */, - B597C5D60FACD6CA00CE81F5 /* widget.cpp in Sources */, - B597EC5F0FC08E0100CE81F5 /* window_builder.cpp in Sources */, - B597C5D00FACD6CA00CE81F5 /* window.cpp in Sources */, - B597C5A40FACD6CA00CE81F5 /* wml_exception.cpp in Sources */, - B597C57B0FACD6CA00CE81F5 /* wml_message.cpp in Sources */, - 91F462851C71139C0050A9C9 /* preferences_dialog.cpp in Sources */, - 91F462891C7115C50050A9C9 /* combobox.cpp in Sources */, - 91F462951C7117400050A9C9 /* drop_down_list.cpp in Sources */, - 9130A4611C73BB6100852782 /* select_orb_colors.cpp in Sources */, - 91DCA68A1C9066CC0030F8D0 /* unit_preview_pane.cpp in Sources */, - 91DCA68E1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */, - 91DCA6901C9360610030F8D0 /* test_formula_core.cpp in Sources */, - 91EF6C051C9E22EA00E2A733 /* sha1.cpp in Sources */, - 9122417D1CAAB7B7008B347F /* loadscreen.cpp in Sources */, + 91E356331CACC47F00774252 /* floating_point_emulation.cpp in Sources */, + 91E356341CACC47F00774252 /* main.cpp in Sources */, + 91E356351CACC47F00774252 /* test_addons.cpp in Sources */, + 91E356361CACC47F00774252 /* test_commandline_options.cpp in Sources */, + 91E356371CACC47F00774252 /* test_config.cpp in Sources */, + 91E356381CACC47F00774252 /* test_config_cache.cpp in Sources */, + 91E356391CACC47F00774252 /* test_filesystem.cpp in Sources */, + 91E3563A1CACC47F00774252 /* test_formula_ai.cpp in Sources */, + 91E3563B1CACC47F00774252 /* test_formula_core.cpp in Sources */, + 91E3563C1CACC47F00774252 /* test_formula_function.cpp in Sources */, + 91E3563D1CACC47F00774252 /* test_image_modifications.cpp in Sources */, + 91E3563E1CACC47F00774252 /* test_lexical_cast.cpp in Sources */, + 91E3563F1CACC47F00774252 /* test_lua.cpp in Sources */, + 91E356401CACC47F00774252 /* test_make_enum.cpp in Sources */, + 91E356411CACC47F00774252 /* test_map_location.cpp in Sources */, + 91E356421CACC47F00774252 /* test_mp_connect.cpp in Sources */, + 91E356431CACC47F00774252 /* test_network_worker.cpp in Sources */, + 91E356441CACC47F00774252 /* test_recall_list.cpp in Sources */, + 91E356451CACC47F00774252 /* test_rng.cpp in Sources */, + 91E356461CACC47F00774252 /* test_sdl_utils.cpp in Sources */, + 91E356471CACC47F00774252 /* test_serialization.cpp in Sources */, + 91E356481CACC47F00774252 /* test_team.cpp in Sources */, + 91E356491CACC47F00774252 /* test_unit_map.cpp in Sources */, + 91E3564A1CACC47F00774252 /* test_util.cpp in Sources */, + 91E3564B1CACC47F00774252 /* test_version.cpp in Sources */, + 91E3564C1CACC47F00774252 /* test_whiteboard_side_actions.cpp in Sources */, + 91E3564D1CACC62500774252 /* about.cpp in Sources */, + 91E3564E1CACC62500774252 /* animated_game.cpp in Sources */, + 91E3564F1CACC62500774252 /* attack_prediction.cpp in Sources */, + 91E356501CACC62500774252 /* attack_prediction_display.cpp in Sources */, + 91E356511CACC62500774252 /* build_info.cpp in Sources */, + 91E356521CACC62500774252 /* carryover.cpp in Sources */, + 91E356531CACC62500774252 /* commandline_options.cpp in Sources */, + 91E356541CACC62500774252 /* config_cache.cpp in Sources */, + 91E356551CACC62500774252 /* controller_base.cpp in Sources */, + 91E356561CACC62500774252 /* countdown_clock.cpp in Sources */, + 91E356571CACC67C00774252 /* dialogs.cpp in Sources */, + 91E356581CACC67C00774252 /* display_chat_manager.cpp in Sources */, + 91E356591CACC67C00774252 /* fake_unit_manager.cpp in Sources */, + 91E3565A1CACC67C00774252 /* fake_unit_ptr.cpp in Sources */, + 91E3565B1CACC67C00774252 /* filechooser.cpp in Sources */, + 91E3565C1CACC67C00774252 /* floating_textbox.cpp in Sources */, + 91E3565D1CACC67C00774252 /* game_board.cpp in Sources */, + 91E3565E1CACC67C00774252 /* game_classification.cpp in Sources */, + 91E3565F1CACC67C00774252 /* game_display.cpp in Sources */, + 91E356601CACC67C00774252 /* game_errors.cpp in Sources */, + 91E356611CACC67C00774252 /* game_launcher.cpp in Sources */, + 91E356621CACC67C00774252 /* game_preferences.cpp in Sources */, + 91E356631CACC67C00774252 /* game_state.cpp in Sources */, + 91E356641CACC6E000774252 /* halo.cpp in Sources */, + 91E356651CACC6E000774252 /* intro.cpp in Sources */, + 91E356661CACC6E000774252 /* leader_scroll_dialog.cpp in Sources */, + 91E356671CACC6E000774252 /* lobby_preferences.cpp in Sources */, + 91E356681CACC6E000774252 /* menu_events.cpp in Sources */, + 91E356691CACC6E000774252 /* mouse_events.cpp in Sources */, + 91E3566A1CACC6E000774252 /* mouse_handler_base.cpp in Sources */, + 91E3566B1CACC6E000774252 /* movetype.cpp in Sources */, + 91E3566C1CACC6E000774252 /* mp_game_settings.cpp in Sources */, + 91E3566D1CACC6E000774252 /* mp_ui_alerts.cpp in Sources */, + 91E3566E1CACC6E000774252 /* network_asio.cpp in Sources */, + 91E3566F1CACC6E000774252 /* persist_context.cpp in Sources */, + 91E356701CACC6E000774252 /* persist_manager.cpp in Sources */, + 91E356711CACC6E000774252 /* persist_var.cpp in Sources */, + 91E356721CACC6E000774252 /* play_controller.cpp in Sources */, + 91E356731CACC6E000774252 /* playmp_controller.cpp in Sources */, + 91E356741CACC6E000774252 /* playsingle_controller.cpp in Sources */, + 91E356751CACC6E000774252 /* playturn.cpp in Sources */, + 91E356761CACC6E000774252 /* playturn_network_adapter.cpp in Sources */, + 91E356771CACC71A00774252 /* random_new.cpp in Sources */, + 91E356781CACC71A00774252 /* random_new_deterministic.cpp in Sources */, + 91E356791CACC71A00774252 /* random_new_synced.cpp in Sources */, + 91E3567A1CACC71A00774252 /* recall_list_manager.cpp in Sources */, + 91E3567B1CACC71A00774252 /* replay.cpp in Sources */, + 91E3567C1CACC71A00774252 /* replay_controller.cpp in Sources */, + 91E3567D1CACC71A00774252 /* replay_helper.cpp in Sources */, + 91E3567E1CACC71A00774252 /* replay_recorder_base.cpp in Sources */, + 91E3567F1CACC71A00774252 /* resources.cpp in Sources */, + 91E356801CACC71A00774252 /* save_blocker.cpp in Sources */, + 91E356811CACC71A00774252 /* save_index.cpp in Sources */, + 91E356821CACC71A00774252 /* saved_game.cpp in Sources */, + 91E356831CACC71A00774252 /* savegame.cpp in Sources */, + 91E356841CACC77E00774252 /* settings.cpp in Sources */, + 91E356851CACC77E00774252 /* side_filter.cpp in Sources */, + 91E356861CACC77E00774252 /* statistics.cpp in Sources */, + 91E356871CACC77E00774252 /* statistics_dialog.cpp in Sources */, + 91E356881CACC77E00774252 /* strftime.cpp in Sources */, + 91E356891CACC77E00774252 /* synced_checkup.cpp in Sources */, + 91E3568A1CACC77E00774252 /* synced_commands.cpp in Sources */, + 91E3568B1CACC77E00774252 /* synced_context.cpp in Sources */, + 91E3568C1CACC77E00774252 /* synced_user_choice.cpp in Sources */, + 91E3568D1CACC77E00774252 /* syncmp_handler.cpp in Sources */, + 91E3568E1CACC77E00774252 /* team.cpp in Sources */, + 91E3568F1CACC77E00774252 /* teambuilder.cpp in Sources */, + 91E356901CACC77E00774252 /* tod_manager.cpp in Sources */, + 91E356911CACC78B00774252 /* variable.cpp in Sources */, + 91E356921CACC78B00774252 /* variable_info.cpp in Sources */, + 91E356931CACC78B00774252 /* wmi_pager.cpp in Sources */, + 91E356941CACC7CE00774252 /* attack.cpp in Sources */, + 91E356951CACC7CE00774252 /* create.cpp in Sources */, + 91E356961CACC7CE00774252 /* heal.cpp in Sources */, + 91E356971CACC7CE00774252 /* move.cpp in Sources */, + 91E356981CACC7CE00774252 /* shroud_clearing_action.cpp in Sources */, + 91E356991CACC7CE00774252 /* undo.cpp in Sources */, + 91E3569A1CACC7CE00774252 /* undo_action.cpp in Sources */, + 91E3569B1CACC7CE00774252 /* undo_dismiss_action.cpp in Sources */, + 91E3569C1CACC7CE00774252 /* undo_move_action.cpp in Sources */, + 91E3569D1CACC7CE00774252 /* undo_recall_action.cpp in Sources */, + 91E3569E1CACC7CE00774252 /* undo_recruit_action.cpp in Sources */, + 91E3569F1CACC7CE00774252 /* undo_update_shroud_action.cpp in Sources */, + 91E356A01CACC7CE00774252 /* unit_creator.cpp in Sources */, + 91E356A11CACC7CE00774252 /* vision.cpp in Sources */, + 91E356A21CACC7E300774252 /* client.cpp in Sources */, + 91E356A31CACC7E300774252 /* info.cpp in Sources */, + 91E356A41CACC7E300774252 /* manager.cpp in Sources */, + 91E356A51CACC7E300774252 /* manager_ui.cpp in Sources */, + 91E356A61CACC7E300774252 /* state.cpp in Sources */, + 91E356A71CACC7E300774252 /* validation.cpp in Sources */, + 91E356A81CACC81A00774252 /* actions.cpp in Sources */, + 91E356A91CACC81A00774252 /* configuration.cpp in Sources */, + 91E356AA1CACC81A00774252 /* contexts.cpp in Sources */, + 91E356AB1CACC81A00774252 /* game_info.cpp in Sources */, + 91E356AC1CACC81A00774252 /* gamestate_observer.cpp in Sources */, + 91E356AD1CACC81A00774252 /* manager.cpp in Sources */, + 91E356AE1CACC81A00774252 /* registry.cpp in Sources */, + 91E356AF1CACC81A00774252 /* simulated_actions.cpp in Sources */, + 91E356B01CACC81A00774252 /* testing.cpp in Sources */, + 91E356B11CACC82D00774252 /* ai.cpp in Sources */, + 91E356B21CACC82D00774252 /* aspect.cpp in Sources */, + 91E356B31CACC82D00774252 /* component.cpp in Sources */, + 91E356B41CACC82D00774252 /* contexts.cpp in Sources */, + 91E356B51CACC82D00774252 /* engine.cpp in Sources */, + 91E356B61CACC82D00774252 /* goal.cpp in Sources */, + 91E356B71CACC82D00774252 /* rca.cpp in Sources */, + 91E356B81CACC82D00774252 /* stage.cpp in Sources */, + 91E356B91CACC8A100774252 /* aspect_attacks.cpp in Sources */, + 91E356BA1CACC8A100774252 /* attack.cpp in Sources */, + 91E356BB1CACC8A100774252 /* ca.cpp in Sources */, + 91E356BC1CACC8A100774252 /* contexts.cpp in Sources */, + 91E356BD1CACC8A100774252 /* engine_cpp.cpp in Sources */, + 91E356BE1CACC8A100774252 /* recruitment.cpp in Sources */, + 91E356BF1CACC8A100774252 /* ca_move_to_targets.cpp in Sources */, + 91E356C01CACC8A100774252 /* stage_rca.cpp in Sources */, + 91E356C11CACC8B800774252 /* ai.cpp in Sources */, + 91E356C21CACC8B800774252 /* callable_objects.cpp in Sources */, + 91E356C31CACC8B800774252 /* candidates.cpp in Sources */, + 91E356C41CACC8B800774252 /* engine_fai.cpp in Sources */, + 91E356C51CACC8B800774252 /* function_table.cpp in Sources */, + 91E356C61CACC8B800774252 /* stage_side_formulas.cpp in Sources */, + 91E356C71CACC8B800774252 /* stage_unit_formulas.cpp in Sources */, + 91E356C81CACC8C400774252 /* aspect_advancements.cpp in Sources */, + 91E356C91CACC8C400774252 /* core.cpp in Sources */, + 91E356CA1CACC8C400774252 /* engine_lua.cpp in Sources */, + 91E356CB1CACC8C400774252 /* lua_object.cpp in Sources */, + 91E356CC1CACC8DA00774252 /* notifications.cpp in Sources */, + 91E356CD1CACC8DA00774252 /* open.cpp in Sources */, + 91E356CE1CACC8DA00774252 /* version.cpp in Sources */, + 91E356CF1CACC8F200774252 /* editor_controller.cpp in Sources */, + 91E356D01CACC8F200774252 /* editor_display.cpp in Sources */, + 91E356D11CACC8F200774252 /* editor_main.cpp in Sources */, + 91E356D21CACC8F200774252 /* editor_preferences.cpp in Sources */, + 91E356D31CACC90100774252 /* action.cpp in Sources */, + 91E356D41CACC90100774252 /* action_item.cpp in Sources */, + 91E356D51CACC90100774252 /* action_label.cpp in Sources */, + 91E356D61CACC90100774252 /* action_select.cpp in Sources */, + 91E356D71CACC90100774252 /* action_unit.cpp in Sources */, + 91E356D81CACC90100774252 /* action_village.cpp in Sources */, + 91E356D91CACC90B00774252 /* mouse_action.cpp in Sources */, + 91E356DA1CACC90B00774252 /* mouse_action_item.cpp in Sources */, + 91E356DB1CACC90B00774252 /* mouse_action_map_label.cpp in Sources */, + 91E356DC1CACC90B00774252 /* mouse_action_select.cpp in Sources */, + 91E356DD1CACC90B00774252 /* mouse_action_unit.cpp in Sources */, + 91E356DE1CACC90B00774252 /* mouse_action_village.cpp in Sources */, + 91E356DF1CACC92000774252 /* context_manager.cpp in Sources */, + 91E356E01CACC92000774252 /* editor_map.cpp in Sources */, + 91E356E11CACC92000774252 /* map_context.cpp in Sources */, + 91E356E21CACC92000774252 /* map_fragment.cpp in Sources */, + 91E356E31CACC93000774252 /* editor_palettes.cpp in Sources */, + 91E356E41CACC93000774252 /* item_palette.cpp in Sources */, + 91E356E51CACC93000774252 /* palette_manager.cpp in Sources */, + 91E356E61CACC93000774252 /* terrain_palettes.cpp in Sources */, + 91E356E71CACC93000774252 /* tristate_button.cpp in Sources */, + 91E356E81CACC93000774252 /* unit_palette.cpp in Sources */, + 91E356E91CACC93600774252 /* brush.cpp in Sources */, + 91E356EA1CACC93600774252 /* editor_toolkit.cpp in Sources */, + 91E356EB1CACC95100774252 /* callable_objects.cpp in Sources */, + 91E356EC1CACC95100774252 /* debugger.cpp in Sources */, + 91E356ED1CACC95100774252 /* debugger_fwd.cpp in Sources */, + 91E356EE1CACC95100774252 /* formula.cpp in Sources */, + 91E356EF1CACC95100774252 /* function.cpp in Sources */, + 91E356F01CACC95100774252 /* string_utils.cpp in Sources */, + 91E356F11CACC95100774252 /* tokenizer.cpp in Sources */, + 91E356F21CACC95100774252 /* variant.cpp in Sources */, + 91E356F31CACC97400774252 /* action_wml.cpp in Sources */, + 91E356F41CACC97400774252 /* conditional_wml.cpp in Sources */, + 91E356F51CACC97400774252 /* entity_location.cpp in Sources */, + 91E356F61CACC97400774252 /* handlers.cpp in Sources */, + 91E356F71CACC97400774252 /* manager.cpp in Sources */, + 91E356F81CACC97400774252 /* manager_impl.cpp in Sources */, + 91E356F91CACC97400774252 /* menu_item.cpp in Sources */, + 91E356FA1CACC97400774252 /* pump.cpp in Sources */, + 91E356FB1CACC97400774252 /* wmi_container.cpp in Sources */, + 91E356FC1CACC9B200774252 /* configure_engine.cpp in Sources */, + 91E356FD1CACC9B200774252 /* connect_engine.cpp in Sources */, + 91E356FE1CACC9B200774252 /* create_engine.cpp in Sources */, + 91E356FF1CACC9B200774252 /* depcheck.cpp in Sources */, + 91E357001CACC9B200774252 /* flg_manager.cpp in Sources */, + 91E357011CACC9B200774252 /* mp_game_utils.cpp in Sources */, + 91E357021CACC9B200774252 /* mp_options.cpp in Sources */, + 91E357031CACC9B200774252 /* multiplayer.cpp in Sources */, + 91E357041CACC9B200774252 /* multiplayer_configure.cpp in Sources */, + 91E357051CACC9B200774252 /* multiplayer_connect.cpp in Sources */, + 91E357061CACC9B200774252 /* multiplayer_create.cpp in Sources */, + 91E357071CACC9B200774252 /* multiplayer_lobby.cpp in Sources */, + 91E357081CACC9B200774252 /* multiplayer_ui.cpp in Sources */, + 91E357091CACC9B200774252 /* multiplayer_wait.cpp in Sources */, + 91E3570A1CACC9B200774252 /* playcampaign.cpp in Sources */, + 91E3570B1CACC9B200774252 /* singleplayer.cpp in Sources */, + 91E3570C1CACC9FF00774252 /* old_markup.cpp in Sources */, + 91E3570D1CACCA0600774252 /* iterator.cpp in Sources */, + 91E3570E1CACCA0600774252 /* walker_grid.cpp in Sources */, + 91E3570F1CACCA0600774252 /* walker_widget.cpp in Sources */, + 91E357101CACCA5700774252 /* canvas.cpp in Sources */, + 91E357111CACCA5700774252 /* log.cpp in Sources */, + 91E357121CACCA5700774252 /* placer.cpp in Sources */, + 91E357131CACCA5700774252 /* point.cpp in Sources */, + 91E357141CACCA5700774252 /* timer.cpp in Sources */, + 91E357151CACCA5700774252 /* tips.cpp in Sources */, + 91E357161CACCA5700774252 /* widget_definition.cpp in Sources */, + 91E357171CACCA5700774252 /* window_builder.cpp in Sources */, + 91E357181CACCA9900774252 /* dispatcher.cpp in Sources */, + 91E357191CACCA9900774252 /* distributor.cpp in Sources */, + 91E3571A1CACCA9900774252 /* handler.cpp in Sources */, + 91E3571B1CACCA9900774252 /* horizontal_list.cpp in Sources */, + 91E3571C1CACCA9900774252 /* vertical_list.cpp in Sources */, + 91E3571D1CACCA9900774252 /* helper.cpp in Sources */, + 91E3571E1CACCA9900774252 /* instance.cpp in Sources */, + 91E3571F1CACCAC900774252 /* advanced_graphics_options.cpp in Sources */, + 91E357211CACCAC900774252 /* campaign_difficulty.cpp in Sources */, + 91E357231CACCAC900774252 /* campaign_selection.cpp in Sources */, + 91E357251CACCAC900774252 /* campaign_settings.cpp in Sources */, + 91E357271CACCAC900774252 /* chat_log.cpp in Sources */, + 91E357291CACCAC900774252 /* core_selection.cpp in Sources */, + 91E3572B1CACCAC900774252 /* debug_clock.cpp in Sources */, + 91E3572D1CACCAC900774252 /* depcheck_confirm_change.cpp in Sources */, + 91E3572F1CACCAC900774252 /* depcheck_select_new.cpp in Sources */, + 91E357311CACCAC900774252 /* dialog.cpp in Sources */, + 91E357331CACCAC900774252 /* drop_down_list.cpp in Sources */, + 91E357351CACCAC900774252 /* edit_label.cpp in Sources */, + 91E357371CACCAC900774252 /* edit_text.cpp in Sources */, + 91E357391CACCB4000774252 /* folder_create.cpp in Sources */, + 91E3573B1CACCB4000774252 /* formula_debugger.cpp in Sources */, + 91E3573D1CACCB4000774252 /* game_cache_options.cpp in Sources */, + 91E3573F1CACCB4100774252 /* game_delete.cpp in Sources */, + 91E357411CACCB4100774252 /* game_load.cpp in Sources */, + 91E357431CACCB4100774252 /* game_save.cpp in Sources */, + 91E357451CACCB4100774252 /* game_version.cpp in Sources */, + 91E357461CACCB4100774252 /* gamestate_inspector.cpp in Sources */, + 91E357491CACCB4100774252 /* label_settings.cpp in Sources */, + 91E3574B1CACCB4100774252 /* language_selection.cpp in Sources */, + 91E3574D1CACCB4200774252 /* loadscreen.cpp in Sources */, + 91E3574F1CACCC3E00774252 /* lua_interpreter.cpp in Sources */, + 91E357501CACCC3E00774252 /* message.cpp in Sources */, + 91A214E51CAD666B00927AEA /* arrow.cpp in Sources */, + 91A214E61CAD666B00927AEA /* construct_dialog.cpp in Sources */, + 91A214E71CAD666B00927AEA /* cursor.cpp in Sources */, + 91A214E81CAD666B00927AEA /* clipboard.cpp in Sources */, + 91A214E91CAD666B00927AEA /* display.cpp in Sources */, + 91A214EA1CAD666B00927AEA /* display_context.cpp in Sources */, + 91A214EB1CAD666B00927AEA /* events.cpp in Sources */, + 91A214EC1CAD666B00927AEA /* floating_label.cpp in Sources */, + 91A214ED1CAD666B00927AEA /* font.cpp in Sources */, + 91A214EE1CAD666B00927AEA /* format_time_summary.cpp in Sources */, + 91A214EF1CAD669D00927AEA /* game_end_exceptions.cpp in Sources */, + 91A214F01CAD669D00927AEA /* cave_map_generator.cpp in Sources */, + 91A214F11CAD669D00927AEA /* default_map_generator.cpp in Sources */, + 91A214F21CAD669D00927AEA /* default_map_generator_job.cpp in Sources */, + 91A214F31CAD669D00927AEA /* lua_map_generator.cpp in Sources */, + 91A214F41CAD669D00927AEA /* map_create.cpp in Sources */, + 91A214F51CAD669D00927AEA /* map_generator.cpp in Sources */, + 91A214F61CAD669D00927AEA /* generic_event.cpp in Sources */, + 91A214F71CAD66B900927AEA /* command_executor.cpp in Sources */, + 91A214F81CAD66B900927AEA /* hotkey_command.cpp in Sources */, + 91A214F91CAD66B900927AEA /* hotkey_item.cpp in Sources */, + 91A214FA1CAD66B900927AEA /* hotkey_manager.cpp in Sources */, + 91A214FB1CAD66CC00927AEA /* image.cpp in Sources */, + 91A214FC1CAD66CC00927AEA /* image_modifications.cpp in Sources */, + 91A214FD1CAD66CC00927AEA /* joystick.cpp in Sources */, + 91A214FE1CAD66CC00927AEA /* key.cpp in Sources */, + 91A214FF1CAD66CC00927AEA /* language.cpp in Sources */, + 91A215001CAD66D000927AEA /* label.cpp in Sources */, + 91A215011CAD66E500927AEA /* marked-up_text.cpp in Sources */, + 91A215021CAD66E500927AEA /* minimap.cpp in Sources */, + 91A215031CAD66E500927AEA /* astarsearch.cpp in Sources */, + 91A215041CAD66E500927AEA /* pathutils.cpp in Sources */, + 91A215051CAD66F000927AEA /* preferences.cpp in Sources */, + 91A215061CAD673700927AEA /* quit_confirmation.cpp in Sources */, + 91A215071CAD673700927AEA /* race.cpp in Sources */, + 91A215081CAD673700927AEA /* reports.cpp in Sources */, + 91A215091CAD675900927AEA /* show_dialog.cpp in Sources */, + 91A2150A1CAD675900927AEA /* sound.cpp in Sources */, + 91A2150B1CAD675900927AEA /* sound_music_track.cpp in Sources */, + 91A2150C1CAD675900927AEA /* soundsource.cpp in Sources */, + 91A2150D1CAD676300927AEA /* builder.cpp in Sources */, + 91A2150E1CAD676300927AEA /* terrain.cpp in Sources */, + 91A2150F1CAD676300927AEA /* translation.cpp in Sources */, + 91A215101CAD677400927AEA /* text.cpp in Sources */, + 91A215111CAD677400927AEA /* theme.cpp in Sources */, + 91A215121CAD677400927AEA /* time_of_day.cpp in Sources */, + 91A215131CAD677400927AEA /* tooltips.cpp in Sources */, + 91A215141CAD677400927AEA /* make_enum.cpp in Sources */, + 91A215151CAD687A00927AEA /* video.cpp in Sources */, + 91A215161CAD689800927AEA /* button.cpp in Sources */, + 91A215171CAD689800927AEA /* file_menu.cpp in Sources */, + 91A215181CAD689800927AEA /* label.cpp in Sources */, + 91A215191CAD689800927AEA /* menu_style.cpp in Sources */, + 91A2151A1CAD689800927AEA /* multimenu.cpp in Sources */, + 91A2151B1CAD689800927AEA /* progressbar.cpp in Sources */, + 91A2151C1CAD689800927AEA /* scrollarea.cpp in Sources */, + 91A2151D1CAD689800927AEA /* scrollbar.cpp in Sources */, + 91A2151E1CAD689800927AEA /* slider.cpp in Sources */, + 91A2151F1CAD689800927AEA /* textbox.cpp in Sources */, + 91A215201CAD689800927AEA /* widget.cpp in Sources */, + 91A215211CAD689800927AEA /* wml_exception.cpp in Sources */, + 91A215221CAD696900927AEA /* xbrz.cpp in Sources */, + 91A215231CAD698900927AEA /* alpha.cpp in Sources */, + 91A215241CAD698900927AEA /* exception.cpp in Sources */, + 91A215251CAD698900927AEA /* rect.cpp in Sources */, + 91A215261CAD698900927AEA /* utils.cpp in Sources */, + 91A215271CAD698900927AEA /* window.cpp in Sources */, + 91A215291CAD6A8B00927AEA /* lapi.cpp in Sources */, + 91A2152B1CAD6A8B00927AEA /* lauxlib.cpp in Sources */, + 91A2152D1CAD6A8B00927AEA /* lbaselib.cpp in Sources */, + 91A2152E1CAD6A8B00927AEA /* lbitlib.cpp in Sources */, + 91A2152F1CAD6A8B00927AEA /* lcode.cpp in Sources */, + 91A215311CAD6A8B00927AEA /* lcorolib.cpp in Sources */, + 91A215321CAD6A8B00927AEA /* lctype.cpp in Sources */, + 91A215341CAD6A8B00927AEA /* ldblib.cpp in Sources */, + 91A215351CAD6A8B00927AEA /* ldebug.cpp in Sources */, + 91A215371CAD6A8B00927AEA /* ldo.cpp in Sources */, + 91A215391CAD6A8B00927AEA /* ldump.cpp in Sources */, + 91A2153A1CAD6A8B00927AEA /* lfunc.cpp in Sources */, + 91A2153C1CAD6A8B00927AEA /* lgc.cpp in Sources */, + 91A2153E1CAD6A8B00927AEA /* linit.cpp in Sources */, + 91A2153F1CAD6A8B00927AEA /* liolib.cpp in Sources */, + 91A215401CAD6A8B00927AEA /* llex.cpp in Sources */, + 91A215431CAD6A8B00927AEA /* lmathlib.cpp in Sources */, + 91A215441CAD6A8B00927AEA /* lmem.cpp in Sources */, + 91A215461CAD6A8B00927AEA /* loadlib.cpp in Sources */, + 91A215471CAD6A8B00927AEA /* lobject.cpp in Sources */, + 91A215491CAD6A8B00927AEA /* lopcodes.cpp in Sources */, + 91A2154B1CAD6A8B00927AEA /* loslib.cpp in Sources */, + 91A2154C1CAD6A8B00927AEA /* lparser.cpp in Sources */, + 91A2154E1CAD6A8B00927AEA /* lstate.cpp in Sources */, + 91A215501CAD6A8B00927AEA /* lstring.cpp in Sources */, + 91A215521CAD6A8B00927AEA /* lstrlib.cpp in Sources */, + 91A215531CAD6A8B00927AEA /* ltable.cpp in Sources */, + 91A215551CAD6A8B00927AEA /* ltablib.cpp in Sources */, + 91A215561CAD6A8B00927AEA /* ltm.cpp in Sources */, + 91A2155C1CAD6A8B00927AEA /* lundump.cpp in Sources */, + 91A2155E1CAD6A8B00927AEA /* lvm.cpp in Sources */, + 91A215601CAD6A8B00927AEA /* lzio.cpp in Sources */, + 91A215621CAD6DA400927AEA /* application_lua_kernel.cpp in Sources */, + 91A215631CAD6DA400927AEA /* game_lua_kernel.cpp in Sources */, + 91A215641CAD6DA400927AEA /* lua_api.cpp in Sources */, + 91A215651CAD6DA400927AEA /* lua_common.cpp in Sources */, + 91A215661CAD6DA400927AEA /* lua_cpp_function.cpp in Sources */, + 91A215671CAD6DA400927AEA /* lua_fileops.cpp in Sources */, + 91A215681CAD6DA400927AEA /* lua_gui2.cpp in Sources */, + 91A215691CAD6DA400927AEA /* lua_kernel_base.cpp in Sources */, + 91A2156A1CAD6DA400927AEA /* lua_map_location_ops.cpp in Sources */, + 91A2156B1CAD6DA400927AEA /* lua_race.cpp in Sources */, + 91A2156C1CAD6DA500927AEA /* lua_rng.cpp in Sources */, + 91A2156D1CAD6DA500927AEA /* lua_team.cpp in Sources */, + 91A2156E1CAD6DA500927AEA /* lua_types.cpp in Sources */, + 91A2156F1CAD6DA500927AEA /* lua_unit_type.cpp in Sources */, + 91A215701CAD6E7500927AEA /* context.cpp in Sources */, + 91A215711CAD6E7500927AEA /* manager.cpp in Sources */, + 91A215721CAD6E7500927AEA /* mapgen_lua_kernel.cpp in Sources */, + 91A215731CAD704C00927AEA /* pathfind.cpp in Sources */, + 91A215741CAD704C00927AEA /* teleport.cpp in Sources */, + 91A215751CAD761100927AEA /* help.cpp in Sources */, + 91A215761CAD761100927AEA /* help_browser.cpp in Sources */, + 91A215771CAD761100927AEA /* help_button.cpp in Sources */, + 91A215781CAD761100927AEA /* help_impl.cpp in Sources */, + 91A215791CAD761100927AEA /* help_menu.cpp in Sources */, + 91A2157A1CAD761100927AEA /* help_text_area.cpp in Sources */, + 91A2157B1CAD761100927AEA /* help_topic_generators.cpp in Sources */, + 91A2157C1CAD761100927AEA /* hotkey_handler.cpp in Sources */, + 91A2157D1CAD761100927AEA /* hotkey_handler_mp.cpp in Sources */, + 91A2157E1CAD761100927AEA /* hotkey_handler_sp.cpp in Sources */, + 91A2157F1CAD761100927AEA /* hotkey_preferences_display.cpp in Sources */, + 91A215801CAD797900927AEA /* controller.cpp in Sources */, + 91A215811CAD797900927AEA /* interface.cpp in Sources */, + 91A215821CAD797900927AEA /* part.cpp in Sources */, + 91A215831CAD797900927AEA /* render.cpp in Sources */, + 91A215841CAD797900927AEA /* filter.cpp in Sources */, + 91A215851CAD884A00927AEA /* abilities.cpp in Sources */, + 91A215861CAD884A00927AEA /* animation.cpp in Sources */, + 91A215871CAD884B00927AEA /* animation_component.cpp in Sources */, + 91A215881CAD884B00927AEA /* attack_type.cpp in Sources */, + 91A215891CAD884B00927AEA /* drawer.cpp in Sources */, + 91A2158A1CAD884B00927AEA /* filter.cpp in Sources */, + 91A2158B1CAD884B00927AEA /* formula_manager.cpp in Sources */, + 91A2158C1CAD884B00927AEA /* frame.cpp in Sources */, + 91A2158D1CAD884B00927AEA /* helper.cpp in Sources */, + 91A2158E1CAD884B00927AEA /* id.cpp in Sources */, + 91A2158F1CAD884B00927AEA /* map.cpp in Sources */, + 91A215901CAD884B00927AEA /* types.cpp in Sources */, + 91A215911CAD884B00927AEA /* udisplay.cpp in Sources */, + 91A215921CAD884B00927AEA /* unit.cpp in Sources */, + 91A215931CAD885500927AEA /* sha1.cpp in Sources */, + 91A215941CAD887700927AEA /* action.cpp in Sources */, + 91A215951CAD887700927AEA /* attack.cpp in Sources */, + 91A215961CAD887700927AEA /* highlighter.cpp in Sources */, + 91A215971CAD887700927AEA /* manager.cpp in Sources */, + 91A215981CAD887700927AEA /* mapbuilder.cpp in Sources */, + 91A215991CAD887700927AEA /* move.cpp in Sources */, + 91A2159A1CAD887700927AEA /* recall.cpp in Sources */, + 91A2159B1CAD887700927AEA /* recruit.cpp in Sources */, + 91A2159C1CAD887700927AEA /* side_actions.cpp in Sources */, + 91A2159D1CAD887700927AEA /* suppose_dead.cpp in Sources */, + 91A2159E1CAD887700927AEA /* utility.cpp in Sources */, + 91A2159F1CAD88AD00927AEA /* combo.cpp in Sources */, + 91A215A01CAD88AD00927AEA /* combo_drag.cpp in Sources */, + 91A215A11CAD88AD00927AEA /* drop_target.cpp in Sources */, + 91A215A21CAD88AD00927AEA /* scrollpane.cpp in Sources */, + 91A215A31CAD915400927AEA /* gettext_boost.cpp in Sources */, + 91A215A41CAD917B00927AEA /* preferences_display.cpp in Sources */, + 91A215A51CAD91AB00927AEA /* version.cpp in Sources */, + 91A215A61CAD91BE00927AEA /* location.cpp in Sources */, + 91A215A71CAD924000927AEA /* binary_or_text.cpp in Sources */, + 91A215A81CAD924000927AEA /* parser.cpp in Sources */, + 91A215A91CAD924000927AEA /* preprocessor.cpp in Sources */, + 91A215AA1CAD924000927AEA /* schema_validator.cpp in Sources */, + 91A215AB1CAD924000927AEA /* string_utils.cpp in Sources */, + 91A215AC1CAD924000927AEA /* tokenizer.cpp in Sources */, + 91A215AD1CAD924000927AEA /* unicode.cpp in Sources */, + 91A215AE1CAD924000927AEA /* validator.cpp in Sources */, + 91A215AF1CAD925400927AEA /* color_range.cpp in Sources */, + 91A215B01CAD925400927AEA /* config.cpp in Sources */, + 91A215B11CAD925D00927AEA /* hash.cpp in Sources */, + 91A215B21CAD926900927AEA /* log.cpp in Sources */, + 91A215B31CAD926F00927AEA /* map.cpp in Sources */, + 91A215B41CAD927700927AEA /* md5.cpp in Sources */, + 91A215B51CAD928C00927AEA /* mt_rng.cpp in Sources */, + 91A215B61CAD929700927AEA /* network.cpp in Sources */, + 91A215B71CAD92A100927AEA /* seed_rng.cpp in Sources */, + 91A215B81CAD92AA00927AEA /* type_data.cpp in Sources */, + 91A215B91CAD92C000927AEA /* thread.cpp in Sources */, + 91A215BA1CAD92CA00927AEA /* tag.cpp in Sources */, + 91A215BB1CAD92D000927AEA /* tstring.cpp in Sources */, + 91A215BC1CAD92D400927AEA /* util.cpp in Sources */, + 91A215BD1CAD94B400927AEA /* menu.cpp in Sources */, + 91A215BE1CAD950500927AEA /* network_worker.cpp in Sources */, + 91A215BF1CAD951A00927AEA /* lua_jailbreak_exception.cpp in Sources */, + 91A215C01CAD952C00927AEA /* game_config.cpp in Sources */, + 91A215C11CAD952C00927AEA /* game_config_manager.cpp in Sources */, + 91A215C21CAD954C00927AEA /* filesystem_boost.cpp in Sources */, + 91A215C31CAD960300927AEA /* filesystem_common.cpp in Sources */, + 91A215C41CAD968400927AEA /* custom_tod.cpp in Sources */, + 91A215C51CAD968400927AEA /* edit_label.cpp in Sources */, + 91A215C61CAD968400927AEA /* edit_scenario.cpp in Sources */, + 91A215C71CAD968400927AEA /* edit_side.cpp in Sources */, + 91A215C81CAD968400927AEA /* generate_map.cpp in Sources */, + 91A215C91CAD968400927AEA /* new_map.cpp in Sources */, + 91A215CA1CAD968400927AEA /* resize_map.cpp in Sources */, + 91A215CB1CAD968400927AEA /* set_starting_position.cpp in Sources */, + 91A215CC1CAD969200927AEA /* data.cpp in Sources */, + 91A215CD1CAD969200927AEA /* info.cpp in Sources */, + 91A215CE1CAD969200927AEA /* lobby.cpp in Sources */, + 91A215CF1CAD969200927AEA /* player_info.cpp in Sources */, + 91A215D01CAD96D900927AEA /* mp_alerts_options.cpp in Sources */, + 91A215D11CAD96D900927AEA /* mp_change_control.cpp in Sources */, + 91A215D21CAD96D900927AEA /* mp_cmd_wrapper.cpp in Sources */, + 91A215D31CAD96D900927AEA /* mp_connect.cpp in Sources */, + 91A215D41CAD96D900927AEA /* mp_create_game.cpp in Sources */, + 91A215D51CAD96D900927AEA /* mp_create_game_set_password.cpp in Sources */, + 91A215D61CAD96D900927AEA /* mp_host_game_prompt.cpp in Sources */, + 91A215D71CAD96D900927AEA /* mp_join_game_password_prompt.cpp in Sources */, + 91A215D81CAD96D900927AEA /* mp_login.cpp in Sources */, + 91A215D91CAD96D900927AEA /* mp_method_selection.cpp in Sources */, + 91A215DA1CAD96D900927AEA /* synced_choice_wait.cpp in Sources */, + 91A215E41CAD9D4300927AEA /* button.cpp in Sources */, + 91A215E71CAD9D4300927AEA /* combobox.cpp in Sources */, + 91A215E91CAD9D4300927AEA /* container.cpp in Sources */, + 91A215EB1CAD9D4300927AEA /* control.cpp in Sources */, + 91A215ED1CAD9D4300927AEA /* debug.cpp in Sources */, + 91A215EF1CAD9D4300927AEA /* drawing.cpp in Sources */, + 91A215F21CAD9D4300927AEA /* generator.cpp in Sources */, + 91A215F51CAD9D4300927AEA /* grid.cpp in Sources */, + 91A215F91CAD9D4300927AEA /* helper.cpp in Sources */, + 91A215FB1CAD9D4300927AEA /* horizontal_scrollbar.cpp in Sources */, + 91A215FD1CAD9D4300927AEA /* image.cpp in Sources */, + 91A216001CAD9D4300927AEA /* label.cpp in Sources */, + 91A216021CAD9D4300927AEA /* list.cpp in Sources */, + 91A216041CAD9D4300927AEA /* listbox.cpp in Sources */, + 91A216061CAD9D4300927AEA /* matrix.cpp in Sources */, + 91A216081CAD9D4300927AEA /* minimap.cpp in Sources */, + 91A2160A1CAD9D4300927AEA /* multi_page.cpp in Sources */, + 91A2160C1CAD9D4300927AEA /* pane.cpp in Sources */, + 91A2160E1CAD9D4300927AEA /* panel.cpp in Sources */, + 91A216101CAD9D4300927AEA /* password_box.cpp in Sources */, + 91A216121CAD9D4300927AEA /* progress_bar.cpp in Sources */, + 91A216141CAD9D4300927AEA /* repeating_button.cpp in Sources */, + 91A216161CAD9D4300927AEA /* scroll_label.cpp in Sources */, + 91A216181CAD9D4300927AEA /* scrollbar.cpp in Sources */, + 91A2161A1CAD9D4300927AEA /* scrollbar_container.cpp in Sources */, + 91A2161D1CAD9D4300927AEA /* scrollbar_panel.cpp in Sources */, + 91A216201CAD9D4300927AEA /* settings.cpp in Sources */, + 91A216221CAD9D4300927AEA /* slider.cpp in Sources */, + 91A216241CAD9D4300927AEA /* spacer.cpp in Sources */, + 91A216261CAD9D4300927AEA /* stacked_widget.cpp in Sources */, + 91A216281CAD9D4300927AEA /* text.cpp in Sources */, + 91A2162A1CAD9D4300927AEA /* text_box.cpp in Sources */, + 91A2162C1CAD9D4300927AEA /* toggle_button.cpp in Sources */, + 91A2162E1CAD9D4300927AEA /* toggle_panel.cpp in Sources */, + 91A216301CAD9D4300927AEA /* tree_view.cpp in Sources */, + 91A216321CAD9D4400927AEA /* tree_view_node.cpp in Sources */, + 91A216341CAD9D4400927AEA /* unit_preview_pane.cpp in Sources */, + 91A216361CAD9D4400927AEA /* vertical_scrollbar.cpp in Sources */, + 91A216381CAD9D4400927AEA /* viewport.cpp in Sources */, + 91A2163A1CAD9D4400927AEA /* widget.cpp in Sources */, + 91A2163C1CAD9D4400927AEA /* window.cpp in Sources */, + 916718E61CADA3BF00B055A9 /* connect.cpp in Sources */, + 916718E71CADA3BF00B055A9 /* description.cpp in Sources */, + 916718E81CADA3BF00B055A9 /* filter_options.cpp in Sources */, + 916718E91CADA3BF00B055A9 /* list.cpp in Sources */, + 916718EA1CADA3BF00B055A9 /* uninstall_list.cpp in Sources */, + 916718EC1CADA9DA00B055A9 /* unit_attack.cpp in Sources */, + 916718ED1CADA9DA00B055A9 /* unit_create.cpp in Sources */, + 916718EE1CADA9DA00B055A9 /* unit_recruit.cpp in Sources */, + 916718EF1CADA9DA00B055A9 /* wml_error.cpp in Sources */, + 916718F01CADA9DA00B055A9 /* wml_message.cpp in Sources */, + 916718F11CADA9E400B055A9 /* select_orb_colors.cpp in Sources */, + 916718F21CADA9E400B055A9 /* simple_item_selector.cpp in Sources */, + 916718F31CADA9E400B055A9 /* theme_list.cpp in Sources */, + 916718F41CADA9E400B055A9 /* tip.cpp in Sources */, + 916718F51CADA9E400B055A9 /* title_screen.cpp in Sources */, + 916718F61CADA9E400B055A9 /* transient_message.cpp in Sources */, + 916718F71CADA9EF00B055A9 /* network_transmission.cpp in Sources */, + 916718F81CADA9EF00B055A9 /* popup.cpp in Sources */, + 916718F91CADA9EF00B055A9 /* preferences_dialog.cpp in Sources */, + 916718FA1CADA9EF00B055A9 /* screenshot_notification.cpp in Sources */, + 916718FB1CADAA1200B055A9 /* fake_display.cpp in Sources */, + 916718FC1CADAA1200B055A9 /* fake_event_source.cpp in Sources */, + 916718FD1CADAA1200B055A9 /* game_config_manager.cpp in Sources */, + 916718FE1CADAA1200B055A9 /* play_scenario.cpp in Sources */, + 916718FF1CADAA1D00B055A9 /* fire_event.cpp in Sources */, + 916719001CADAA1D00B055A9 /* iterator.cpp in Sources */, + 916719011CADAA1D00B055A9 /* test_drop_target.cpp in Sources */, + 916719021CADAA1D00B055A9 /* test_gui2.cpp in Sources */, + 916719031CADAA1D00B055A9 /* test_save_dialog.cpp in Sources */, + 916719041CADAA1D00B055A9 /* visitor.cpp in Sources */, + 916719061CADABEA00B055A9 /* game_data.cpp in Sources */, + 916719081CADAC2800B055A9 /* apple_notification.mm in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5159,6 +5774,7 @@ ECAA3FE818E0E4EF002E8998 /* unicode.cpp in Sources */, B5BB6B830F893E7500444FBF /* user_handler.cpp in Sources */, B5BB6C790F89426400444FBF /* version.cpp in Sources */, + 916719051CADABC000B055A9 /* floating_point_emulation.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5187,20 +5803,20 @@ B597C49A0FACD3CE00CE81F5 /* Debug */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/lib\"", - ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "LOCALEDIR=\\\"translations\\\"", + "LUA_USE_MACOSX=1", + BOOST_TEST_DYN_LINK, + ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", ); + MACH_O_TYPE = mh_execute; PRODUCT_NAME = unit_tests; }; name = Debug; @@ -5208,21 +5824,18 @@ B597C49B0FACD3CE00CE81F5 /* Release */ = { isa = XCBuildConfiguration; buildSettings = { - ALWAYS_SEARCH_USER_PATHS = YES; COPY_PHASE_STRIP = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/lib\"", - ); GCC_PREPROCESSOR_DEFINITIONS = ( - BOOST_TEST_DYN_LINK, "LOCALEDIR=\\\"translations\\\"", + "LUA_USE_MACOSX=1", + BOOST_TEST_DYN_LINK, ); INSTALL_PATH = /usr/local/bin; LIBRARY_SEARCH_PATHS = ( "$(inherited)", "\"$(SRCROOT)/lib\"", ); + MACH_O_TYPE = mh_execute; PRODUCT_NAME = unit_tests; }; name = Release; @@ -5272,14 +5885,8 @@ buildSettings = { COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)\"", - "\"$(SRCROOT)/lib\"", - ); GCC_DYNAMIC_NO_PIC = NO; GCC_ENABLE_FIX_AND_CONTINUE = YES; - GCC_OPTIMIZATION_LEVEL = 0; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -5288,33 +5895,14 @@ "HAVE_LIBPNG=1", "HAVE_HISTORY=1", ); - HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/lib\"", - "$(PROJECT_DIR)/lib", - ); - OTHER_CPLUSPLUSFLAGS = ( - "$(OTHER_CFLAGS)", - "-isystem", - ./Headers, - ); OTHER_LDFLAGS = ( "-lz", "-lbz2", "-lreadline", ); PRODUCT_NAME = Wesnoth; - WARNING_CFLAGS = ( - "-Werror=format", - "-Werror=missing-braces", - "-Werror=return-type", - "-Werror=missing-field-initializers", - "-Werror=sign-compare", - "-Werror=switch", - ); WRAPPER_EXTENSION = app; }; name = Debug; @@ -5324,11 +5912,6 @@ buildSettings = { ALWAYS_SEARCH_USER_PATHS = YES; COMBINE_HIDPI_IMAGES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/lib\"", - ); - GCC_OPTIMIZATION_LEVEL = s; GCC_PRECOMPILE_PREFIX_HEADER = YES; GCC_PREFIX_HEADER = ""; GCC_PREPROCESSOR_DEFINITIONS = ( @@ -5338,33 +5921,14 @@ "HAVE_HISTORY=1", ); GCC_WARN_UNUSED_VARIABLE = NO; - HEADER_SEARCH_PATHS = "$(inherited)"; INFOPLIST_FILE = Info.plist; INSTALL_PATH = "$(HOME)/Applications"; - LIBRARY_SEARCH_PATHS = ( - "$(inherited)", - "\"$(SRCROOT)/lib\"", - "$(PROJECT_DIR)/lib", - ); - "OTHER_CPLUSPLUSFLAGS[arch=*]" = ( - "$(OTHER_CFLAGS)", - "-isystem", - ./Headers, - ); OTHER_LDFLAGS = ( "-lz", "-lbz2", "-lreadline", ); PRODUCT_NAME = Wesnoth; - WARNING_CFLAGS = ( - "-Werror=format", - "-Werror=missing-braces", - "-Werror=return-type", - "-Werror=missing-field-initializers", - "-Werror=sign-compare", - "-Werror=switch", - ); WRAPPER_EXTENSION = app; }; name = Release; @@ -5398,10 +5962,8 @@ GCC_WARN_UNUSED_VALUE = YES; GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( - ../.., ../../src, ./Headers, - ./Headers/lua_5.1.4, "./Headers/glib-2.0", ./Headers/cairo, ./lib/SDL2.framework/Headers, @@ -5451,10 +6013,8 @@ ); GCC_WARN_UNUSED_VARIABLE = YES; HEADER_SEARCH_PATHS = ( - ../.., ../../src, ./Headers, - ./Headers/lua_5.1.4, "./Headers/glib-2.0", ./Headers/cairo, ./lib/SDL2.framework/Headers, diff --git a/src/tests/main.cpp b/src/tests/main.cpp index 5a1f53cf43d7..8ccea5ba4f3f 100644 --- a/src/tests/main.cpp +++ b/src/tests/main.cpp @@ -17,6 +17,10 @@ #define BOOST_TEST_MODULE wesnoth unit tests master suite +#ifndef BOOST_TEST_DYN_LINK +#error Compiler misconfiguration - must define BOOST_TEST_DYN_LINK +#endif + #include #include diff --git a/src/tests/test_network_worker.cpp b/src/tests/test_network_worker.cpp index a5951bdc2fb4..74682fcba00c 100644 --- a/src/tests/test_network_worker.cpp +++ b/src/tests/test_network_worker.cpp @@ -111,7 +111,7 @@ BOOST_AUTO_TEST_CASE( test_send_client ) } -void try_send_random_seed ( const std::string seed_str, const unsigned int random_calls) +static void try_send_random_seed ( const std::string seed_str, const unsigned int random_calls) { config cfg_send; config& child = cfg_send.add_child("command"); From e7cb3f500c52becc0b4d45c71f0c6259c8656f51 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 17:37:52 -0400 Subject: [PATCH 092/240] XCode: Fix dynamic link errors in unit tests --- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 15 +++ .../xcschemes/unit_tests.xcscheme | 102 ++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 projectfiles/Xcode/Wesnoth.xcodeproj/xcshareddata/xcschemes/unit_tests.xcscheme diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 1a27bb0cabfd..a2110c9ce1bf 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -71,6 +71,8 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 911F2DAD1BA086A400E3102E /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAB1BA086A400E3102E /* window.cpp */; }; 911F2DB01BA086FA00E3102E /* alpha.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAE1BA086F900E3102E /* alpha.cpp */; }; + 911F47171CADC83800F47035 /* libboost_unit_test_frameworkw.dylib in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = 91E355621CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib */; }; + 911F47181CADCF3F00F47035 /* libboost_program_optionsw.dylib in Copy Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5213AD4E35003C701D /* libboost_program_optionsw.dylib */; }; 9122417C1CAAB7B7008B347F /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9122417A1CAAB7B7008B347F /* loadscreen.cpp */; }; 91273E8F1C7BF1D7005E7F81 /* _main.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E721C7BF1C0005E7F81 /* _main.cfg */; }; 91273E901C7BF1D7005E7F81 /* advanced_preferences.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E731C7BF1C0005E7F81 /* advanced_preferences.cfg */; }; @@ -1277,6 +1279,18 @@ /* End PBXContainerItemProxy section */ /* Begin PBXCopyFilesBuildPhase section */ + 911F47161CADC81000F47035 /* Copy Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = TestFrameworks; + dstSubfolderSpec = 16; + files = ( + 911F47171CADC83800F47035 /* libboost_unit_test_frameworkw.dylib in Copy Frameworks */, + 911F47181CADCF3F00F47035 /* libboost_program_optionsw.dylib in Copy Frameworks */, + ); + name = "Copy Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; 91273E191C7BF105005E7F81 /* Copy Data Files */ = { isa = PBXCopyFilesBuildPhase; buildActionMask = 2147483647; @@ -4547,6 +4561,7 @@ buildPhases = ( B597C4950FACD3CD00CE81F5 /* Sources */, B597C4960FACD3CD00CE81F5 /* Frameworks */, + 911F47161CADC81000F47035 /* Copy Frameworks */, ); buildRules = ( ); diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/xcshareddata/xcschemes/unit_tests.xcscheme b/projectfiles/Xcode/Wesnoth.xcodeproj/xcshareddata/xcschemes/unit_tests.xcscheme new file mode 100644 index 000000000000..6c2630f3a259 --- /dev/null +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/xcshareddata/xcschemes/unit_tests.xcscheme @@ -0,0 +1,102 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 9c442ebb4b1bcc7f7261f424f9d7bcaf5a84b638 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 18:47:13 -0400 Subject: [PATCH 093/240] XCode: Fix wesnothd build A unit test file had been accidentally included in the build, leading to link errors. --- projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index a2110c9ce1bf..6aa29f1cd703 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -132,7 +132,6 @@ 916719021CADAA1D00B055A9 /* test_gui2.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3562C1CACA6E600774252 /* test_gui2.cpp */; }; 916719031CADAA1D00B055A9 /* test_save_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B597C4CF0FACD43B00CE81F5 /* test_save_dialog.cpp */; }; 916719041CADAA1D00B055A9 /* visitor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E3562D1CACA6E600774252 /* visitor.cpp */; }; - 916719051CADABC000B055A9 /* floating_point_emulation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91E356081CACA6CB00774252 /* floating_point_emulation.cpp */; }; 916719061CADABEA00B055A9 /* game_data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC387E68195AFB1F00FC0342 /* game_data.cpp */; }; 916719071CADAC0D00B055A9 /* libboost_randomw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC64D75C1A085C990092EF75 /* libboost_randomw.dylib */; }; 916719081CADAC2800B055A9 /* apple_notification.mm in Sources */ = {isa = PBXBuildFile; fileRef = F40A13BB1A3A88BA00C4D071 /* apple_notification.mm */; }; @@ -5789,7 +5788,6 @@ ECAA3FE818E0E4EF002E8998 /* unicode.cpp in Sources */, B5BB6B830F893E7500444FBF /* user_handler.cpp in Sources */, B5BB6C790F89426400444FBF /* version.cpp in Sources */, - 916719051CADABC000B055A9 /* floating_point_emulation.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; From b6282d866293c615e2fa4ebff06b4600da3ac663 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 03:09:29 +0200 Subject: [PATCH 094/240] use c++11 heterogeneous map lookups in config if possible. this means that codes like cfg.child("abcd") or cfg["abcd"] won't create a temporary std::string anymore. At least when cfg is const. --- src/config.cpp | 60 +++++++++++++++++++++++++++++++++++++++++++++++++- src/config.hpp | 45 +++++++++++++++++++++++++++++++++++-- 2 files changed, 102 insertions(+), 3 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index d4a086a5b08b..78b650c5390e 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -42,6 +42,24 @@ static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) #define DBG_CF LOG_STREAM(debug, log_config) + +#ifdef USE_HETEROGENOUS_LOOKUPS +struct config_simple_key +{ + const char* str; + int len; + + friend bool operator<(const config_simple_key& l, const std::string& r) + { + return r.compare(0, r.size(), l.str, l.len) > 0; + } + friend bool operator<(const std::string& l, const config_simple_key& r) + { + return l.compare(0, l.size(), r.str, r.len) < 0; + } +}; +#endif + struct tconfig_implementation { /** @@ -653,7 +671,34 @@ config &config::child(const std::string& key, int n) if (n < 0) n = i->second.size() + n; if(size_t(n) < i->second.size()) { return *i->second[n]; - } else { + } + else { + DBG_CF << "The config object has only »" << i->second.size() + << "« children named »" << key + << "«; request for the index »" << n << "« cannot be honored.\n"; + + return invalid; + } +} + +#ifdef USE_HETEROGENOUS_LOOKUPS +config &config::child_impl(const char* key, int len, int n) +{ + check_valid(); + + const child_map::const_iterator i = children.find(config_simple_key{ key, len }); + if (i == children.end()) { + DBG_CF << "The config object has no child named »" + << key << "«.\n"; + + return invalid; + } + + if (n < 0) n = i->second.size() + n; + if (size_t(n) < i->second.size()) { + return *i->second[n]; + } + else { DBG_CF << "The config object has only »" << i->second.size() << "« children named »" << key << "«; request for the index »" << n << "« cannot be honored.\n"; @@ -661,6 +706,7 @@ config &config::child(const std::string& key, int n) return invalid; } } +#endif config& config::child(const std::string& key, const std::string& parent) { @@ -877,6 +923,18 @@ const config::attribute_value &config::operator[](const std::string &key) const return empty_attribute; } +#ifdef USE_HETEROGENOUS_LOOKUPS +const config::attribute_value& config::get_attribute(const char* key, int len) const +{ + check_valid(); + + const attribute_map::const_iterator i = values.find(config_simple_key { key, len }); + if (i != values.end()) return i->second; + static const attribute_value empty_attribute; + return empty_attribute; +} + +#endif const config::attribute_value *config::get(const std::string &key) const { check_valid(); diff --git a/src/config.hpp b/src/config.hpp index fceeccfd1bdd..2806b1222ac8 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -50,6 +50,11 @@ #include "exceptions.hpp" #include "tstring.hpp" + //TODO: enable for gcc 5.0 and clang 3.4 +#if defined(_MSC_VER) && _MSC_VER >= 1900 +# define USE_HETEROGENOUS_LOOKUPS +#endif + class config; class enum_tag; @@ -99,7 +104,11 @@ class config { return this != &invalid; } typedef std::vector child_list; - typedef std::map child_map; + typedef std::map +#endif + > child_map; struct const_child_iterator; @@ -357,7 +366,13 @@ class config static const std::string s_true, s_false; }; - typedef std::map attribute_map; + typedef std::map< + std::string + , attribute_value +#ifdef USE_HETEROGENOUS_LOOKUPS + , std::less<> +#endif + > attribute_map; typedef attribute_map::value_type attribute; struct const_attribute_iterator @@ -415,6 +430,12 @@ class config */ config &child(const std::string& key, int n = 0); +#ifdef USE_HETEROGENOUS_LOOKUPS + template + config &child(const char(&key)[N], int n = 0) + { return child_impl(key, N - 1, n); } + config &child_impl(const char* key, int len, int n = 0); +#endif /** * Returns the nth child with the given @a key, or * a reference to an invalid config if there is none. @@ -424,6 +445,11 @@ class config const config &child(const std::string& key, int n = 0) const { return const_cast(this)->child(key, n); } +#ifdef USE_HETEROGENOUS_LOOKUPS + template + const config &child(const char(&key)[N], int n = 0) const + { return const_cast(this)->child_impl(key, N- 1, n); } +#endif /** * Returns a mandatory child node. * @@ -478,6 +504,18 @@ class config */ const attribute_value &operator[](const std::string &key) const; +#ifdef USE_HETEROGENOUS_LOOKUPS + /** + * Returns a reference to the attribute with the given @a key + * or to a dummy empty attribute if it does not exist. + */ + template + inline const attribute_value &operator[](const char (&key)[N]) const + { + //-1 for the terminating null character. + return get_attribute(key, N - 1); + } +#endif /** * Returns a pointer to the attribute with the given @a key * or nullptr if it does not exist. @@ -683,6 +721,9 @@ class config void swap(config& cfg); private: +#ifdef USE_HETEROGENOUS_LOOKUPS + const attribute_value& get_attribute(const char* key, int len) const; +#endif /** * Removes the child at position @a pos of @a l. */ From bc20a3d7d9d543ce0cc9b630ab8695e5b927452c Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 03:19:37 +0200 Subject: [PATCH 095/240] remove a c++11 #ifdef --- src/config.cpp | 2 -- src/config.hpp | 2 -- 2 files changed, 4 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index 78b650c5390e..fbe82097c9cc 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -761,7 +761,6 @@ config& config::add_child(const std::string& key, const config& val) return *v.back(); } -#ifdef HAVE_CXX11 config &config::add_child(const std::string &key, config &&val) { check_valid(val); @@ -771,7 +770,6 @@ config &config::add_child(const std::string &key, config &&val) ordered_children.push_back(child_pos(children.find(key), v.size() - 1)); return *v.back(); } -#endif config &config::add_child_at(const std::string &key, const config &val, unsigned index) { diff --git a/src/config.hpp b/src/config.hpp index 2806b1222ac8..113f4b35f80a 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -488,9 +488,7 @@ class config config& add_child(const std::string& key, const config& val); config& add_child_at(const std::string &key, const config &val, unsigned index); -#ifdef HAVE_CXX11 config &add_child(const std::string &key, config &&val); -#endif /** * Returns a reference to the attribute with the given @a key. From 51957589ed9a5ae18484301b140032f4fa2d1332 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 1 Apr 2016 12:27:06 +1100 Subject: [PATCH 096/240] Removed some C++11 include guards I missed --- src/gui/auxiliary/filter.hpp | 11 ----------- src/units/map.hpp | 14 -------------- src/variable.hpp | 6 ------ 3 files changed, 31 deletions(-) diff --git a/src/gui/auxiliary/filter.hpp b/src/gui/auxiliary/filter.hpp index 121fd26d443f..e372a6bb39de 100644 --- a/src/gui/auxiliary/filter.hpp +++ b/src/gui/auxiliary/filter.hpp @@ -25,9 +25,6 @@ #include "util.hpp" #include "serialization/string_utils.hpp" #include "serialization/unicode.hpp" -#ifndef HAVE_CXX11 -#include // needed for the at() emulation -#endif namespace gui2 { @@ -70,16 +67,8 @@ inline bool contains(const tpane::titem& item, const std::string& tag, const ttext_box& text_box) { -#ifdef HAVE_CXX11 return item.tags.at(tag).find(utf8::lowercase(text_box.text())) != std::string::npos; -#else - std::map::const_iterator it = item.tags.find(tag); - if(it == item.tags.end()) { - throw std::out_of_range("Key »" + tag + "« doesn't exist."); - } - return it->second.find(utf8::lowercase(text_box.text())) != std::string::npos; -#endif } } // namespace gui2 diff --git a/src/units/map.hpp b/src/units/map.hpp index 98feed58810d..b7781a69b12a 100644 --- a/src/units/map.hpp +++ b/src/units/map.hpp @@ -230,22 +230,8 @@ class unit_map { return (valid_for_dereference() && i_->second.unit); } -#ifndef HAVE_CXX11 - struct safe_bool_impl { void nonnull() {} }; - /** - * Used as the return type of the conversion operator for boolean contexts. - * Needed, since the compiler would otherwise consider the following - * conversion (C legacy): cfg["abc"] -> "abc"[bool(cfg)] -> 'b' - */ - typedef void (safe_bool_impl::*safe_bool)(); - - operator safe_bool() const - { return valid() ? &safe_bool_impl::nonnull : nullptr; } -#else explicit operator bool() const { return valid(); } -#endif - bool operator==(const iterator_base &rhs) const { return (tank_ == rhs.tank_) && ( i_ == rhs.i_ ); } bool operator!=(const iterator_base &rhs) const { return !operator==(rhs); } diff --git a/src/variable.hpp b/src/variable.hpp index a2b1264a1df9..a1ca805e1476 100644 --- a/src/variable.hpp +++ b/src/variable.hpp @@ -47,12 +47,6 @@ class vconfig friend class std::pair; #endif -#ifndef HAVE_CXX11 - struct safe_bool_impl { void nonnull() {} }; - /// Used as the return type of the conversion operator for boolean contexts. - typedef void (safe_bool_impl::*safe_bool)(); -#endif - vconfig(); vconfig(const config & cfg, const boost::shared_ptr & cache); public: From 1c5f6024fd2274611b994ef51c476b251756eb2b Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 20:43:07 -0400 Subject: [PATCH 097/240] Reduce needlessly large closures --- src/game_config_manager.cpp | 3 ++- src/game_launcher.cpp | 2 +- src/wesnoth.cpp | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index 3edf4b54c6b2..9132301b9348 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -135,10 +135,11 @@ void game_config_manager::load_game_config_with_loadscreen(FORCE_RELOAD_CONFIG f } } - gui2::tloadscreen::display(video_, [=]() { + gui2::tloadscreen::display(video_, [this, force_reload, classification]() { load_game_config(force_reload, classification); }); } + void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, game_classification const* classification) { diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index f9ff48d6b4df..3fa38547e6bb 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -1011,7 +1011,7 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload) return; } - gui2::tloadscreen::display(video(), [=]() { + gui2::tloadscreen::display(video(), [this, reload]() { gui2::tloadscreen::progress("load data"); if(reload == RELOAD_DATA) { diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index d986613889f1..20020ffe0de1 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -644,7 +644,7 @@ static int do_gameloop(const std::vector& args) game_config_manager config_manager(cmdline_opts, game->video(), game->jump_to_editor()); - gui2::tloadscreen::display(game->video(), [&]() { + gui2::tloadscreen::display(game->video(), [&res, &config_manager]() { gui2::tloadscreen::progress("load config"); res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); }); @@ -851,7 +851,7 @@ static int do_gameloop(const std::vector& args) } continue; } else if(res == gui2::ttitle_screen::RELOAD_GAME_DATA) { - gui2::tloadscreen::display(game->video(), [&]() { + gui2::tloadscreen::display(game->video(), [&config_manager]() { config_manager.reload_changed_game_config(); image::flush_cache(); }); From a5cd2c7f4ad43f21a6e94c8f7fd634bea9d82a7b Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 21:09:48 -0400 Subject: [PATCH 098/240] Restore loadscreen translatable stage messages --- src/gui/dialogs/loadscreen.cpp | 47 ++++++++++++++++++++++++++++++---- src/gui/dialogs/loadscreen.hpp | 6 ++--- src/play_controller.cpp | 2 +- src/wesnoth.cpp | 14 +++++----- 4 files changed, 53 insertions(+), 16 deletions(-) diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 30b96cd07c76..c5fe823235c9 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -11,6 +11,11 @@ See the COPYING file for more details. */ +/** + * @file + * Screen with logo and loading status info during program-startup. + */ + #define GETTEXT_DOMAIN "wesnoth-lib" #include "cursor.hpp" @@ -22,9 +27,37 @@ #include "video.hpp" #include "cursor.hpp" +#include "gettext.hpp" +#include "log.hpp" #include #include +static lg::log_domain log_loadscreen("loadscreen"); +#define ERR_LS LOG_STREAM(err, log_loadscreen) +#define WRN_LS LOG_STREAM(warn, log_loadscreen) +#define LOG_LS LOG_STREAM(info, log_loadscreen) +#define DBG_LS LOG_STREAM(debug, log_loadscreen) + +static const std::map stages = +{ + { "build terrain", N_("Building terrain rules") }, + { "create cache", N_("Reading files and creating cache") }, + { "init display", N_("Initializing display") }, + { "init fonts", N_("Reinitialize fonts for the current language") }, + { "init teams", N_("Initializing teams") }, + { "init theme", N_("Initializing display") }, + { "load config", N_("Loading game configuration") }, + { "load data", N_("Loading data files") }, + { "load level", N_("Loading level") }, + { "init lua", N_("Initializing scripting engine") }, + { "init whiteboard", N_("Initializing planning mode") }, + { "load unit types", N_("Reading unit files") }, + { "load units", N_("Loading units") }, + { "refresh addons", N_("Searching for installed add-ons") }, + { "start game", N_("Starting game") }, + { "verify cache", N_("Verifying cache") }, +}; + namespace gui2 { @@ -37,8 +70,8 @@ tloadscreen::tloadscreen(boost::function f) , work_(f) , worker_() , cursor_setter_() - , current_stage_(nullptr) - , current_visible_stage_(nullptr) + , current_stage_() + , current_visible_stage_() { current_load = this; } @@ -79,9 +112,13 @@ void tloadscreen::progress(const char* stage) if(!current_load) { return; } - // Currently this is a no-op stub if(stage) { - current_load->current_stage_ = stage; + auto iter = stages.find(stage); + if(iter == stages.end()) { + WRN_LS << "Stage ID '" << stage << "' missing description." << std::endl; + return; + } + current_load->current_stage_ = iter; } } @@ -95,7 +132,7 @@ void tloadscreen::timer_callback(twindow& window) if (current_stage_ != current_visible_stage_) { current_visible_stage_ = current_stage_; - progress_stage_label_->set_label(current_visible_stage_); + progress_stage_label_->set_label(t_string(current_stage_->second, "wesnoth-lib") + "..."); } ++animation_counter_; if (animation_counter_ % 2 == 0) { diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 2894198f47a2..84f7f53f2a40 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -18,6 +18,7 @@ #include #include +#include class CVideo; namespace boost @@ -77,9 +78,8 @@ class tloadscreen : public tdialog tlabel* animation_label_; static tloadscreen* current_load; - //Note we cannot use std::strings here unless we we explicitly use mutexes. - const char* current_stage_; - const char* current_visible_stage_; + std::map::const_iterator current_stage_; + std::map::const_iterator current_visible_stage_; }; } // namespace gui2 diff --git a/src/play_controller.cpp b/src/play_controller.cpp index 72f2141a932e..b0c62778449b 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -243,6 +243,7 @@ void play_controller::init(CVideo& video, const config& level) resources::tunnels = gamestate().pathfind_manager_.get(); LOG_NG << "initializing whiteboard..." << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("init whiteboard"); whiteboard_manager_.reset(new wb::manager()); resources::whiteboard = whiteboard_manager_; @@ -272,7 +273,6 @@ void play_controller::init(CVideo& video, const config& level) LOG_NG << "done initializing display... " << (SDL_GetTicks() - ticks()) << std::endl; LOG_NG << "building gamestate to gui and whiteboard... " << (SDL_GetTicks() - ticks()) << std::endl; - gui2::tloadscreen::progress("init whiteboard"); // This *needs* to be created before the show_intro and show_map_scene // as that functions use the manager state_of_game // Has to be done before registering any events! diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 20020ffe0de1..24e848406f35 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -636,38 +636,38 @@ static int do_gameloop(const std::vector& args) SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); #endif - gui2::tloadscreen::progress("init gui"); // Does nothing since there's no loadscreen yet gui2::init(); const gui2::event::tmanager gui_event_manager; - game_config_manager config_manager(cmdline_opts, game->video(), game->jump_to_editor()); gui2::tloadscreen::display(game->video(), [&res, &config_manager]() { gui2::tloadscreen::progress("load config"); res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); - }); if(res == false) { std::cerr << "could not initialize game config\n"; - return 1; + return; } gui2::tloadscreen::progress("init fonts"); res = font::load_font_config(); if(res == false) { std::cerr << "could not re-initialize fonts for the current language\n"; - return 1; + return; } gui2::tloadscreen::progress("refresh addons"); refresh_addon_version_info_cache(); + }); + + if(res == false) { + return 1; + } config tips_of_day; - gui2::tloadscreen::progress("titlescreen"); - LOG_CONFIG << "time elapsed: "<< (SDL_GetTicks() - start_ticks) << " ms\n"; plugins_manager plugins_man(new application_lua_kernel(&game->video())); From 1368a05ee996ba9404b97bac1236c9bf36b1bb2d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 21:12:31 -0400 Subject: [PATCH 099/240] Correct indentation --- src/game_launcher.cpp | 16 ++--- src/play_controller.cpp | 146 ++++++++++++++++++++-------------------- src/wesnoth.cpp | 22 +++--- 3 files changed, 92 insertions(+), 92 deletions(-) diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 3fa38547e6bb..4962666a17b0 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -1013,15 +1013,15 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload) gui2::tloadscreen::display(video(), [this, reload]() { - gui2::tloadscreen::progress("load data"); - if(reload == RELOAD_DATA) { - try { - game_config_manager::get()-> - load_game_config_for_game(state_.classification()); - } catch(config::error&) { - return; + gui2::tloadscreen::progress("load data"); + if(reload == RELOAD_DATA) { + try { + game_config_manager::get()-> + load_game_config_for_game(state_.classification()); + } catch(config::error&) { + return; + } } - } }); try { diff --git a/src/play_controller.cpp b/src/play_controller.cpp index b0c62778449b..08bc421721c9 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -225,88 +225,88 @@ void play_controller::init(CVideo& video, const config& level) { gui2::tloadscreen::display(video, [this, &video, &level]() { - gui2::tloadscreen::progress("load level"); - - LOG_NG << "initializing game_state..." << (SDL_GetTicks() - ticks()) << std::endl; - gamestate_.reset(new game_state(level, *this, tdata_)); - - resources::gameboard = &gamestate().board_; - resources::gamedata = &gamestate().gamedata_; - resources::teams = &gamestate().board_.teams_; - resources::tod_manager = &gamestate().tod_manager_; - resources::units = &gamestate().board_.units_; - resources::filter_con = &gamestate(); - resources::undo_stack = &undo_stack(); - resources::game_events = gamestate().events_manager_.get(); - - gamestate_->init(level, *this); - resources::tunnels = gamestate().pathfind_manager_.get(); - - LOG_NG << "initializing whiteboard..." << (SDL_GetTicks() - ticks()) << std::endl; - gui2::tloadscreen::progress("init whiteboard"); - whiteboard_manager_.reset(new wb::manager()); - resources::whiteboard = whiteboard_manager_; - - LOG_NG << "loading units..." << (SDL_GetTicks() - ticks()) << std::endl; - gui2::tloadscreen::progress("load units"); - preferences::encounter_all_content(gamestate().board_); - - LOG_NG << "initializing theme... " << (SDL_GetTicks() - ticks()) << std::endl; - gui2::tloadscreen::progress("init theme"); - const config& theme_cfg = controller_base::get_theme(game_config_, level["theme"]); - - LOG_NG << "building terrain rules... " << (SDL_GetTicks() - ticks()) << std::endl; - gui2::tloadscreen::progress("build terrain"); - gui_.reset(new game_display(gamestate().board_, video, whiteboard_manager_, *gamestate().reports_, gamestate().tod_manager_, theme_cfg, level)); - if (!gui_->video().faked()) { - if (saved_game_.mp_settings().mp_countdown) - gui_->get_theme().modify_label("time-icon", _ ("time left for current turn")); - else - gui_->get_theme().modify_label("time-icon", _ ("current local time")); - } + gui2::tloadscreen::progress("load level"); + + LOG_NG << "initializing game_state..." << (SDL_GetTicks() - ticks()) << std::endl; + gamestate_.reset(new game_state(level, *this, tdata_)); + + resources::gameboard = &gamestate().board_; + resources::gamedata = &gamestate().gamedata_; + resources::teams = &gamestate().board_.teams_; + resources::tod_manager = &gamestate().tod_manager_; + resources::units = &gamestate().board_.units_; + resources::filter_con = &gamestate(); + resources::undo_stack = &undo_stack(); + resources::game_events = gamestate().events_manager_.get(); + + gamestate_->init(level, *this); + resources::tunnels = gamestate().pathfind_manager_.get(); + + LOG_NG << "initializing whiteboard..." << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("init whiteboard"); + whiteboard_manager_.reset(new wb::manager()); + resources::whiteboard = whiteboard_manager_; + + LOG_NG << "loading units..." << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("load units"); + preferences::encounter_all_content(gamestate().board_); + + LOG_NG << "initializing theme... " << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("init theme"); + const config& theme_cfg = controller_base::get_theme(game_config_, level["theme"]); + + LOG_NG << "building terrain rules... " << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("build terrain"); + gui_.reset(new game_display(gamestate().board_, video, whiteboard_manager_, *gamestate().reports_, gamestate().tod_manager_, theme_cfg, level)); + if (!gui_->video().faked()) { + if (saved_game_.mp_settings().mp_countdown) + gui_->get_theme().modify_label("time-icon", _ ("time left for current turn")); + else + gui_->get_theme().modify_label("time-icon", _ ("current local time")); + } - gui2::tloadscreen::progress("init display"); - mouse_handler_.set_gui(gui_.get()); - menu_handler_.set_gui(gui_.get()); - resources::screen = gui_.get(); + gui2::tloadscreen::progress("init display"); + mouse_handler_.set_gui(gui_.get()); + menu_handler_.set_gui(gui_.get()); + resources::screen = gui_.get(); - LOG_NG << "done initializing display... " << (SDL_GetTicks() - ticks()) << std::endl; + LOG_NG << "done initializing display... " << (SDL_GetTicks() - ticks()) << std::endl; - LOG_NG << "building gamestate to gui and whiteboard... " << (SDL_GetTicks() - ticks()) << std::endl; - // This *needs* to be created before the show_intro and show_map_scene - // as that functions use the manager state_of_game - // Has to be done before registering any events! - gamestate().bind(whiteboard_manager_.get(), gui_.get()); - gui2::tloadscreen::progress("init lua"); - resources::lua_kernel = gamestate().lua_kernel_.get(); + LOG_NG << "building gamestate to gui and whiteboard... " << (SDL_GetTicks() - ticks()) << std::endl; + // This *needs* to be created before the show_intro and show_map_scene + // as that functions use the manager state_of_game + // Has to be done before registering any events! + gamestate().bind(whiteboard_manager_.get(), gui_.get()); + gui2::tloadscreen::progress("init lua"); + resources::lua_kernel = gamestate().lua_kernel_.get(); - if(gamestate().first_human_team_ != -1) { - gui_->set_team(gamestate().first_human_team_); - } - else if(is_observer()) { - // Find first team that is allowed to be observed. - // If not set here observer would be without fog until - // the first turn of observable side - size_t i; - for (i=0;i < gamestate().board_.teams().size();++i) - { - if (!gamestate().board_.teams()[i].get_disallow_observers()) + if(gamestate().first_human_team_ != -1) { + gui_->set_team(gamestate().first_human_team_); + } + else if(is_observer()) { + // Find first team that is allowed to be observed. + // If not set here observer would be without fog until + // the first turn of observable side + size_t i; + for (i=0;i < gamestate().board_.teams().size();++i) { - gui_->set_team(i); + if (!gamestate().board_.teams()[i].get_disallow_observers()) + { + gui_->set_team(i); + } } } - } - init_managers(); - gui2::tloadscreen::progress("start game"); - //loadscreen_manager->reset(); - gamestate().gamedata_.set_phase(game_data::PRELOAD); - gamestate().lua_kernel_->initialize(level); + init_managers(); + gui2::tloadscreen::progress("start game"); + //loadscreen_manager->reset(); + gamestate().gamedata_.set_phase(game_data::PRELOAD); + gamestate().lua_kernel_->initialize(level); - plugins_context_.reset(new plugins_context("Game")); - plugins_context_->set_callback("save_game", boost::bind(&play_controller::save_game_auto, this, boost::bind(get_str, _1, "filename" )), true); - plugins_context_->set_callback("save_replay", boost::bind(&play_controller::save_replay_auto, this, boost::bind(get_str, _1, "filename" )), true); - plugins_context_->set_callback("quit", throw_end_level(), false); + plugins_context_.reset(new plugins_context("Game")); + plugins_context_->set_callback("save_game", boost::bind(&play_controller::save_game_auto, this, boost::bind(get_str, _1, "filename" )), true); + plugins_context_->set_callback("save_replay", boost::bind(&play_controller::save_replay_auto, this, boost::bind(get_str, _1, "filename" )), true); + plugins_context_->set_callback("quit", throw_end_level(), false); }); //Do this after the loadingscreen, so that ita happens in the main thread. gui_->join(); diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 24e848406f35..844a0582beb1 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -646,20 +646,20 @@ static int do_gameloop(const std::vector& args) gui2::tloadscreen::progress("load config"); res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); - if(res == false) { - std::cerr << "could not initialize game config\n"; - return; - } - gui2::tloadscreen::progress("init fonts"); + if(res == false) { + std::cerr << "could not initialize game config\n"; + return; + } + gui2::tloadscreen::progress("init fonts"); - res = font::load_font_config(); - if(res == false) { - std::cerr << "could not re-initialize fonts for the current language\n"; - return; + res = font::load_font_config(); + if(res == false) { + std::cerr << "could not re-initialize fonts for the current language\n"; + return; } - gui2::tloadscreen::progress("refresh addons"); - refresh_addon_version_info_cache(); + gui2::tloadscreen::progress("refresh addons"); + refresh_addon_version_info_cache(); }); if(res == false) { From d9eab21bd0123c3c2271a6f3f27bfe8318ed36cf Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 21:25:45 -0400 Subject: [PATCH 100/240] Remove redundant gamestate::bind() --- src/game_state.cpp | 5 ----- src/game_state.hpp | 2 -- src/play_controller.cpp | 4 ++-- 3 files changed, 2 insertions(+), 9 deletions(-) diff --git a/src/game_state.cpp b/src/game_state.cpp index 327bf55a228c..e7a0f2d5acaa 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -222,11 +222,6 @@ void game_state::init(const config& level, play_controller & pc) lua_kernel_.reset(new game_lua_kernel(nullptr, *this, pc, *reports_)); } -void game_state::bind(wb::manager *, game_display * gd) -{ - set_game_display(gd); -} - void game_state::set_game_display(game_display * gd) { lua_kernel_->set_game_display(gd); diff --git a/src/game_state.hpp b/src/game_state.hpp index 63f50be362f1..03df263d7b9a 100644 --- a/src/game_state.hpp +++ b/src/game_state.hpp @@ -82,8 +82,6 @@ class game_state : public filter_context void init(const config& level, play_controller &); - void bind(wb::manager *, game_display *); - void set_game_display(game_display *); void write(config& cfg) const; diff --git a/src/play_controller.cpp b/src/play_controller.cpp index 08bc421721c9..c7496ebef4b5 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -276,7 +276,7 @@ void play_controller::init(CVideo& video, const config& level) // This *needs* to be created before the show_intro and show_map_scene // as that functions use the manager state_of_game // Has to be done before registering any events! - gamestate().bind(whiteboard_manager_.get(), gui_.get()); + gamestate().set_game_display(gui_.get()); gui2::tloadscreen::progress("init lua"); resources::lua_kernel = gamestate().lua_kernel_.get(); @@ -336,7 +336,7 @@ void play_controller::reset_gamestate(const config& level, int replay_pos) resources::game_events = gamestate().events_manager_.get(); gamestate_->init(level, *this); - gamestate().bind(whiteboard_manager_.get(), gui_.get()); + gamestate().set_game_display(gui_.get()); resources::lua_kernel = gamestate().lua_kernel_.get(); resources::tunnels = gamestate().pathfind_manager_.get(); From e35e46ec2e517f0f2be1fe2c788d05b807f58863 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 21:39:04 -0400 Subject: [PATCH 101/240] Enable commented C++11 xBRZ code --- src/xBRZ/xbrz.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/src/xBRZ/xbrz.cpp b/src/xBRZ/xbrz.cpp index 96da123eb12f..bddfffca1b54 100644 --- a/src/xBRZ/xbrz.cpp +++ b/src/xBRZ/xbrz.cpp @@ -596,8 +596,7 @@ BlendResult preProcessCorners(const Kernel_4x4& ker, const xbrz::ScalerCfg& cfg) ker.g == ker.k)) return result; - //auto dist = [&](uint32_t col1, uint32_t col2) { return colorDist(col1, col2, cfg.luminanceWeight_); }; - boost::function dist = boost::bind(&colorDist, _1, _2, cfg.luminanceWeight_); + auto dist = [&cfg](uint32_t col1, uint32_t col2) { return colorDist(col1, col2, cfg.luminanceWeight_); }; const int weight = 4; double jg = dist(ker.i, ker.f) + dist(ker.f, ker.c) + dist(ker.n, ker.k) + dist(ker.k, ker.h) + weight * dist(ker.j, ker.g); @@ -685,12 +684,6 @@ int debugPixelY = 84; bool breakIntoDebugger = false; #endif -// non-C++11, non-lambda solution to get a function pointer to comparison of doubles -static bool double_cmp (double a, double b) -{ - return a < b; -} - /* input kernel area naming convention: ------------- @@ -728,17 +721,15 @@ void scalePixel(const Kernel_3x3& ker, if (getBottomR(blend) >= BLEND_NORMAL) { - //auto eq = [&](uint32_t col1, uint32_t col2) { return colorDist(col1, col2, cfg.luminanceWeight_) < cfg.equalColorTolerance_; }; - boost::function eq = boost::bind(&double_cmp, boost::bind(&colorDist, _1, _2, cfg.luminanceWeight_), cfg.equalColorTolerance_); + auto eq = [&cfg](uint32_t col1, uint32_t col2) { return colorDist(col1, col2, cfg.luminanceWeight_) < cfg.equalColorTolerance_; }; - //auto dist = [&](uint32_t col1, uint32_t col2) { return colorDist(col1, col2, cfg.luminanceWeight_); }; - boost::function dist = boost::bind(&colorDist, _1, _2, cfg.luminanceWeight_); + auto dist = [&cfg](uint32_t col1, uint32_t col2) { return colorDist(col1, col2, cfg.luminanceWeight_); }; const uint32_t px = dist(e, f) <= dist(e, h) ? f : h; //choose most similar color OutputMatrix out(target, trgWidth); - bool doLineBlend = true; //const bool doLineBlend = [&]() -> bool + bool doLineBlend = true; { if (getBottomR(blend) >= BLEND_DOMINANT) doLineBlend = true; From 1cc3711996923636e5e979b00dbd9f7e5dbd24d8 Mon Sep 17 00:00:00 2001 From: mattsc Date: Thu, 31 Mar 2016 19:58:15 -0700 Subject: [PATCH 102/240] Xcode project: ignore inconsistent-missing-override warning --- projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj | 1 + 1 file changed, 1 insertion(+) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 6aa29f1cd703..946775f1fa3d 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -5993,6 +5993,7 @@ "-Wall", "-Wno-unused-local-typedefs", "-Wno-unknown-warning-option", + "-Wno-inconsistent-missing-override", "-isystem", ./Headers, ); From 8580245c29c720b2807829e2929358d05513725a Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 22:52:30 -0400 Subject: [PATCH 103/240] Complete config.hpp compiler detection --- src/config.hpp | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/config.hpp b/src/config.hpp index 113f4b35f80a..66dca261352e 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -50,9 +50,20 @@ #include "exceptions.hpp" #include "tstring.hpp" - //TODO: enable for gcc 5.0 and clang 3.4 -#if defined(_MSC_VER) && _MSC_VER >= 1900 -# define USE_HETEROGENOUS_LOOKUPS +#ifdef __clang__ // Check this first, because clang also defines __GNUC__ +# ifdef __apple_build_version__ // Apple clang +# if (__clang_major__ == 5 && __clang_minor__ >= 1) || __clang_major__ > 5 // Apple clang 5.1+ +# define USE_HETEROGENOUS_LOOKUPS +# endif +# else // Non-Apple clang +# if (__clang_major__ == 3 && __clang_minor__ >= 4) || __clang_major__ > 3 // clang 3.4+ +# define USE_HETEROGENOUS_LOOKUPS +# endif +# endif +#elif defined(__GNUC__) && __GNUC__ >= 5 // GCC 5.0+ +# define USE_HETEROGENOUS_LOOKUPS +#elif defined(_MSC_VER) && _MSC_VER >= 1900 // MSVC 2015 +# define USE_HETEROGENOUS_LOOKUPS #endif class config; From 7c767e64025790fe18cf8d05b526e727d8b24cf6 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 31 Mar 2016 23:37:20 -0400 Subject: [PATCH 104/240] tloadscreen: Use atomic access for current stage --- src/gui/dialogs/loadscreen.cpp | 9 +++++---- src/gui/dialogs/loadscreen.hpp | 3 ++- 2 files changed, 7 insertions(+), 5 deletions(-) diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index c5fe823235c9..39e07aa67440 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -118,7 +118,7 @@ void tloadscreen::progress(const char* stage) WRN_LS << "Stage ID '" << stage << "' missing description." << std::endl; return; } - current_load->current_stage_ = iter; + current_load->current_stage_.store(iter, std::memory_order_release); } } @@ -129,10 +129,11 @@ void tloadscreen::timer_callback(twindow& window) if (!worker_ || worker_->timed_join(boost::posix_time::milliseconds(0))) { window.close(); } - if (current_stage_ != current_visible_stage_) + auto stage = current_stage_.load(std::memory_order_acquire); + if (stage != current_visible_stage_) { - current_visible_stage_ = current_stage_; - progress_stage_label_->set_label(t_string(current_stage_->second, "wesnoth-lib") + "..."); + current_visible_stage_ = stage; + progress_stage_label_->set_label(t_string(stage->second, "wesnoth-lib") + "..."); } ++animation_counter_; if (animation_counter_ % 2 == 0) { diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 84f7f53f2a40..0f41514f1d2b 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -19,6 +19,7 @@ #include #include #include +#include class CVideo; namespace boost @@ -78,7 +79,7 @@ class tloadscreen : public tdialog tlabel* animation_label_; static tloadscreen* current_load; - std::map::const_iterator current_stage_; + volatile std::atomic::const_iterator> current_stage_; std::map::const_iterator current_visible_stage_; }; From d958429e27f230bb3eda26c05c56ec84a2ca8696 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 1 Apr 2016 00:33:12 -0400 Subject: [PATCH 105/240] XCode: Update Wesnoth version --- projectfiles/Xcode/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/projectfiles/Xcode/Info.plist b/projectfiles/Xcode/Info.plist index 965e45e555b5..d628c1397383 100644 --- a/projectfiles/Xcode/Info.plist +++ b/projectfiles/Xcode/Info.plist @@ -19,11 +19,11 @@ CFBundlePackageType APPL CFBundleShortVersionString - 1.13.3 + 1.13.5 CFBundleSignature ???? CFBundleVersion - 1.13.3 + 1.13.5 NSHighResolutionCapable NSMainNibFile From 1ff7b5fbcd41bb48fa8a40995f0f140c09a3bc2b Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 1 Apr 2016 00:33:27 -0400 Subject: [PATCH 106/240] XCode: Set Mac App Store category --- projectfiles/Xcode/Info.plist | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projectfiles/Xcode/Info.plist b/projectfiles/Xcode/Info.plist index d628c1397383..efb206a8044b 100644 --- a/projectfiles/Xcode/Info.plist +++ b/projectfiles/Xcode/Info.plist @@ -24,6 +24,8 @@ ???? CFBundleVersion 1.13.5 + LSApplicationCategoryType + public.app-category.strategy-games NSHighResolutionCapable NSMainNibFile From 390aa205168aa589e6bed0f8b14692d0656d4b47 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 1 Apr 2016 01:27:27 -0400 Subject: [PATCH 107/240] Guards around C++14 code --- src/config.hpp | 4 ++++ src/global.hpp | 5 +++++ 2 files changed, 9 insertions(+) diff --git a/src/config.hpp b/src/config.hpp index 66dca261352e..add6c723c7f2 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -50,6 +50,8 @@ #include "exceptions.hpp" #include "tstring.hpp" +#ifdef HAVE_CXX14 + #ifdef __clang__ // Check this first, because clang also defines __GNUC__ # ifdef __apple_build_version__ // Apple clang # if (__clang_major__ == 5 && __clang_minor__ >= 1) || __clang_major__ > 5 // Apple clang 5.1+ @@ -66,6 +68,8 @@ # define USE_HETEROGENOUS_LOOKUPS #endif +#endif + class config; class enum_tag; diff --git a/src/global.hpp b/src/global.hpp index 5395693bb312..f17287dac53a 100644 --- a/src/global.hpp +++ b/src/global.hpp @@ -55,4 +55,9 @@ #define UNUSED(x) ((void)(x)) /* to avoid warnings */ +// To allow using some optional C++14 features +#if __cplusplus >= 201402L +#define HAVE_CXX14 +#endif + #endif //GLOBAL_HPP_INCLUDED From cc115b9d0ed932a59cbae9a60341c348502d138f Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 1 Apr 2016 03:59:55 -0400 Subject: [PATCH 108/240] tloadscreen fixup for MSVC --- src/gui/dialogs/loadscreen.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 0f41514f1d2b..aaadc1530642 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -79,7 +79,7 @@ class tloadscreen : public tdialog tlabel* animation_label_; static tloadscreen* current_load; - volatile std::atomic::const_iterator> current_stage_; + std::atomic::const_iterator> current_stage_; std::map::const_iterator current_visible_stage_; }; From 59a8682b8915a47962c4afcec7c64c11b2e0040e Mon Sep 17 00:00:00 2001 From: Wedge009 Date: Fri, 1 Apr 2016 23:09:29 +1100 Subject: [PATCH 109/240] Trivial comment spelling correction (from PR #640). --- src/log.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/log.hpp b/src/log.hpp index f40cc1d4119c..8e0cbffe3f5c 100644 --- a/src/log.hpp +++ b/src/log.hpp @@ -62,7 +62,7 @@ namespace lg { * Helper class to redirect the output of the logger in a certain scope. * * The main usage of the redirection is for the unit tests to validate the - * ourput on the logger with the expected output. + * output on the logger with the expected output. */ class tredirect_output_setter { From 7e204d16e45f643f729ace1e9c34521d0b0b2cc8 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 16:13:40 +0200 Subject: [PATCH 110/240] fix c++14 compiler detation HAVE_CXX14 is most likeley meaningless on msvc, so we move the msvc out of HAVE_CXX14. Also fixes the indention of the other code. --- src/config.hpp | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/config.hpp b/src/config.hpp index add6c723c7f2..abcbc73d07e7 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -51,25 +51,23 @@ #include "tstring.hpp" #ifdef HAVE_CXX14 - -#ifdef __clang__ // Check this first, because clang also defines __GNUC__ -# ifdef __apple_build_version__ // Apple clang -# if (__clang_major__ == 5 && __clang_minor__ >= 1) || __clang_major__ > 5 // Apple clang 5.1+ -# define USE_HETEROGENOUS_LOOKUPS -# endif -# else // Non-Apple clang -# if (__clang_major__ == 3 && __clang_minor__ >= 4) || __clang_major__ > 3 // clang 3.4+ -# define USE_HETEROGENOUS_LOOKUPS +# ifdef __clang__ // Check this first, because clang also defines __GNUC__ +# ifdef __apple_build_version__ // Apple clang +# if (__clang_major__ == 5 && __clang_minor__ >= 1) || __clang_major__ > 5 // Apple clang 5.1+ +# define USE_HETEROGENOUS_LOOKUPS +# endif +# else // Non-Apple clang +# if (__clang_major__ == 3 && __clang_minor__ >= 4) || __clang_major__ > 3 // clang 3.4+ +# define USE_HETEROGENOUS_LOOKUPS +# endif # endif +# elif defined(__GNUC__) && __GNUC__ >= 5 // GCC 5.0+ +# define USE_HETEROGENOUS_LOOKUPS # endif -#elif defined(__GNUC__) && __GNUC__ >= 5 // GCC 5.0+ -# define USE_HETEROGENOUS_LOOKUPS #elif defined(_MSC_VER) && _MSC_VER >= 1900 // MSVC 2015 # define USE_HETEROGENOUS_LOOKUPS #endif -#endif - class config; class enum_tag; From 9d570b852c6df3e75344997e1b33818a50b2788a Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 16:15:01 +0200 Subject: [PATCH 111/240] fix c++14 compiler detection --- src/config.hpp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/config.hpp b/src/config.hpp index abcbc73d07e7..1707e7a0271f 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -64,7 +64,9 @@ # elif defined(__GNUC__) && __GNUC__ >= 5 // GCC 5.0+ # define USE_HETEROGENOUS_LOOKUPS # endif -#elif defined(_MSC_VER) && _MSC_VER >= 1900 // MSVC 2015 +#endif + +#if defined(_MSC_VER) && _MSC_VER >= 1900 // MSVC 2015 # define USE_HETEROGENOUS_LOOKUPS #endif From 2cfffe8bb6013afc9d97b0006d30266961add311 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 16:31:40 +0200 Subject: [PATCH 112/240] attempt to fix c++14 compilation. --- src/config.hpp | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/config.hpp b/src/config.hpp index 1707e7a0271f..4192306dae25 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -528,6 +528,12 @@ class config //-1 for the terminating null character. return get_attribute(key, N - 1); } + + template + inline attribute_value& operator[](const char (&key)[N]) + { + return (*this)[std::string(key)]; + } #endif /** * Returns a pointer to the attribute with the given @a key From 4645d654c390ceba16223473301c7b6a3dd23761 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 2 Apr 2016 02:26:22 +1100 Subject: [PATCH 113/240] CB: enable building wesnothd alone --- projectfiles/CodeBlocks/wesnothd.cbp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projectfiles/CodeBlocks/wesnothd.cbp b/projectfiles/CodeBlocks/wesnothd.cbp index 18f1635ab270..1f0e18a04975 100644 --- a/projectfiles/CodeBlocks/wesnothd.cbp +++ b/projectfiles/CodeBlocks/wesnothd.cbp @@ -36,6 +36,8 @@ + + From f497d4c919491ccc5d687a77a8fd47b8221b418c Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 2 Apr 2016 02:47:04 +1100 Subject: [PATCH 114/240] tpreferences: fixed accelerated speed slider Apparently, to_string has inconsistent behavior when operating on floating point types, so revert to using lexical_cast. --- src/gui/dialogs/preferences_dialog.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index 988df210e2ce..2d5c474beeb9 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -448,7 +448,7 @@ void tpreferences::initialize_members(twindow& window) find_widget(&window, "turbo_slider", false); const int selected_speed = std::find( - (accl_speeds_.begin()), accl_speeds_.end(), std::to_string(turbo_speed())) + (accl_speeds_.begin()), accl_speeds_.end(), lexical_cast(turbo_speed())) - (accl_speeds_.begin()); accl_slider.set_value_labels(accl_speeds_); From 982394fe3a02b31b6ec182b86d213b372088c8a9 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 1 Apr 2016 12:07:43 -0400 Subject: [PATCH 115/240] Remove custom FOREACH macro in favour of range-for --- projectfiles/CodeBlocks/wesnoth.cbp | 2 +- projectfiles/VC9/wesnoth.vcproj | 2 +- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 4 +- src/config.hpp | 1 + src/formula/callable_objects.cpp | 5 +- src/game_board.cpp | 6 +- src/game_initialization/depcheck.cpp | 54 +++++++-------- src/gui/core/canvas.cpp | 5 +- src/gui/core/event/handler.cpp | 9 ++- src/gui/core/notifier.hpp | 3 +- src/gui/core/tips.cpp | 7 +- src/gui/core/widget_definition.hpp | 4 +- src/gui/core/window_builder.cpp | 13 ++-- src/gui/core/window_builder/helper.cpp | 3 +- src/gui/dialogs/addon/description.cpp | 7 +- src/gui/dialogs/addon/filter_options.cpp | 2 +- src/gui/dialogs/addon/list.cpp | 11 ++- src/gui/dialogs/addon/uninstall_list.cpp | 5 +- src/gui/dialogs/campaign_difficulty.cpp | 3 +- src/gui/dialogs/campaign_selection.cpp | 7 +- src/gui/dialogs/campaign_settings.cpp | 4 +- src/gui/dialogs/chat_log.cpp | 3 +- src/gui/dialogs/core_selection.cpp | 3 +- src/gui/dialogs/debug_clock.cpp | 3 +- src/gui/dialogs/depcheck_select_new.cpp | 2 +- src/gui/dialogs/dialog.cpp | 7 +- src/gui/dialogs/drop_down_list.cpp | 3 +- src/gui/dialogs/editor/generate_map.cpp | 3 +- src/gui/dialogs/formula_debugger.cpp | 5 +- src/gui/dialogs/game_load.cpp | 5 +- src/gui/dialogs/game_version.cpp | 6 +- src/gui/dialogs/gamestate_inspector.cpp | 25 ++++--- src/gui/dialogs/label_settings.cpp | 5 +- src/gui/dialogs/language_selection.cpp | 3 +- src/gui/dialogs/lobby/data.cpp | 13 ++-- src/gui/dialogs/lobby/info.cpp | 25 ++++--- src/gui/dialogs/lobby/lobby.cpp | 14 ++-- src/gui/dialogs/message.cpp | 3 +- .../dialogs/multiplayer/mp_change_control.cpp | 3 +- src/gui/dialogs/multiplayer/mp_connect.cpp | 3 +- .../dialogs/multiplayer/mp_create_game.cpp | 3 +- src/gui/dialogs/preferences_dialog.cpp | 15 ++--- src/gui/dialogs/simple_item_selector.cpp | 3 +- src/gui/dialogs/theme_list.cpp | 3 +- src/gui/dialogs/title_screen.cpp | 3 +- src/gui/dialogs/unit_attack.cpp | 8 +-- src/gui/dialogs/unit_create.cpp | 6 +- src/gui/dialogs/unit_recruit.cpp | 4 +- src/gui/dialogs/wml_error.cpp | 2 +- src/gui/dialogs/wml_message.cpp | 2 +- src/gui/widgets/combobox.cpp | 2 +- src/gui/widgets/control.cpp | 5 +- src/gui/widgets/generator.cpp | 3 +- src/gui/widgets/generator_private.hpp | 13 ++-- src/gui/widgets/grid.cpp | 31 +++++---- src/gui/widgets/group.hpp | 8 +-- src/gui/widgets/listbox.cpp | 14 ++-- src/gui/widgets/multi_page.cpp | 6 +- src/gui/widgets/pane.cpp | 24 +++---- src/gui/widgets/progress_bar.cpp | 3 +- src/gui/widgets/scrollbar.cpp | 5 +- src/gui/widgets/scrollbar_container.cpp | 11 ++- src/gui/widgets/settings.cpp | 9 ++- src/gui/widgets/settings.hpp | 3 +- src/gui/widgets/slider.cpp | 5 +- src/gui/widgets/stacked_widget.cpp | 5 +- src/gui/widgets/text_box.cpp | 5 +- src/gui/widgets/toggle_button.cpp | 5 +- src/gui/widgets/toggle_panel.cpp | 5 +- src/gui/widgets/tree_view.cpp | 2 +- src/gui/widgets/tree_view_node.cpp | 17 +++-- src/gui/widgets/unit_preview_pane.cpp | 8 +-- src/gui/widgets/window.cpp | 9 ++- src/map/map.cpp | 5 +- src/quit_confirmation.cpp | 1 + src/scripting/game_lua_kernel.cpp | 3 +- src/server/game.cpp | 3 +- src/theme.cpp | 43 ++++++------ src/utils/foreach.hpp | 67 ------------------- src/utils/iterable_pair.hpp | 38 +++++++++++ 80 files changed, 303 insertions(+), 395 deletions(-) delete mode 100644 src/utils/foreach.hpp create mode 100644 src/utils/iterable_pair.hpp diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index 2c13b36077b3..e6811e2c4185 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -1064,7 +1064,7 @@ - + diff --git a/projectfiles/VC9/wesnoth.vcproj b/projectfiles/VC9/wesnoth.vcproj index 3d6344433efa..cb44909b71a0 100644 --- a/projectfiles/VC9/wesnoth.vcproj +++ b/projectfiles/VC9/wesnoth.vcproj @@ -14865,7 +14865,7 @@ > variant convert_map( const std::map& input_map ) { @@ -109,7 +108,7 @@ variant attack_type_callable::get_value(const std::string& key) const const config specials = att_.specials(); std::vector res; - FOREACH(const AUTO& special , specials.all_children_range()) { + for(const auto& special : specials.all_children_range()) { if(!special.cfg["id"].empty()) { res.push_back(variant(special.cfg["id"].str())); } @@ -393,7 +392,7 @@ variant unit_type_callable::get_value(const std::string& key) const } else if(key == "traits") { std::vector res; - FOREACH(const AUTO& config , u_.possible_traits()) + for(const auto& config : u_.possible_traits()) { res.push_back(variant(config["id"].str())); } diff --git a/src/game_board.cpp b/src/game_board.cpp index 5c16542d4d02..f3658402faeb 100644 --- a/src/game_board.cpp +++ b/src/game_board.cpp @@ -21,8 +21,6 @@ #include "terrain/type_data.hpp" #include "units/unit.hpp" -#include "utils/foreach.hpp" - #include #include #include @@ -263,7 +261,7 @@ boost::optional game_board::replace_map(const gamemap & newmap) { /* Remember the locations where a village is owned by a side. */ std::map villages; - FOREACH(const AUTO& village, map_->villages()) { + for(const auto& village : map_->villages()) { const int owner = village_owner(village); if(owner != -1) { villages[village] = owner; @@ -282,7 +280,7 @@ boost::optional game_board::replace_map(const gamemap & newmap) { } /* Disown villages that are no longer villages. */ - FOREACH(const AUTO& village, villages) { + for(const auto& village : villages) { if(!newmap.is_village(village.first)) { teams_[village.second].lose_village(village.first); } diff --git a/src/game_initialization/depcheck.cpp b/src/game_initialization/depcheck.cpp index 609f3f31cb85..360e30dfa539 100644 --- a/src/game_initialization/depcheck.cpp +++ b/src/game_initialization/depcheck.cpp @@ -69,7 +69,7 @@ manager::manager(const config& gamecfg, bool mp, CVideo& video) , prev_mods_() { DBG_MP << "Initializing the dependency manager" << std::endl; - BOOST_FOREACH (const config& cfg, gamecfg.child_range("modification")) { + for (const config& cfg : gamecfg.child_range("modification")) { component_availabilty type = cfg["type"].to_enum(component_availabilty::HYBRID); if((type != component_availabilty::MP || mp) && (type != component_availabilty::SP || !mp) ) { config info; @@ -84,7 +84,7 @@ manager::manager(const config& gamecfg, bool mp, CVideo& video) } } - BOOST_FOREACH (const config& cfg, gamecfg.child_range("era")) { + for (const config& cfg : gamecfg.child_range("era")) { component_availabilty type = cfg["type"].to_enum(component_availabilty::MP); if((type != component_availabilty::MP || mp) && (type != component_availabilty::SP || !mp) ) { config info; @@ -98,7 +98,7 @@ manager::manager(const config& gamecfg, bool mp, CVideo& video) } } - BOOST_FOREACH (const config& cfg, gamecfg.child_range("multiplayer")) { + for (const config& cfg : gamecfg.child_range("multiplayer")) { if (cfg["allow_new_game"].to_bool(true)) { config info; info["id"] = cfg["id"]; @@ -131,7 +131,7 @@ void manager::revert() bool manager::exists(const elem& e) const { - BOOST_FOREACH (const config& cfg, depinfo_.child_range(e.type)) { + for (const config& cfg : depinfo_.child_range(e.type)) { if (cfg["id"] == e.id) { return true; } @@ -154,7 +154,7 @@ std::vector std::vector items = get_required(e); - BOOST_FOREACH (const std::string& str, items) { + for (const std::string& str : items) { if (!exists(elem(str, "modification"))) { result.push_back(str); } @@ -185,7 +185,7 @@ std::vector manager::get_required_not_enabled(const elem& e) const std::vector required = get_required(e); std::vector result; - BOOST_FOREACH (std::string str, required) { + for (std::string str : required) { if ( !util::contains(mods_, str) ) { result.push_back(str); } @@ -198,7 +198,7 @@ std::vector manager::get_conflicting_enabled(const elem& e) const { std::vector result; - BOOST_FOREACH(const std::string& mod, mods_) { + for (const std::string& mod : mods_) { if (conflicts(elem(mod, "modification"), e)) { result.push_back(mod); } @@ -277,7 +277,7 @@ bool manager::conflicts(const elem& elem1, const elem& elem2, bool directonly) c std::vector req1 = get_required(elem1), req2 = get_required(elem2); - BOOST_FOREACH (const std::string& s, req1) { + for (const std::string& s : req1) { elem m(s, "modification"); if (conflicts(elem2, m, true)) { @@ -285,7 +285,7 @@ bool manager::conflicts(const elem& elem1, const elem& elem2, bool directonly) c } } - BOOST_FOREACH (const std::string& s, req2) { + for (const std::string& s : req2) { elem m(s, "modification"); if (conflicts(elem1, m, true)) { @@ -293,10 +293,10 @@ bool manager::conflicts(const elem& elem1, const elem& elem2, bool directonly) c } } - BOOST_FOREACH (const std::string& id1, req1) { + for (const std::string& id1 : req1) { elem m1(id1, "modification"); - BOOST_FOREACH (const std::string& id2, req2) { + for (const std::string& id2 : req2) { elem m2(id2, "modification"); if (conflicts(m1, m2)) { @@ -392,7 +392,7 @@ void manager::try_scenario_by_index(int index, bool force) int manager::get_era_index() const { int result = 0; - BOOST_FOREACH (const config& i, depinfo_.child_range("era")) + for (const config& i : depinfo_.child_range("era")) { if (i["id"] == era_) { return result; @@ -407,7 +407,7 @@ int manager::get_scenario_index() const { int result = 0; - BOOST_FOREACH (const config& i, depinfo_.child_range("scenario")) + for (const config& i : depinfo_.child_range("scenario")) { if (i["id"] == scenario_) { return result; @@ -430,7 +430,7 @@ bool manager::enable_mods_dialog(const std::vector& mods, const std::string& requester) { std::vector items; - BOOST_FOREACH (const std::string& mod, mods) { + for (const std::string& mod : mods) { items.push_back(depinfo_.find_child("modification", "id", mod)["name"]); } @@ -442,7 +442,7 @@ bool manager::disable_mods_dialog(const std::vector& mods, const std::string& requester) { std::vector items; - BOOST_FOREACH (const std::string& mod, mods) { + for (const std::string& mod : mods) { items.push_back(depinfo_.find_child("modification", "id", mod)["name"]); } @@ -453,7 +453,7 @@ bool manager::disable_mods_dialog(const std::vector& mods, std::string manager::change_era_dialog(const std::vector& eras) { std::vector items; - BOOST_FOREACH(const std::string& era, eras) { + for(const std::string& era : eras) { items.push_back(depinfo_.find_child("era", "id", era)["name"]); } @@ -470,7 +470,7 @@ std::string manager::change_scenario_dialog(const std::vector& scenarios) { std::vector items; - BOOST_FOREACH (const std::string& scenario, scenarios) { + for (const std::string& scenario : scenarios) { items.push_back(depinfo_.find_child("scenario", "id", scenario)["name"]); } @@ -542,7 +542,7 @@ bool manager::change_scenario(const std::string& id) } std::vector newmods = req; - BOOST_FOREACH (const std::string& i, mods_) { + for (const std::string& i : mods_) { if ( !util::contains(con, i) ) { newmods.push_back(i); } @@ -558,7 +558,7 @@ bool manager::change_scenario(const std::string& id) } std::vector compatible; - BOOST_FOREACH (const config& i, depinfo_.child_range("era")) { + for (const config& i : depinfo_.child_range("era")) { if (!conflicts(scen, elem(i["id"], "era"))) { compatible.push_back(i["id"]); } @@ -612,7 +612,7 @@ bool manager::change_era(const std::string& id) } std::vector newmods = req; - BOOST_FOREACH (const std::string& i, mods_) { + for (const std::string& i : mods_) { if ( !util::contains(con, i) ) { newmods.push_back(i); } @@ -627,7 +627,7 @@ bool manager::change_era(const std::string& id) } std::vector compatible; - BOOST_FOREACH (const config& i, depinfo_.child_range("scenario")) { + for (const config& i : depinfo_.child_range("scenario")) { if (!conflicts(era, elem(i["id"], "scenario"))) { compatible.push_back(i["id"]); } @@ -652,10 +652,10 @@ bool manager::change_modifications { // Checking if the selected combination of mods is valid at all std::vector filtered; - BOOST_FOREACH (const std::string& i, modifications) { + for (const std::string& i : modifications) { bool ok = true; elem ei(i, "modification"); - BOOST_FOREACH (const std::string& j, filtered) { + for (const std::string& j : filtered) { ok = ok && !conflicts(ei, elem(j, "modification")); } @@ -674,10 +674,10 @@ bool manager::change_modifications // Checking if the currently selected era is compatible with the set // modifications, and changing era if necessary std::vector compatible; - BOOST_FOREACH (const config& c, depinfo_.child_range("era")) { + for (const config& c : depinfo_.child_range("era")) { elem era(c["id"], "era"); bool ok = true; - BOOST_FOREACH (const std::string& s, mods_) { + for (const std::string& s : mods_) { ok = ok && !conflicts(era, elem(s, "modification")); } @@ -711,10 +711,10 @@ bool manager::change_modifications // Checking if the currently selected scenario is compatible with // the set modifications, and changing scenario if necessary - BOOST_FOREACH (const config& c, depinfo_.child_range("scenario")) { + for (const config& c : depinfo_.child_range("scenario")) { elem scen(c["id"], "scenario"); bool ok = true; - BOOST_FOREACH (const std::string& s, mods_) { + for (const std::string& s : mods_) { ok = ok && !conflicts(scen, elem(s, "modification")); } diff --git a/src/gui/core/canvas.cpp b/src/gui/core/canvas.cpp index 22a3aac618c2..2ed2ab69a9d6 100644 --- a/src/gui/core/canvas.cpp +++ b/src/gui/core/canvas.cpp @@ -30,7 +30,6 @@ #include "gui/widgets/helper.hpp" #include "sdl/rect.hpp" #include "text.hpp" -#include "utils/foreach.hpp" #include "video.hpp" #include "wml_exception.hpp" @@ -1524,7 +1523,7 @@ void tcanvas::parse_cfg(const config& cfg) log_scope2(log_gui_parse, "Canvas: parsing config."); shapes_.clear(); - FOREACH(const AUTO & shape, cfg.all_children_range()) + for(const auto & shape : cfg.all_children_range()) { const std::string& type = shape.key; const config& data = shape.cfg; @@ -1544,7 +1543,7 @@ void tcanvas::parse_cfg(const config& cfg) } else if(type == "pre_commit") { /* note this should get split if more preprocessing is used. */ - FOREACH(const AUTO & function, data.all_children_range()) + for(const auto & function : data.all_children_range()) { if(function.key == "blur") { diff --git a/src/gui/core/event/handler.cpp b/src/gui/core/event/handler.cpp index e103ec096e1a..19437281380b 100644 --- a/src/gui/core/event/handler.cpp +++ b/src/gui/core/event/handler.cpp @@ -23,7 +23,6 @@ #include "gui/widgets/widget.hpp" #include "gui/widgets/window.hpp" #include "hotkey/hotkey_item.hpp" -#include "utils/foreach.hpp" #include "video.hpp" #include "serialization/unicode_cast.hpp" @@ -470,7 +469,7 @@ void thandler::disconnect(tdispatcher* dispatcher) } /***** Set proper state for the other dispatchers. *****/ - FOREACH(AUTO dispatcher, dispatchers_) + for(auto dispatcher : dispatchers_) { dynamic_cast(*dispatcher).set_is_dirty(true); } @@ -490,7 +489,7 @@ void thandler::disconnect(tdispatcher* dispatcher) void thandler::activate() { - FOREACH(AUTO dispatcher, dispatchers_) + for(auto dispatcher : dispatchers_) { dispatcher->fire( SDL_ACTIVATE, dynamic_cast(*dispatcher), nullptr); @@ -514,7 +513,7 @@ void thandler::draw(const bool force) * * For now we use a hack, but would be nice to rewrite it for 1.9/1.11. */ - FOREACH(AUTO dispatcher, dispatchers_) + for(auto dispatcher : dispatchers_) { if(!first) { /* @@ -542,7 +541,7 @@ void thandler::video_resize(const tpoint& new_size) { DBG_GUI_E << "Firing: " << SDL_VIDEO_RESIZE << ".\n"; - FOREACH(AUTO dispatcher, dispatchers_) + for(auto dispatcher : dispatchers_) { dispatcher->fire(SDL_VIDEO_RESIZE, dynamic_cast(*dispatcher), diff --git a/src/gui/core/notifier.hpp b/src/gui/core/notifier.hpp index 95a620899dcf..77335331d527 100644 --- a/src/gui/core/notifier.hpp +++ b/src/gui/core/notifier.hpp @@ -16,7 +16,6 @@ #define GUI_WIDGETS_AUXILIARY_NOTIFIER_HPP_INCLUDED #include "gui/core/notifiee.hpp" -#include "utils/foreach.hpp" #include #include @@ -43,7 +42,7 @@ class tnotifier ~tnotifier() { - FOREACH(AUTO & item, notifiees_) + for (auto & item : notifiees_) { assert(item.first); assert((*item.first).notifier_ == this); diff --git a/src/gui/core/tips.cpp b/src/gui/core/tips.cpp index edd6d60c7ae6..426d59dbd4ca 100644 --- a/src/gui/core/tips.cpp +++ b/src/gui/core/tips.cpp @@ -18,7 +18,6 @@ #include "config.hpp" #include "game_preferences.hpp" -#include "utils/foreach.hpp" #include "serialization/string_utils.hpp" namespace gui2 @@ -38,7 +37,7 @@ std::vector load(const config& cfg) { std::vector result; - FOREACH(const AUTO & tip, cfg.child_range("tip")) + for(const auto & tip : cfg.child_range("tip")) { result.push_back( ttip(tip["text"], tip["source"], tip["encountered_units"])); @@ -53,12 +52,12 @@ std::vector shuffle(const std::vector& tips) const std::set& units = preferences::encountered_units(); - FOREACH(const AUTO & tip, tips) + for(const auto & tip : tips) { if(tip.unit_filter_.empty()) { result.push_back(tip); } else { - FOREACH(const AUTO & unit, tip.unit_filter_) + for(const auto & unit : tip.unit_filter_) { if(units.find(unit) != units.end()) { result.push_back(tip); diff --git a/src/gui/core/widget_definition.hpp b/src/gui/core/widget_definition.hpp index 47125f73124e..402732290067 100644 --- a/src/gui/core/widget_definition.hpp +++ b/src/gui/core/widget_definition.hpp @@ -18,7 +18,6 @@ #include "config.hpp" #include "font_options.hpp" #include "gui/core/canvas.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -95,8 +94,7 @@ struct tcontrol_definition : public reference_counted_object template void load_resolutions(const config& cfg) { - config::const_child_itors itors = cfg.child_range("resolution"); - FOREACH(const AUTO & resolution, itors) + for (const auto & resolution : cfg.child_range("resolution")) { resolutions.push_back(new T(resolution)); } diff --git a/src/gui/core/window_builder.cpp b/src/gui/core/window_builder.cpp index 9c15aafb9285..ef976db2643d 100644 --- a/src/gui/core/window_builder.cpp +++ b/src/gui/core/window_builder.cpp @@ -43,7 +43,6 @@ #include "gui/widgets/viewport.hpp" #include "gui/widgets/window.hpp" #include "formula/string_utils.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" #include @@ -93,7 +92,7 @@ twindow* build(CVideo& video, const twindow_builder::tresolution* definition) definition->helptip); assert(window); - FOREACH(const AUTO & lg, definition->linked_groups) + for(const auto & lg : definition->linked_groups) { if(window->has_linked_size_group(lg.id)) { @@ -159,7 +158,7 @@ tbuilder_widget_ptr create_builder_widget(const config& cfg) size_t nb_children = std::distance(children.first, children.second); VALIDATE(nb_children == 1, "Grid cell does not have exactly 1 child."); - FOREACH(const AUTO & item, builder_widget_lookup()) + for(const auto & item : builder_widget_lookup()) { if(item.first == "window" || item.first == "tooltip") { continue; @@ -269,7 +268,7 @@ const std::string& twindow_builder::read(const config& cfg) config::const_child_itors cfgs = cfg.child_range("resolution"); VALIDATE(cfgs.first != cfgs.second, _("No resolution defined.")); - FOREACH(const AUTO & i, cfgs) + for(const auto & i : cfgs) { resolutions.push_back(tresolution(i)); } @@ -427,7 +426,7 @@ twindow_builder::tresolution::tresolution(const config& cfg) definition = "default"; } - FOREACH(const AUTO & lg, cfg.child_range("linked_group")) + for(const auto & lg : cfg.child_range("linked_group")) { tlinked_group linked_group; linked_group.id = lg["id"].str(); @@ -532,13 +531,13 @@ tbuilder_grid::tbuilder_grid(const config& cfg) { log_scope2(log_gui_parse, "Window builder: parsing a grid"); - FOREACH(const AUTO & row, cfg.child_range("row")) + for(const auto & row : cfg.child_range("row")) { unsigned col = 0; row_grow_factor.push_back(row["grow_factor"]); - FOREACH(const AUTO & c, row.child_range("column")) + for(const auto & c : row.child_range("column")) { flags.push_back(implementation::read_flags(c)); border_size.push_back(c["border_size"]); diff --git a/src/gui/core/window_builder/helper.cpp b/src/gui/core/window_builder/helper.cpp index a043ba9e8acc..cb4b0ed2316d 100644 --- a/src/gui/core/window_builder/helper.cpp +++ b/src/gui/core/window_builder/helper.cpp @@ -20,7 +20,6 @@ #include "gui/core/log.hpp" #include "gui/widgets/grid.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -61,7 +60,7 @@ unsigned get_h_align(const std::string& h_align) unsigned get_border(const std::vector& borders) { unsigned result = 0; - FOREACH(const AUTO & border, borders) + for(const auto & border : borders) { if(border == "all") { return tgrid::BORDER_ALL; diff --git a/src/gui/dialogs/addon/description.cpp b/src/gui/dialogs/addon/description.cpp index fa2cf17c183f..25470a6dbfe0 100644 --- a/src/gui/dialogs/addon/description.cpp +++ b/src/gui/dialogs/addon/description.cpp @@ -28,7 +28,6 @@ #include "language.hpp" #include "preferences.hpp" #include "strftime.hpp" -#include "utils/foreach.hpp" #include @@ -54,7 +53,7 @@ std::string format_addon_time(time_t time) std::string langcode_to_string(const std::string& lcode) { - FOREACH(const AUTO & ld, get_languages()) + for(const auto & ld : get_languages()) { if(ld.localename == lcode || ld.localename.substr(0, 2) == lcode) { return ld.language; @@ -191,7 +190,7 @@ std::string make_display_dependencies(const std::string& addon_id, const std::set& deps = addon.resolve_dependencies(addons_list); - FOREACH(const AUTO & dep_id, deps) + for(const auto & dep_id : deps) { addon_info dep; addon_tracking_info depstate; @@ -338,7 +337,7 @@ taddon_description::taddon_description(const std::string& addon_id, std::string languages; - FOREACH(const AUTO & lc, addon.locales) + for(const auto & lc : addon.locales) { const std::string& langlabel = langcode_to_string(lc); if(!langlabel.empty()) { diff --git a/src/gui/dialogs/addon/filter_options.cpp b/src/gui/dialogs/addon/filter_options.cpp index 2cbe099e6f3b..ec8b76c97348 100644 --- a/src/gui/dialogs/addon/filter_options.cpp +++ b/src/gui/dialogs/addon/filter_options.cpp @@ -169,7 +169,7 @@ void taddon_filter_options::toggle_all_displayed_types_button_callback( boost::ref(window), _1)); - FOREACH(const AUTO field, displayed_types_fields_) + for(const auto field : displayed_types_fields_) { field->set_widget_value(window, !have_any_unchecked); } diff --git a/src/gui/dialogs/addon/list.cpp b/src/gui/dialogs/addon/list.cpp index 153e88d0240b..0b2c98b0acec 100644 --- a/src/gui/dialogs/addon/list.cpp +++ b/src/gui/dialogs/addon/list.cpp @@ -41,7 +41,6 @@ #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/text_box.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "serialization/string_utils.hpp" #include "formula/string_utils.hpp" #include "marked-up_text.hpp" @@ -113,10 +112,10 @@ namespace { filter_transform(const std::vector& filtertext) : filtertext_(filtertext) {} bool operator()(const config& cfg) const { - FOREACH(const AUTO& filter, filtertext_) + for(const auto& filter : filtertext_) { bool found = false; - FOREACH(const AUTO& attribute, cfg.attribute_range()) + for(const auto& attribute : cfg.attribute_range()) { std::string val = attribute.second.str(); if(std::search(val.begin(), @@ -189,7 +188,7 @@ void taddon_list::on_filtertext_changed(ttext_* textbox, const std::string& text filter_transform filter(utils::split(text, ' ')); std::vector res; res.reserve(cfg_.child_count("campaign")); - FOREACH(const AUTO& child, cfg_.child_range("campaign")) + for(const auto& child : cfg_.child_range("campaign")) { res.push_back(filter(child)); } @@ -199,7 +198,7 @@ void taddon_list::on_filtertext_changed(ttext_* textbox, const std::string& text void taddon_list::on_order_button_click(twindow& window, const tgenerator_::torder_func& up, const tgenerator_::torder_func& down, twidget& w) { tselectable_& selectable = dynamic_cast(w); - FOREACH(AUTO& other, orders_) + for(auto& other : orders_) { if(other != &selectable) { other->set_value(0); @@ -379,7 +378,7 @@ void taddon_list::pre_show(twindow& window) { tlistbox& list = find_widget(&window, "addons", false); - FOREACH(const AUTO & c, cfg_.child_range("campaign")) + for(const auto & c : cfg_.child_range("campaign")) { ids_.push_back(c["name"]); const addon_info& info = addon_at(ids_.back(), addons_); diff --git a/src/gui/dialogs/addon/uninstall_list.cpp b/src/gui/dialogs/addon/uninstall_list.cpp index b82ff0362d49..9e52cd5c9d30 100644 --- a/src/gui/dialogs/addon/uninstall_list.cpp +++ b/src/gui/dialogs/addon/uninstall_list.cpp @@ -24,7 +24,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include @@ -62,7 +61,7 @@ void taddon_uninstall_list::pre_show(twindow& window) this->selections_.clear(); - FOREACH(const AUTO & entry, titles_map_) + for(const auto & entry : titles_map_) { const std::string& id = entry.first; const std::string& title = entry.second; @@ -102,7 +101,7 @@ std::vector taddon_uninstall_list::selected_addons() const { std::vector retv; - FOREACH(const AUTO & entry, selections_) + for(const auto & entry : selections_) { if(entry.second) { retv.push_back(entry.first); diff --git a/src/gui/dialogs/campaign_difficulty.cpp b/src/gui/dialogs/campaign_difficulty.cpp index d4125b9caf7a..e2d8329b5714 100644 --- a/src/gui/dialogs/campaign_difficulty.cpp +++ b/src/gui/dialogs/campaign_difficulty.cpp @@ -29,7 +29,6 @@ #endif #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "log.hpp" @@ -119,7 +118,7 @@ void tcampaign_difficulty::pre_show(twindow& window) std::map data; - BOOST_FOREACH(const config &d, difficulties_.child_range("difficulty")) + for (const config &d : difficulties_.child_range("difficulty")) { data["icon"]["label"] = d["image"]; data["label"]["label"] = d["label"]; diff --git a/src/gui/dialogs/campaign_selection.cpp b/src/gui/dialogs/campaign_selection.cpp index 0a4e5eb37f60..7bd799b20211 100644 --- a/src/gui/dialogs/campaign_selection.cpp +++ b/src/gui/dialogs/campaign_selection.cpp @@ -34,7 +34,6 @@ #include "gui/widgets/tree_view_node.hpp" #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "serialization/string_utils.hpp" #include @@ -141,7 +140,7 @@ void tcampaign_selection::pre_show(twindow& window) = find_widget(&window, "campaign_details", false); unsigned id = 0; - FOREACH(const AUTO & level, engine_.get_levels_by_type_unfiltered(ng::level::TYPE::SP_CAMPAIGN)) + for(const auto & level : engine_.get_levels_by_type_unfiltered(ng::level::TYPE::SP_CAMPAIGN)) { const config& campaign = level->data(); @@ -185,7 +184,7 @@ void tcampaign_selection::pre_show(twindow& window) id = 0; tree_group_item.clear(); - FOREACH(const AUTO& mod, engine_.get_const_extras_by_type(ng::create_engine::MOD)) + for(const auto& mod : engine_.get_const_extras_by_type(ng::create_engine::MOD)) { bool active = std::find(enabled.begin(), enabled.end(), mod->id) != enabled.end(); /*** Add tree item ***/ @@ -228,7 +227,7 @@ void tcampaign_selection::pre_show(twindow& window) tmulti_page& multi_page = find_widget(&window, "campaign_details", false); - FOREACH(const AUTO & level, engine_.get_levels_by_type_unfiltered(ng::level::TYPE::SP_CAMPAIGN)) + for(const auto & level : engine_.get_levels_by_type_unfiltered(ng::level::TYPE::SP_CAMPAIGN)) { const config& campaign = level->data(); diff --git a/src/gui/dialogs/campaign_settings.cpp b/src/gui/dialogs/campaign_settings.cpp index 7b2292853f3a..4e34ab736b0e 100644 --- a/src/gui/dialogs/campaign_settings.cpp +++ b/src/gui/dialogs/campaign_settings.cpp @@ -106,7 +106,7 @@ void tcampaign_settings::update_lists(twindow& window) era_list.clear(); if (engine_.current_level().allow_era_choice()) { - BOOST_FOREACH(std::string era, engine_.extras_menu_item_names(ng::create_engine::ERA, false)) { + for (std::string era : engine_.extras_menu_item_names(ng::create_engine::ERA, false)) { std::map row; string_map column; @@ -126,7 +126,7 @@ void tcampaign_settings::update_lists(twindow& window) { int i = 0; - BOOST_FOREACH(const ng::create_engine::extras_metadata_ptr mod, engine_.get_const_extras_by_type(ng::create_engine::MOD)) { + for (const ng::create_engine::extras_metadata_ptr mod : engine_.get_const_extras_by_type(ng::create_engine::MOD)) { std::map row; string_map column; diff --git a/src/gui/dialogs/chat_log.cpp b/src/gui/dialogs/chat_log.cpp index 53226ac89a6f..5c8b94f13a91 100644 --- a/src/gui/dialogs/chat_log.cpp +++ b/src/gui/dialogs/chat_log.cpp @@ -28,7 +28,6 @@ #include "gui/widgets/text_box.hpp" #include "gui/widgets/window.hpp" #include "gui/widgets/slider.hpp" -#include "utils/foreach.hpp" #include "desktop/clipboard.hpp" #include "serialization/unicode.hpp" @@ -121,7 +120,7 @@ class tchat_log::model const std::string& lcfilter = utf8::lowercase(filter->get_value()); LOG_CHAT_LOG << "entering tchat_log::model::stream_log\n"; - FOREACH(const AUTO & t, make_pair(chat_log_history.begin() + first, + for(const auto & t : make_pair(chat_log_history.begin() + first, chat_log_history.begin() + last)) { const std::string& timestamp diff --git a/src/gui/dialogs/core_selection.cpp b/src/gui/dialogs/core_selection.cpp index 8d79b1caf21b..f1fc52b289e5 100644 --- a/src/gui/dialogs/core_selection.cpp +++ b/src/gui/dialogs/core_selection.cpp @@ -28,7 +28,6 @@ #include "gui/widgets/scroll_label.hpp" #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "serialization/string_utils.hpp" #include @@ -104,7 +103,7 @@ void tcore_selection::pre_show(twindow& window) tmulti_page& multi_page = find_widget(&window, "core_details", false); - FOREACH(const AUTO & core, cores_) + for(const auto & core : cores_) { /*** Add list item ***/ string_map list_item; diff --git a/src/gui/dialogs/debug_clock.cpp b/src/gui/dialogs/debug_clock.cpp index 4b98c01213c5..0387fd4d76c5 100644 --- a/src/gui/dialogs/debug_clock.cpp +++ b/src/gui/dialogs/debug_clock.cpp @@ -23,7 +23,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/pane.hpp" #include "gui/widgets/progress_bar.hpp" -#include "utils/foreach.hpp" #include @@ -148,7 +147,7 @@ void tdebug_clock::update_time(const bool force) } if(clock_) { - FOREACH(AUTO & canvas, clock_->canvas()) + for(auto & canvas : clock_->canvas()) { canvas.set_variable("hour", variant(hour_stamp)); canvas.set_variable("minute", variant(minute_stamp)); diff --git a/src/gui/dialogs/depcheck_select_new.cpp b/src/gui/dialogs/depcheck_select_new.cpp index 799f8ee2212b..50be70d5ff1b 100644 --- a/src/gui/dialogs/depcheck_select_new.cpp +++ b/src/gui/dialogs/depcheck_select_new.cpp @@ -91,7 +91,7 @@ void tdepcheck_select_new::pre_show(twindow& window) { tlistbox& listbox = find_widget(&window, "itemlist", false); - FOREACH(const AUTO & item, items_) + for(const auto & item : items_) { string_map current; current.insert(std::make_pair("label", item)); diff --git a/src/gui/dialogs/dialog.cpp b/src/gui/dialogs/dialog.cpp index 808bc5240f7e..362d2897f422 100644 --- a/src/gui/dialogs/dialog.cpp +++ b/src/gui/dialogs/dialog.cpp @@ -18,7 +18,6 @@ #include "gui/auxiliary/field.hpp" #include "gui/widgets/integer_selector.hpp" -#include "utils/foreach.hpp" #include "video.hpp" namespace gui2 @@ -26,7 +25,7 @@ namespace gui2 tdialog::~tdialog() { - FOREACH(AUTO field, fields_) + for(auto field : fields_) { delete field; } @@ -191,7 +190,7 @@ void tdialog::post_show(twindow& /*window*/) void tdialog::init_fields(twindow& window) { - FOREACH(AUTO field, fields_) + for(auto field : fields_) { field->attach_to_window(window); field->widget_init(window); @@ -206,7 +205,7 @@ void tdialog::init_fields(twindow& window) void tdialog::finalize_fields(twindow& window, const bool save_fields) { - FOREACH(AUTO field, fields_) + for(auto field : fields_) { if(save_fields) { field->widget_finalize(window); diff --git a/src/gui/dialogs/drop_down_list.cpp b/src/gui/dialogs/drop_down_list.cpp index 794166769053..a5e709c725cd 100644 --- a/src/gui/dialogs/drop_down_list.cpp +++ b/src/gui/dialogs/drop_down_list.cpp @@ -21,7 +21,6 @@ #include "gui/widgets/integer_selector.hpp" #include "gui/widgets/window.hpp" #include "gui/widgets/settings.hpp" -#include "utils/foreach.hpp" #include #include @@ -57,7 +56,7 @@ void tdrop_down_list::pre_show(twindow& window) std::map data; t_string& label = data["label"]["label"]; t_string& use_markup = data["label"]["use_markup"]; - FOREACH(const AUTO& str, items_) { + for(const auto& str : items_) { label = str; use_markup = use_markup_ ? "true" : "false"; list.add_row(data); diff --git a/src/gui/dialogs/editor/generate_map.cpp b/src/gui/dialogs/editor/generate_map.cpp index e7ce16158702..6636b14dc79e 100644 --- a/src/gui/dialogs/editor/generate_map.cpp +++ b/src/gui/dialogs/editor/generate_map.cpp @@ -28,7 +28,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/text_box.hpp" #include "generators/map_generator.hpp" -#include "utils/foreach.hpp" #include @@ -112,7 +111,7 @@ void teditor_generate_map::pre_show(twindow& window) window.keyboard_capture(&list); std::map lrow; - FOREACH(const AUTO & gen, map_generators_) + for(const auto & gen : map_generators_) { assert(gen); lrow["generator_name"]["label"] = gen->config_name(); diff --git a/src/gui/dialogs/formula_debugger.cpp b/src/gui/dialogs/formula_debugger.cpp index 56491c17891d..4b2dd62c0f9f 100644 --- a/src/gui/dialogs/formula_debugger.cpp +++ b/src/gui/dialogs/formula_debugger.cpp @@ -23,7 +23,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" #include "formula/debugger.hpp" -#include "utils/foreach.hpp" #include @@ -75,7 +74,7 @@ void tformula_debugger::pre_show(twindow& window) std::stringstream stack_text; std::string indent = " "; int c = 0; - FOREACH(const AUTO & i, fdb_.get_call_stack()) + for(const auto & i : fdb_.get_call_stack()) { for(int d = 0; d < c; ++d) { stack_text << indent; @@ -96,7 +95,7 @@ void tformula_debugger::pre_show(twindow& window) = find_widget(&window, "execution", false, true); std::stringstream execution_text; - FOREACH(const AUTO & i, fdb_.get_execution_trace()) + for(const auto & i : fdb_.get_execution_trace()) { for(int d = 0; d < i.level(); ++d) { execution_text << indent; diff --git a/src/gui/dialogs/game_load.cpp b/src/gui/dialogs/game_load.cpp index 9609499469fb..76254a4295c6 100644 --- a/src/gui/dialogs/game_load.cpp +++ b/src/gui/dialogs/game_load.cpp @@ -41,7 +41,6 @@ #include "language.hpp" #include "preferences_display.hpp" #include "savegame.hpp" -#include "utils/foreach.hpp" #include "serialization/string_utils.hpp" #include @@ -172,7 +171,7 @@ void tgame_load::fill_game_list(twindow& window, tlistbox& list = find_widget(&window, "savegame_list", false); list.clear(); - FOREACH(const AUTO & game, games) + for(const auto & game : games) { std::map data; string_map item; @@ -224,7 +223,7 @@ bool tgame_load::filter_text_changed(ttext_* textbox, const std::string& text) = find_widget(*it, "filename", false); bool found = false; - FOREACH(const AUTO & word, words) + for(const auto & word : words) { found = std::search(filename_label.label().str().begin(), filename_label.label().str().end(), diff --git a/src/gui/dialogs/game_version.cpp b/src/gui/dialogs/game_version.cpp index aa0b01286e28..5ffe01e5c151 100644 --- a/src/gui/dialogs/game_version.cpp +++ b/src/gui/dialogs/game_version.cpp @@ -149,7 +149,7 @@ void tgame_version::pre_show(twindow& window) // Game paths tab. // - FOREACH(const AUTO & path_ent, path_map_) + for(const auto & path_ent : path_map_) { const std::string& path_id = path_ent.first; const std::string& path_path = path_ent.second; @@ -211,7 +211,7 @@ void tgame_version::pre_show(twindow& window) tlistbox& deps_listbox = find_widget(&window, "deps_listbox", false); - FOREACH(const AUTO & dep, deps_) + for(const auto & dep : deps_) { list_data["dep_name"]["label"] = dep[0]; @@ -239,7 +239,7 @@ void tgame_version::pre_show(twindow& window) tlistbox& opts_listbox = find_widget(&window, "opts_listbox", false); - FOREACH(const AUTO & opt, opts_) + for(const auto & opt : opts_) { list_data["opt_name"]["label"] = opt.name; diff --git a/src/gui/dialogs/gamestate_inspector.cpp b/src/gui/dialogs/gamestate_inspector.cpp index 24e535b15125..9ede465e3d51 100644 --- a/src/gui/dialogs/gamestate_inspector.cpp +++ b/src/gui/dialogs/gamestate_inspector.cpp @@ -31,7 +31,6 @@ #include "desktop/clipboard.hpp" #include "game_events/manager.hpp" #include "serialization/parser.hpp" // for write() -#include "utils/foreach.hpp" #include "game_data.hpp" #include "recall_list_manager.hpp" @@ -61,7 +60,7 @@ inline std::string config_to_string(const config& cfg) inline std::string config_to_string(const config& cfg, std::string only_children) { config filtered; - BOOST_FOREACH(const config& child, cfg.child_range(only_children)) { + for(const config& child : cfg.child_range(only_children)) { filtered.add_child(only_children, child); } return config_to_string(filtered); @@ -256,14 +255,14 @@ class variable_mode_controller : public single_mode_controller ? resources::gamedata->get_variables() : config(); - FOREACH(const AUTO & a, vars.attribute_range()) + for(const auto & a : vars.attribute_range()) { model_.add_row_to_stuff_list(a.first, a.first); } std::map wml_array_sizes; - FOREACH(const AUTO & c, vars.all_children_range()) + for(const auto & c : vars.all_children_range()) { if (wml_array_sizes.find(c.key) == wml_array_sizes.end()) { wml_array_sizes[c.key] = 0; @@ -298,7 +297,7 @@ class variable_mode_controller : public single_mode_controller ? resources::gamedata->get_variables() : config(); - FOREACH(const AUTO & a, vars.attribute_range()) + for(const auto & a : vars.attribute_range()) { if(selected == i) { model_.set_inspect_window_text(a.second); @@ -307,7 +306,7 @@ class variable_mode_controller : public single_mode_controller i++; } - FOREACH(const AUTO & c, vars.all_children_range()) + for(const auto & c : vars.all_children_range()) { for (unsigned int j = 0; j < model_.get_num_page(config_to_string(c.cfg)); ++j) { if (selected == i) { @@ -371,7 +370,7 @@ class event_mode_controller : public single_mode_controller config events_config; resources::game_events->write_events(events_config); - FOREACH(const AUTO & cfg, events_config.child_range(handler_key)) + for(const auto & cfg : events_config.child_range(handler_key)) { shared_string_ptr sstrp(new std::string(config_to_string(cfg))); const std::string& wmltext = *sstrp; @@ -474,7 +473,7 @@ class unit_mode_controller : public single_mode_controller << "L" << i->level() << "; " << i->experience() << '/' << i->max_experience() << " xp; " << i->hitpoints() << '/' << i->max_hitpoints() << " hp;"; - FOREACH(const AUTO & str, i->get_traits_list()) + for(const auto & str : i->get_traits_list()) { s << " " << str; } @@ -599,13 +598,13 @@ class team_mode_controller : public single_mode_controller if(selected == 6) { std::stringstream s; if (resources::teams) { - FOREACH(const AUTO & u, resources::teams->at(side_ - 1).recall_list()) + for(const auto & u : resources::teams->at(side_ - 1).recall_list()) { s << "id=\"" << u->id() << "\" (" << u->type_id() << ")\nL" << u->level() << "; " << u->experience() << "/" << u->max_experience() << " xp; " << u->hitpoints() << "/" << u->max_hitpoints() << " hp\n"; - FOREACH(const AUTO & str, u->get_traits_list()) + for(const auto & str : u->get_traits_list()) { s << "\t" << str << std::endl; } @@ -619,7 +618,7 @@ class team_mode_controller : public single_mode_controller if(selected == 7) { config c; if (resources::teams) { - FOREACH(const AUTO & u, resources::teams->at(side_ - 1).recall_list()) + for(const auto & u : resources::teams->at(side_ - 1).recall_list()) { config c_unit; u->write(c_unit); @@ -655,7 +654,7 @@ class team_mode_controller : public single_mode_controller << "L" << i->level() << "; " << i->experience() << '/' << i->max_experience() << " xp; " << i->hitpoints() << '/' << i->max_hitpoints() << " hp\n"; - FOREACH(const AUTO & str, i->get_traits_list()) + for(const auto & str : i->get_traits_list()) { s << "\t" << str << std::endl; } @@ -723,7 +722,7 @@ class tgamestate_inspector::controller void show_stuff_types_list() { model_.clear_stuff_types_list(); - FOREACH(AUTO sm_controller, sm_controllers_) + for(auto sm_controller : sm_controllers_) { model_.add_row_to_stuff_types_list(sm_controller->name(), sm_controller->name()); diff --git a/src/gui/dialogs/label_settings.cpp b/src/gui/dialogs/label_settings.cpp index a77d562aa99c..d7586fa2c9d8 100644 --- a/src/gui/dialogs/label_settings.cpp +++ b/src/gui/dialogs/label_settings.cpp @@ -76,7 +76,7 @@ tlabel_settings::tlabel_settings(display_context& dc) : viewer(dc) { void tlabel_settings::pre_show(twindow& window) { std::map list_data; tlistbox& cats_listbox = find_widget(&window, "label_types", false); - FOREACH(const AUTO & label_entry, all_labels) { + for(const auto & label_entry : all_labels) { const std::string& category = label_entry.first; const bool& visible = label_entry.second; @@ -112,8 +112,7 @@ bool tlabel_settings::execute(display_context& dc, CVideo& video) { tlabel_settings window(dc); if(!window.show(video)) return false; std::vector hidden_categories; - typedef std::map::value_type value_type; - BOOST_FOREACH(value_type lbl, window.all_labels) { + for(auto lbl : window.all_labels) { if(lbl.second == false) { hidden_categories.push_back(lbl.first); } diff --git a/src/gui/dialogs/language_selection.cpp b/src/gui/dialogs/language_selection.cpp index da2e7b376015..00ed0a8d0c79 100644 --- a/src/gui/dialogs/language_selection.cpp +++ b/src/gui/dialogs/language_selection.cpp @@ -26,7 +26,6 @@ #include "gui/widgets/window.hpp" #include "language.hpp" #include "preferences.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -66,7 +65,7 @@ void tlanguage_selection::pre_show(twindow& window) const std::vector& languages = get_languages(); const language_def& current_language = get_language(); - FOREACH(const AUTO & lang, languages) + for(const auto & lang : languages) { string_map item; item.insert(std::make_pair("label", lang.language)); diff --git a/src/gui/dialogs/lobby/data.cpp b/src/gui/dialogs/lobby/data.cpp index 0251a8522d11..bc18786bdc86 100644 --- a/src/gui/dialogs/lobby/data.cpp +++ b/src/gui/dialogs/lobby/data.cpp @@ -24,7 +24,6 @@ #include "map/map.hpp" #include "map/exception.hpp" #include "terrain/type_data.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" #include @@ -92,7 +91,7 @@ void room_info::remove_member(const std::string& user) void room_info::process_room_members(const config& data) { members_.clear(); - FOREACH(const AUTO & m, data.child_range("member")) + for(const auto & m : data.child_range("member")) { members_.insert(m["name"]); } @@ -224,7 +223,7 @@ game_info::game_info(const config& game, const config& game_config) map_info = era; if(!game.child_or_empty("modification").empty()) { - BOOST_FOREACH(const config &cfg, game.child_range("modification")) { + for(const config &cfg : game.child_range("modification")) { if (cfg["require_modification"].to_bool(false)) { const config &mod = game_config.find_child("modification", "id", cfg["id"]); @@ -287,7 +286,7 @@ game_info::game_info(const config& game, const config& game_config) = game_config.child("multiplayer_hashes")) { std::string hash = game["hash"]; bool hash_found = false; - FOREACH(const AUTO & i, hashes.attribute_range()) + for(const auto & i : hashes.attribute_range()) { if(i.first == game["mp_scenario"] && i.second == hash) { hash_found = true; @@ -392,7 +391,7 @@ game_filter_stack::game_filter_stack() : filters_() game_filter_stack::~game_filter_stack() { - FOREACH(AUTO f, filters_) + for(auto f : filters_) { delete f; } @@ -405,7 +404,7 @@ void game_filter_stack::append(game_filter_base* f) void game_filter_stack::clear() { - FOREACH(AUTO f, filters_) + for(auto f : filters_) { delete f; } @@ -414,7 +413,7 @@ void game_filter_stack::clear() bool game_filter_and_stack::match(const game_info& game) const { - FOREACH(AUTO f, filters_) + for(auto f : filters_) { if(!f->match(game)) return false; diff --git a/src/gui/dialogs/lobby/info.cpp b/src/gui/dialogs/lobby/info.cpp index 368ee0d12dd2..87f92149604d 100644 --- a/src/gui/dialogs/lobby/info.cpp +++ b/src/gui/dialogs/lobby/info.cpp @@ -19,7 +19,6 @@ #include "formula/string_utils.hpp" #include "gettext.hpp" #include "network.hpp" -#include "utils/foreach.hpp" #include "log.hpp" #include "map/map.hpp" #include "map/exception.hpp" @@ -64,7 +63,7 @@ lobby_info::~lobby_info() void lobby_info::delete_games() { - FOREACH(const AUTO & v, games_by_id_) + for(const auto & v : games_by_id_) { delete v.second; } @@ -76,7 +75,7 @@ namespace std::string dump_games_map(const lobby_info::game_info_map& games) { std::stringstream ss; - FOREACH(const AUTO & v, games) + for(const auto & v : games) { const game_info& game = *v.second; ss << "G" << game.id << "(" << game.name << ") " @@ -89,7 +88,7 @@ std::string dump_games_map(const lobby_info::game_info_map& games) std::string dump_games_config(const config& gamelist) { std::stringstream ss; - FOREACH(const AUTO & c, gamelist.child_range("game")) + for(const auto & c : gamelist.child_range("game")) { ss << "g" << c["id"] << "(" << c["name"] << ") " << c[config::diff_track_attribute] << " "; @@ -107,7 +106,7 @@ void lobby_info::process_gamelist(const config& data) gamelist_initialized_ = true; delete_games(); games_by_id_.clear(); - FOREACH(const AUTO & c, gamelist_.child("gamelist").child_range("game")) + for(const auto & c : gamelist_.child("gamelist").child_range("game")) { game_info* game = new game_info(c, game_config_); games_by_id_[game->id] = game; @@ -196,11 +195,11 @@ void lobby_info::process_userlist() { SCOPE_LB; users_.clear(); - FOREACH(const AUTO & c, gamelist_.child_range("user")) + for(const auto & c : gamelist_.child_range("user")) { users_.push_back(user_info(c)); } - FOREACH(AUTO & ui, users_) + for(auto & ui : users_) { if(ui.game_id != 0) { game_info* g = get_game_by_id(ui.game_id); @@ -254,7 +253,7 @@ const game_info* lobby_info::get_game_by_id(int id) const room_info* lobby_info::get_room(const std::string& name) { - FOREACH(AUTO & r, rooms_) + for(auto & r : rooms_) { if(r.name() == name) return &r; @@ -264,7 +263,7 @@ room_info* lobby_info::get_room(const std::string& name) const room_info* lobby_info::get_room(const std::string& name) const { - FOREACH(const AUTO & r, rooms_) + for(const auto & r : rooms_) { if(r.name() == name) return &r; @@ -324,7 +323,7 @@ void lobby_info::make_games_vector() games_filtered_.clear(); games_visibility_.clear(); games_.clear(); - FOREACH(const AUTO & v, games_by_id_) + for(const auto & v : games_by_id_) { games_.push_back(v.second); } @@ -334,7 +333,7 @@ void lobby_info::apply_game_filter() { games_filtered_.clear(); games_visibility_.clear(); - FOREACH(AUTO g, games_) + for(auto g : games_) { game_info& gi = *g; bool show = game_filter_.match(gi); @@ -350,7 +349,7 @@ void lobby_info::apply_game_filter() void lobby_info::update_user_statuses(int game_id, const room_info* room) { - FOREACH(AUTO & user, users_) + for(auto & user : users_) { user.update_state(game_id, room); } @@ -397,7 +396,7 @@ struct user_sorter_relation_name void lobby_info::sort_users(bool by_name, bool by_relation) { users_sorted_.clear(); - FOREACH(AUTO & u, users_) + for(auto & u : users_) { users_sorted_.push_back(&u); } diff --git a/src/gui/dialogs/lobby/lobby.cpp b/src/gui/dialogs/lobby/lobby.cpp index 0ec931df9b4a..2ba3dbc6032a 100644 --- a/src/gui/dialogs/lobby/lobby.cpp +++ b/src/gui/dialogs/lobby/lobby.cpp @@ -449,7 +449,7 @@ void add_tooltip_data(std::map& map, void modify_grid_with_data(tgrid* grid, const std::map& map) { - FOREACH(const AUTO & v, map) + for(const auto & v : map) { const std::string& key = v.first; const string_map& strmap = v.second; @@ -459,7 +459,7 @@ void modify_grid_with_data(tgrid* grid, tcontrol* c = dynamic_cast(w); if(c == nullptr) continue; - FOREACH(const AUTO & vv, strmap) + for(const auto & vv : strmap) { if(vv.first == "label") { c->set_label(vv.second); @@ -791,7 +791,7 @@ void tlobby_main::update_playerlist() player_list_.other_games.tree->clear(); player_list_.other_rooms.tree->clear(); - FOREACH(AUTO userptr, lobby_info_.users_sorted()) + for(auto userptr : lobby_info_.users_sorted()) { user_info& user = *userptr; tsub_player_list* target_list(nullptr); @@ -1061,7 +1061,7 @@ tlobby_chat_window* tlobby_main::search_create_window(const std::string& name, bool whisper, bool open_new) { - FOREACH(AUTO & t, open_windows_) + for(auto & t : open_windows_) { if(t.name == name && t.whisper == whisper) return &t; @@ -1457,7 +1457,7 @@ void tlobby_main::process_room_query_response(const config& data) // TODO: this should really open a nice join room dialog instead std::stringstream ss; ss << "Rooms:"; - FOREACH(const AUTO & r, rooms.child_range("room")) + for(const auto & r : rooms.child_range("room")) { ss << " " << r["name"]; } @@ -1646,7 +1646,7 @@ void tlobby_main::chat_input_keypress_callback(bool& handled, const std::vector& match_infos = lobby_info_.users(); std::vector matches; - FOREACH(const AUTO & ui, match_infos) + for(const auto & ui : match_infos) { if(ui.name != preferences::login()) { matches.push_back(ui.name); @@ -1674,7 +1674,7 @@ void tlobby_main::game_filter_reload() { lobby_info_.clear_game_filter(); - FOREACH(const AUTO & s, utils::split(filter_text_->get_value(), ' ')) + for(const auto & s : utils::split(filter_text_->get_value(), ' ')) { lobby_info_.add_game_filter(new game_filter_general_string_part(s)); } diff --git a/src/gui/dialogs/message.cpp b/src/gui/dialogs/message.cpp index 6d5bd6bde1fe..69d61a48a555 100644 --- a/src/gui/dialogs/message.cpp +++ b/src/gui/dialogs/message.cpp @@ -24,7 +24,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" #include "log.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -101,7 +100,7 @@ void tmessage::pre_show(twindow& window) void tmessage::post_show(twindow& /*window*/) { - FOREACH(AUTO & button_status, buttons_) + for(auto & button_status : buttons_) { button_status.button = nullptr; } diff --git a/src/gui/dialogs/multiplayer/mp_change_control.cpp b/src/gui/dialogs/multiplayer/mp_change_control.cpp index 9010e3febe01..774568740fe4 100644 --- a/src/gui/dialogs/multiplayer/mp_change_control.cpp +++ b/src/gui/dialogs/multiplayer/mp_change_control.cpp @@ -35,7 +35,6 @@ #include "marked-up_text.hpp" #include "resources.hpp" #include "team.hpp" -#include "utils/foreach.hpp" #include #include @@ -192,7 +191,7 @@ class side_controller int i = 0; // because we need to know which row contains the controlling // player - FOREACH(const AUTO & nick, nicks) + for(const auto & nick : nicks) { if(side_number_ <= static_cast(resources::teams->size()) && resources::teams->at(side_number_ - 1).current_player() diff --git a/src/gui/dialogs/multiplayer/mp_connect.cpp b/src/gui/dialogs/multiplayer/mp_connect.cpp index c75afff9cbf1..2aecdff7707c 100644 --- a/src/gui/dialogs/multiplayer/mp_connect.cpp +++ b/src/gui/dialogs/multiplayer/mp_connect.cpp @@ -26,7 +26,6 @@ #include "gui/widgets/listbox.hpp" #endif #include "gui/widgets/settings.hpp" -#include "utils/foreach.hpp" #include @@ -96,7 +95,7 @@ void tmp_server_list::pre_show(twindow& window) const std::vector& pref_servers = preferences::server_list(); - FOREACH(const AUTO & server, pref_servers) + for(const auto & server : pref_servers) { std::map data; diff --git a/src/gui/dialogs/multiplayer/mp_create_game.cpp b/src/gui/dialogs/multiplayer/mp_create_game.cpp index d87d45593f0e..b9a7331bdcde 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.cpp @@ -32,7 +32,6 @@ #include "gui/widgets/minimap.hpp" #include "gui/widgets/settings.hpp" #include "settings.hpp" -#include "utils/foreach.hpp" #ifdef GUI2_EXPERIMENTAL_LISTBOX #include @@ -113,7 +112,7 @@ void tmp_create_game::pre_show(twindow& window) // Standard maps int i = 0; - FOREACH(const AUTO & map, cfg_.child_range("multiplayer")) + for(const auto & map : cfg_.child_range("multiplayer")) { if(map["allow_new_game"].to_bool(true)) { string_map item; diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index 2d5c474beeb9..44058437bd99 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -56,7 +56,6 @@ #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/window.hpp" #include "util.hpp" -#include "utils/foreach.hpp" #include "gettext.hpp" @@ -122,7 +121,7 @@ tpreferences::tpreferences(CVideo& video, const config& game_cfg) , font_scaling_(font_scaling()) , index_(0,0) { - BOOST_FOREACH(const config& adv, game_cfg.child_range("advanced_preference")) { + for(const config& adv : game_cfg.child_range("advanced_preference")) { adv_preferences_cfg_.push_back(adv); } @@ -169,7 +168,7 @@ static void set_resolution_list(tcombobox& res_list, CVideo& video) const std::vector > resolutions = video.get_available_resolutions(true); std::vector options; - FOREACH(const AUTO& res, resolutions) + for(const auto& res : resolutions) { std::ostringstream option; option << res.first << utils::unicode_multiplication_sign << res.second; @@ -334,7 +333,7 @@ void tpreferences::setup_friends_list(twindow& window) return; } - FOREACH(const AUTO& acquaintence, acquaintances) + for(const auto& acquaintence : acquaintances) { std::string image = "friend.png"; std::string descriptor = _("friend"); @@ -726,7 +725,7 @@ void tpreferences::initialize_members(twindow& window) std::map row_data; - BOOST_FOREACH(const config& option, adv_preferences_cfg_) + for(const config& option : adv_preferences_cfg_) { // Details about the current option const ADVANCED_PREF_TYPE& pref_type = ADVANCED_PREF_TYPE::string_to_enum( @@ -802,7 +801,7 @@ void tpreferences::initialize_members(twindow& window) case ADVANCED_PREF_TYPE::COMBO: { combo_data combo_options; - BOOST_FOREACH(const config& choice, option.child_range("option")) + for(const config& choice : option.child_range("option")) { combo_options.first.push_back(choice["name"]); combo_options.second.push_back(choice["id"]); @@ -936,7 +935,7 @@ void tpreferences::setup_hotkey_list(twindow& window) std::string text_feature_on = "" + _("✓") + ""; - FOREACH(const AUTO& hotkey_item, hotkey::get_hotkey_commands()) + for(const auto& hotkey_item : hotkey::get_hotkey_commands()) { if (hotkey_item.hidden) { continue; @@ -976,7 +975,7 @@ void tpreferences::add_hotkey_callback(tlistbox& hotkeys) return; } - BOOST_FOREACH(const hotkey::hotkey_ptr& hk, hotkey::get_hotkeys()) { + for(const hotkey::hotkey_ptr& hk : hotkey::get_hotkeys()) { if(!hk->is_disabled() && newhk->bindings_equal(hk)) { oldhk = hk; } diff --git a/src/gui/dialogs/simple_item_selector.cpp b/src/gui/dialogs/simple_item_selector.cpp index 2a6f533d381b..b18557b903ea 100644 --- a/src/gui/dialogs/simple_item_selector.cpp +++ b/src/gui/dialogs/simple_item_selector.cpp @@ -26,7 +26,6 @@ #endif #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -84,7 +83,7 @@ void tsimple_item_selector::pre_show(twindow& window) tlistbox& list = find_widget(&window, "listbox", false); window.keyboard_capture(&list); - FOREACH(const AUTO & it, items_) + for(const auto & it : items_) { std::map data; string_map column; diff --git a/src/gui/dialogs/theme_list.cpp b/src/gui/dialogs/theme_list.cpp index 1342e248f88f..29eb3a0ddeed 100644 --- a/src/gui/dialogs/theme_list.cpp +++ b/src/gui/dialogs/theme_list.cpp @@ -23,7 +23,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" #include "theme.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -62,7 +61,7 @@ void ttheme_list::pre_show(twindow& window) tlistbox& list = find_widget(&window, "themes", false); window.keyboard_capture(&list); - FOREACH(const AUTO & t, themes_) + for(const auto & t : themes_) { std::map data; string_map column; diff --git a/src/gui/dialogs/title_screen.cpp b/src/gui/dialogs/title_screen.cpp index c524b056353c..522f5be146ae 100644 --- a/src/gui/dialogs/title_screen.cpp +++ b/src/gui/dialogs/title_screen.cpp @@ -37,7 +37,6 @@ #include "gui/widgets/multi_page.hpp" #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "video.hpp" #include @@ -288,7 +287,7 @@ void ttitle_screen::pre_show(twindow& window) WRN_CF << "There are not tips of day available." << std::endl; } - FOREACH(const AUTO & tip, tips) + for(const auto & tip : tips) { string_map widget; diff --git a/src/gui/dialogs/unit_attack.cpp b/src/gui/dialogs/unit_attack.cpp index 78d0540ca264..d2cdfe8b0e2d 100644 --- a/src/gui/dialogs/unit_attack.cpp +++ b/src/gui/dialogs/unit_attack.cpp @@ -38,8 +38,6 @@ #include "team.hpp" #include "units/unit.hpp" -#include "utils/foreach.hpp" - #include namespace gui2 @@ -101,7 +99,7 @@ static std::string format_stats(const unit& u) const std::string name = "" + (!u.name().empty() ? u.name() : " ") + ""; std::string traits; - BOOST_FOREACH(const std::string& trait, u.trait_names()) { + for(const std::string& trait : u.trait_names()) { traits += (traits.empty() ? "" : ", ") + trait; } @@ -142,7 +140,7 @@ static std::string get_image_mods(const unit& u) res += "~BLIT(" + unit::leader_crown() + ")"; } - BOOST_FOREACH(const std::string& overlay, u.overlays()) { + for(const std::string& overlay : u.overlays()) { res += "~BLIT(" + overlay + ")"; } @@ -183,7 +181,7 @@ static void set_weapon_info(twindow& window, const config empty; const attack_type no_weapon(empty); - FOREACH(const AUTO & weapon, weapons) + for(const auto & weapon : weapons) { const battle_context_unit_stats& attacker = weapon.get_attacker_stats(); const battle_context_unit_stats& defender = weapon.get_defender_stats(); diff --git a/src/gui/dialogs/unit_create.cpp b/src/gui/dialogs/unit_create.cpp index d0d26b0b5c48..1fd4d8855a76 100644 --- a/src/gui/dialogs/unit_create.cpp +++ b/src/gui/dialogs/unit_create.cpp @@ -42,8 +42,6 @@ #include "team.hpp" #include "units/types.hpp" -#include "utils/foreach.hpp" - #include static std::string last_chosen_type_id = ""; @@ -129,7 +127,7 @@ void tunit_create::pre_show(twindow& window) list.clear(); - FOREACH(const AUTO & i, unit_types.types()) + for(const auto & i : unit_types.types()) { if(i.second.do_not_list()) continue; @@ -251,7 +249,7 @@ bool tunit_create::filter_text_changed(ttext_* textbox, const std::string& text) = find_widget(*it, "unit_type", false); bool found = false; - FOREACH(const AUTO & word, words) + for(const auto & word : words) { found = std::search(type_label.label().str().begin(), type_label.label().str().end(), diff --git a/src/gui/dialogs/unit_recruit.cpp b/src/gui/dialogs/unit_recruit.cpp index 328c7b92a00f..1a74c8697b5b 100644 --- a/src/gui/dialogs/unit_recruit.cpp +++ b/src/gui/dialogs/unit_recruit.cpp @@ -36,8 +36,6 @@ #include "units/types.hpp" #include "whiteboard/manager.hpp" -#include "utils/foreach.hpp" - #include namespace gui2 @@ -75,7 +73,7 @@ void tunit_recruit::pre_show(twindow& window) find_widget(&window, "show_help", false), boost::bind(&tunit_recruit::show_help, this, boost::ref(window))); - FOREACH(const AUTO& recruit, recruit_list_) + for(const auto& recruit : recruit_list_) { std::map row_data; string_map column; diff --git a/src/gui/dialogs/wml_error.cpp b/src/gui/dialogs/wml_error.cpp index ab673cfd9824..952ed5ed7bd6 100644 --- a/src/gui/dialogs/wml_error.cpp +++ b/src/gui/dialogs/wml_error.cpp @@ -50,7 +50,7 @@ std::string format_file_list(const std::vector& files_original) const std::string& addons_path = filesystem::get_addons_dir(); std::vector files(files_original); - BOOST_FOREACH(std::string & file, files) + for(std::string & file : files) { std::string base; std::string filename = filesystem::base_name(file); diff --git a/src/gui/dialogs/wml_message.cpp b/src/gui/dialogs/wml_message.cpp index 2fe69cbb20d8..7b3531ce72cb 100644 --- a/src/gui/dialogs/wml_message.cpp +++ b/src/gui/dialogs/wml_message.cpp @@ -101,7 +101,7 @@ void twml_message_::pre_show(twindow& window) if(!option_list_.empty()) { std::map data; - BOOST_FOREACH(const twml_message_option& item, option_list_) { + for(const twml_message_option& item : option_list_) { // Add the data. data["icon"]["label"] = item.image(); data["label"]["label"] = item.label(); diff --git a/src/gui/widgets/combobox.cpp b/src/gui/widgets/combobox.cpp index b636a5b9d994..3df15457d0fc 100644 --- a/src/gui/widgets/combobox.cpp +++ b/src/gui/widgets/combobox.cpp @@ -281,7 +281,7 @@ tbuilder_combobox::tbuilder_combobox(const config& cfg) , retval_(cfg["return_value"]) , options_() { - FOREACH(const AUTO& option, cfg.child_range("option")) { + for(const auto& option : cfg.child_range("option")) { options_.push_back(option["label"]); } } diff --git a/src/gui/widgets/control.cpp b/src/gui/widgets/control.cpp index c665b249f7f2..ab198de46d24 100644 --- a/src/gui/widgets/control.cpp +++ b/src/gui/widgets/control.cpp @@ -25,7 +25,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" #include "marked-up_text.hpp" -#include "utils/foreach.hpp" #include "hotkey/hotkey_item.hpp" #include "formatter.hpp" #include "gettext.hpp" @@ -251,7 +250,7 @@ tpoint tcontrol::calculate_best_size() const void tcontrol::place(const tpoint& origin, const tpoint& size) { // resize canvasses - FOREACH(AUTO & canvas, canvas_) + for(auto & canvas : canvas_) { canvas.set_width(size.x); canvas.set_height(size.y); @@ -368,7 +367,7 @@ void tcontrol::update_canvas() const int max_height = get_text_maximum_height(); // set label in canvases - FOREACH(AUTO & canvas, canvas_) + for(auto & canvas : canvas_) { canvas.set_variable("text", variant(label_)); canvas.set_variable("text_markup", variant(use_markup_)); diff --git a/src/gui/widgets/generator.cpp b/src/gui/widgets/generator.cpp index 7dbb6e49d415..bde6353e99cf 100644 --- a/src/gui/widgets/generator.cpp +++ b/src/gui/widgets/generator.cpp @@ -17,7 +17,6 @@ #include "gui/widgets/generator_private.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" namespace gui2 @@ -699,7 +698,7 @@ void tshow::init(tgrid* grid, { assert(!callback); - FOREACH(const AUTO & item, data) + for(const auto & item : data) { if(item.first.empty()) { for(unsigned row = 0; row < grid->get_rows(); ++row) { diff --git a/src/gui/widgets/generator_private.hpp b/src/gui/widgets/generator_private.hpp index 39de3329051a..cfbfad673fc2 100644 --- a/src/gui/widgets/generator_private.hpp +++ b/src/gui/widgets/generator_private.hpp @@ -22,7 +22,6 @@ #include "gui/widgets/selectable.hpp" #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/toggle_panel.hpp" -#include "utils/foreach.hpp" namespace gui2 { @@ -637,7 +636,7 @@ class tgenerator : public minimum_selection, /** Inherited from tgenerator_. */ void clear() { - FOREACH(AUTO item, items_) + for(auto item : items_) { delete item; } @@ -820,7 +819,7 @@ class tgenerator : public minimum_selection, /** See @ref twidget::layout_initialise. */ virtual void layout_initialise(const bool full_initialisation) override { - FOREACH(AUTO item, items_) + for(auto item : items_) { if(item->grid.get_visible() != twidget::tvisible::invisible && item->shown) { @@ -879,7 +878,7 @@ class tgenerator : public minimum_selection, { assert(this->get_visible() == twidget::tvisible::visible); calculate_order(); - FOREACH(AUTO index, order_) + for(auto index : order_) { titem* item = items_[index]; if(item->grid.get_visible() == twidget::tvisible::visible @@ -895,7 +894,7 @@ class tgenerator : public minimum_selection, child_populate_dirty_list(twindow& caller, const std::vector& call_stack) override { - FOREACH(AUTO item, items_) + for(auto item : items_) { std::vector child_call_stack = call_stack; item->grid.populate_dirty_list(caller, child_call_stack); @@ -919,7 +918,7 @@ class tgenerator : public minimum_selection, /** See @ref twidget::disable_click_dismiss. */ bool disable_click_dismiss() const override { - FOREACH(AUTO item, items_) + for(auto item : items_) { if(item->grid.disable_click_dismiss()) { return true; @@ -1127,7 +1126,7 @@ class tgenerator : public minimum_selection, const boost::function& callback) { int i = index; - FOREACH(const AUTO & item_data, data) + for(const auto & item_data : data) { create_item(i, list_builder, item_data, callback); if(i != -1) { diff --git a/src/gui/widgets/grid.cpp b/src/gui/widgets/grid.cpp index 7bfd42d7054b..1e7f46e6cfde 100644 --- a/src/gui/widgets/grid.cpp +++ b/src/gui/widgets/grid.cpp @@ -20,7 +20,6 @@ #include "gui/core/log.hpp" #include "gui/core/layout_exception.hpp" #include "gui/widgets/control.hpp" -#include "utils/foreach.hpp" #include @@ -50,7 +49,7 @@ tgrid::~tgrid() { // Delete the children in this destructor since resizing a vector copies the // children and thus frees the child prematurely. - FOREACH(AUTO & child, children_) + for(auto & child : children_) { delete child.widget(); } @@ -104,7 +103,7 @@ twidget* tgrid::swap_child(const std::string& id, { assert(widget); - FOREACH(AUTO & child, children_) + for(auto & child : children_) { if(child.id() != id) { @@ -152,7 +151,7 @@ void tgrid::remove_child(const unsigned row, const unsigned col) void tgrid::remove_child(const std::string& id, const bool find_all) { - FOREACH(AUTO & child, children_) + for(auto & child : children_) { if(child.id() == id) { @@ -168,7 +167,7 @@ void tgrid::remove_child(const std::string& id, const bool find_all) void tgrid::set_active(const bool active) { - FOREACH(AUTO & child, children_) + for(auto & child : children_) { twidget* widget = child.widget(); @@ -195,7 +194,7 @@ void tgrid::layout_initialise(const bool full_initialisation) twidget::layout_initialise(full_initialisation); // Clear child caches. - FOREACH(AUTO & child, children_) + for(auto & child : children_) { child.layout_initialise(full_initialisation); @@ -422,7 +421,7 @@ tpoint tgrid::calculate_best_size() const bool tgrid::can_wrap() const { - FOREACH(const AUTO & child, children_) + for(const auto & child : children_) { if(child.can_wrap()) { return true; @@ -492,7 +491,7 @@ void tgrid::place(const tpoint& origin, const tpoint& size) if(w_size == 0) { // If all sizes are 0 reset them to 1 - FOREACH(AUTO & val, col_grow_factor_) + for(auto & val : col_grow_factor_) { val = 1; } @@ -519,7 +518,7 @@ void tgrid::place(const tpoint& origin, const tpoint& size) if(h_size == 0) { // If all sizes are 0 reset them to 1 - FOREACH(AUTO & val, row_grow_factor_) + for(auto & val : row_grow_factor_) { val = 1; } @@ -547,7 +546,7 @@ void tgrid::set_origin(const tpoint& origin) // Inherited. twidget::set_origin(origin); - FOREACH(AUTO & child, children_) + for(auto & child : children_) { twidget* widget = child.widget(); @@ -563,7 +562,7 @@ void tgrid::set_visible_rectangle(const SDL_Rect& rectangle) // Inherited. twidget::set_visible_rectangle(rectangle); - FOREACH(AUTO & child, children_) + for(auto & child : children_) { twidget* widget = child.widget(); @@ -575,7 +574,7 @@ void tgrid::set_visible_rectangle(const SDL_Rect& rectangle) void tgrid::layout_children() { - FOREACH(AUTO & child, children_) + for(auto & child : children_) { assert(child.widget()); child.widget()->layout_children(); @@ -587,7 +586,7 @@ void tgrid::child_populate_dirty_list(twindow& caller, { assert(!call_stack.empty() && call_stack.back() == this); - FOREACH(AUTO & child, children_) + for(auto & child : children_) { assert(child.widget()); @@ -627,7 +626,7 @@ bool tgrid::has_widget(const twidget& widget) const return true; } - FOREACH(const AUTO & child, children_) + for(const auto & child : children_) { if(child.widget()->has_widget(widget)) { return true; @@ -642,7 +641,7 @@ bool tgrid::disable_click_dismiss() const return false; } - FOREACH(const AUTO & child, children_) + for(const auto & child : children_) { const twidget* widget = child.widget(); assert(widget); @@ -921,7 +920,7 @@ void tgrid::impl_draw_children(surface& frame_buffer, int x_offset, int y_offset assert(get_visible() == twidget::tvisible::visible); set_is_dirty(false); - FOREACH(AUTO & child, children_) + for(auto & child : children_) { twidget* widget = child.widget(); diff --git a/src/gui/widgets/group.hpp b/src/gui/widgets/group.hpp index de4e370e23ff..9c442a2799f4 100644 --- a/src/gui/widgets/group.hpp +++ b/src/gui/widgets/group.hpp @@ -17,7 +17,7 @@ #include "gui/core/event/dispatcher.hpp" #include "gui/widgets/selectable.hpp" #include "gui/widgets/widget.hpp" -#include "utils/foreach.hpp" +#include "utils/iterable_pair.hpp" #include #include @@ -84,7 +84,7 @@ class tgroup */ void group_operator() { - FOREACH(AUTO& member, members()) + for(auto& member : members()) { member.first->set_value(false); } @@ -96,7 +96,7 @@ class tgroup */ T get_active_member_value() { - FOREACH(AUTO& member, members()) + for(auto& member : members()) { if(member.first->get_value_bool()) { return member.second; @@ -112,7 +112,7 @@ class tgroup */ void set_member_states(const T& value) { - FOREACH(AUTO& member, members()) + for(auto& member : members()) { member.first->set_value(member.second == value); } diff --git a/src/gui/widgets/listbox.cpp b/src/gui/widgets/listbox.cpp index 7246e4aa8d18..4824f6537348 100644 --- a/src/gui/widgets/listbox.cpp +++ b/src/gui/widgets/listbox.cpp @@ -568,7 +568,7 @@ void tlistbox::order_by_column(unsigned column, twidget& widget) if(column >= orders_.size()) { return; } - FOREACH(AUTO& pair, orders_) + for(auto& pair : orders_) { if(pair.first != nullptr && pair.first != &selectable) { pair.first->set_value(0); @@ -867,14 +867,14 @@ tbuilder_listbox::tbuilder_listbox(const config& cfg) return; } - FOREACH(const AUTO & row, data.child_range("row")) + for(const auto & row : data.child_range("row")) { unsigned col = 0; - FOREACH(const AUTO & c, row.child_range("column")) + for(const auto & c : row.child_range("column")) { list_data.push_back(string_map()); - FOREACH(const AUTO & i, c.attribute_range()) + for(const auto & i : c.attribute_range()) { list_data.back()[i.first] = i.second; } @@ -1033,14 +1033,14 @@ tbuilder_horizontal_listbox::tbuilder_horizontal_listbox(const config& cfg) if(!data) return; - FOREACH(const AUTO & row, data.child_range("row")) + for(const auto & row : data.child_range("row")) { unsigned col = 0; - FOREACH(const AUTO & c, row.child_range("column")) + for(const auto & c : row.child_range("column")) { list_data.push_back(string_map()); - FOREACH(const AUTO & i, c.attribute_range()) + for(const auto & i : c.attribute_range()) { list_data.back()[i.first] = i.second; } diff --git a/src/gui/widgets/multi_page.cpp b/src/gui/widgets/multi_page.cpp index ed513f7f6828..1325d9550519 100644 --- a/src/gui/widgets/multi_page.cpp +++ b/src/gui/widgets/multi_page.cpp @@ -281,14 +281,14 @@ tbuilder_multi_page::tbuilder_multi_page(const config& cfg) return; } - FOREACH(const AUTO & row, d.child_range("row")) + for(const auto & row : d.child_range("row")) { unsigned col = 0; - FOREACH(const AUTO & column, row.child_range("column")) + for(const auto & column : row.child_range("column")) { data.push_back(string_map()); - FOREACH(const AUTO & i, column.attribute_range()) + for(const auto & i : column.attribute_range()) { data.back()[i.first] = i.second; } diff --git a/src/gui/widgets/pane.cpp b/src/gui/widgets/pane.cpp index 9ddbe53deda8..52995ae4c6ae 100644 --- a/src/gui/widgets/pane.cpp +++ b/src/gui/widgets/pane.cpp @@ -62,7 +62,7 @@ struct tpane_implementation } typedef typename utils::tconst_clone::reference thack; - BOOST_FOREACH(thack item, pane->items_) + for(thack item : pane->items_) { if(item.grid->get_visible() == twidget::tvisible::invisible) { @@ -96,7 +96,7 @@ struct tpane_implementation grid(W pane, const unsigned id) { typedef typename utils::tconst_clone::reference thack; - BOOST_FOREACH(thack item, pane->items_) + for(thack item : pane->items_) { if(item.id == id) { @@ -146,7 +146,7 @@ unsigned tpane::create_item(const std::map& item_data, item.grid->set_parent(this); - FOREACH(const AUTO & data, item_data) + for(const auto & data : item_data) { tcontrol* control = find_widget(item.grid, data.first, false, false); @@ -181,7 +181,7 @@ void tpane::layout_initialise(const bool full_initialisation) twidget::layout_initialise(full_initialisation); - FOREACH(AUTO & item, items_) + for(auto & item : items_) { if(item.grid->get_visible() != twidget::tvisible::invisible) { item.grid->layout_initialise(full_initialisation); @@ -194,7 +194,7 @@ tpane::impl_draw_children(surface& frame_buffer, int x_offset, int y_offset) { DBG_GUI_D << LOG_HEADER << '\n'; - FOREACH(AUTO & item, items_) + for(auto & item : items_) { if(item.grid->get_visible() != twidget::tvisible::invisible) { item.grid->draw_children(frame_buffer, x_offset, y_offset); @@ -205,7 +205,7 @@ tpane::impl_draw_children(surface& frame_buffer, int x_offset, int y_offset) void tpane::child_populate_dirty_list(twindow& caller, const std::vector& call_stack) { - FOREACH(AUTO & item, items_) + for(auto & item : items_) { std::vector child_call_stack = call_stack; item.grid->populate_dirty_list(caller, child_call_stack); @@ -221,7 +221,7 @@ void tpane::sort(const tcompare_functor& compare_functor) void tpane::filter(const tfilter_functor& filter_functor) { - FOREACH(AUTO & item, items_) + for(auto & item : items_) { item.grid->set_visible(filter_functor(item) ? twidget::tvisible::visible @@ -279,7 +279,7 @@ void tpane::place_children() { prepare_placement(); unsigned index = 0; - FOREACH(AUTO & item, items_) + for(auto & item : items_) { if(item.grid->get_visible() == twidget::tvisible::invisible) { continue; @@ -295,7 +295,7 @@ void tpane::set_origin_children() { prepare_placement(); unsigned index = 0; - FOREACH(AUTO & item, items_) + for(auto & item : items_) { if(item.grid->get_visible() == twidget::tvisible::invisible) { continue; @@ -311,7 +311,7 @@ void tpane::place_or_set_origin_children() { prepare_placement(); unsigned index = 0; - FOREACH(AUTO & item, items_) + for(auto & item : items_) { if(item.grid->get_visible() == twidget::tvisible::invisible) { continue; @@ -332,7 +332,7 @@ void tpane::prepare_placement() const assert(placer_.get()); placer_->initialise(); - FOREACH(const AUTO & item, items_) + for(const auto & item : items_) { if(item.grid->get_visible() == twidget::tvisible::invisible) { continue; @@ -350,7 +350,7 @@ void tpane::signal_handler_request_placement(tdispatcher& dispatcher, twidget* widget = dynamic_cast(&dispatcher); if(widget) { - FOREACH(AUTO & item, items_) + for(auto & item : items_) { if(item.grid->has_widget(*widget)) { if(item.grid->get_visible() != twidget::tvisible::invisible) { diff --git a/src/gui/widgets/progress_bar.cpp b/src/gui/widgets/progress_bar.cpp index 42fdd4a4d98b..e21523f68629 100644 --- a/src/gui/widgets/progress_bar.cpp +++ b/src/gui/widgets/progress_bar.cpp @@ -19,7 +19,6 @@ #include "gui/core/log.hpp" #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" -#include "utils/foreach.hpp" #include @@ -55,7 +54,7 @@ void tprogress_bar::set_percentage(unsigned percentage) if(percentage_ != percentage) { percentage_ = percentage; - FOREACH(AUTO & c, canvas()) + for(auto & c : canvas()) { c.set_variable("percentage", variant(percentage)); } diff --git a/src/gui/widgets/scrollbar.cpp b/src/gui/widgets/scrollbar.cpp index 7a00270f8d68..6d393d4e75ee 100644 --- a/src/gui/widgets/scrollbar.cpp +++ b/src/gui/widgets/scrollbar.cpp @@ -18,7 +18,6 @@ #include "gui/core/log.hpp" #include "gui/widgets/window.hpp" // Needed for invalidate_layout() -#include "utils/foreach.hpp" #include @@ -150,7 +149,7 @@ void tscrollbar_::set_item_position(const unsigned item_position) void tscrollbar_::update_canvas() { - FOREACH(AUTO & tmp, canvas()) + for(auto & tmp : canvas()) { tmp.set_variable("positioner_offset", variant(positioner_offset_)); tmp.set_variable("positioner_length", variant(positioner_length_)); @@ -307,7 +306,7 @@ void tscrollbar_::move_positioner(const int distance) void tscrollbar_::load_config_extra() { // These values won't change so set them here. - FOREACH(AUTO & tmp, canvas()) + for(auto & tmp : canvas()) { tmp.set_variable("offset_before", variant(offset_before())); tmp.set_variable("offset_after", variant(offset_after())); diff --git a/src/gui/widgets/scrollbar_container.cpp b/src/gui/widgets/scrollbar_container.cpp index bdcd3f38569c..0979873ad340 100644 --- a/src/gui/widgets/scrollbar_container.cpp +++ b/src/gui/widgets/scrollbar_container.cpp @@ -22,7 +22,6 @@ #include "gui/widgets/clickable.hpp" #include "gui/widgets/spacer.hpp" #include "gui/widgets/window.hpp" -#include "utils/foreach.hpp" #include "sdl/rect.hpp" #include @@ -766,7 +765,7 @@ void tscrollbar_container::finalize_setup() this)); /***** Setup the scrollbar buttons *****/ - FOREACH(const AUTO & item, scroll_lookup()) + for(const auto & item : scroll_lookup()) { // Vertical. @@ -915,7 +914,7 @@ void tscrollbar_container::set_scrollbar_button_status() { if(true) { /** @todo scrollbar visibility. */ /***** set scroll up button status *****/ - FOREACH(const AUTO & name, button_up_names) + for(const auto & name : button_up_names) { tcontrol* button = find_widget( vertical_scrollbar_grid_, name, false, false); @@ -926,7 +925,7 @@ void tscrollbar_container::set_scrollbar_button_status() } /***** set scroll down status *****/ - FOREACH(const AUTO & name, button_down_names) + for(const auto & name : button_down_names) { tcontrol* button = find_widget( vertical_scrollbar_grid_, name, false, false); @@ -943,7 +942,7 @@ void tscrollbar_container::set_scrollbar_button_status() if(true) { /** @todo scrollbar visibility. */ /***** Set scroll left button status *****/ - FOREACH(const AUTO & name, button_up_names) + for(const auto & name : button_up_names) { tcontrol* button = find_widget( horizontal_scrollbar_grid_, name, false, false); @@ -954,7 +953,7 @@ void tscrollbar_container::set_scrollbar_button_status() } /***** Set scroll right button status *****/ - FOREACH(const AUTO & name, button_down_names) + for(const auto & name : button_down_names) { tcontrol* button = find_widget( horizontal_scrollbar_grid_, name, false, false); diff --git a/src/gui/widgets/settings.cpp b/src/gui/widgets/settings.cpp index edd579da8fbf..4e762c87466a 100644 --- a/src/gui/widgets/settings.cpp +++ b/src/gui/widgets/settings.cpp @@ -32,7 +32,6 @@ #include "serialization/preprocessor.hpp" #include "serialization/schema_validator.hpp" #include "formula/string_utils.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" namespace gui2 @@ -347,13 +346,13 @@ const std::string& tgui_definition::read(const config& cfg) /***** Control definitions *****/ - FOREACH(AUTO & widget_type, registred_widget_type()) + for(auto & widget_type : registred_widget_type()) { widget_type.second(*this, widget_type.first, cfg, nullptr); } /***** Window types *****/ - FOREACH(const AUTO & w, cfg.child_range("window")) + for(const auto & w : cfg.child_range("window")) { std::pair child; child.first = child.second.read(w); @@ -433,7 +432,7 @@ void tgui_definition::load_widget_definitions( const std::string& definition_type, const std::vector& definitions) { - FOREACH(const AUTO & def, definitions) + for(const auto & def : definitions) { // We assume all definitions are unique if not we would leak memory. @@ -515,7 +514,7 @@ void load_settings() ERR_GUI_P << e.message; } // Parse guis - FOREACH(const AUTO & g, cfg.child_range("gui")) + for(const auto & g : cfg.child_range("gui")) { std::pair child; child.first = child.second.read(g); diff --git a/src/gui/widgets/settings.hpp b/src/gui/widgets/settings.hpp index 665747124763..91c1d4ace09c 100644 --- a/src/gui/widgets/settings.hpp +++ b/src/gui/widgets/settings.hpp @@ -20,7 +20,6 @@ #ifndef GUI_WIDGETS_SETTING_HPP_INCLUDED #define GUI_WIDGETS_SETTING_HPP_INCLUDED -#include "utils/foreach.hpp" #include "utils/boost_function_guarded.hpp" #include "config.hpp" #include "gui/core/widget_definition.hpp" @@ -125,7 +124,7 @@ void load_widget_definitions(tgui_definition& gui_definition, { std::vector definitions; - FOREACH(const AUTO & definition, + for (const auto & definition : cfg.child_range(key ? key : definition_type + "_definition")) { diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp index 830c5a3624ee..941b15809f89 100644 --- a/src/gui/widgets/slider.cpp +++ b/src/gui/widgets/slider.cpp @@ -22,7 +22,6 @@ #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" #include "sound.hpp" -#include "utils/foreach.hpp" #include "gettext.hpp" #include "wml_exception.hpp" @@ -232,7 +231,7 @@ void tslider::update_canvas() // Inherited. tscrollbar_::update_canvas(); - FOREACH(AUTO & tmp, canvas()) + for(auto & tmp : canvas()) { tmp.set_variable("text", variant(get_value_label())); } @@ -448,7 +447,7 @@ tbuilder_slider::tbuilder_slider(const config& cfg) return; } - FOREACH(const AUTO & label, labels.child_range("value")) + for(const auto & label : labels.child_range("value")) { value_labels_.push_back(label["label"]); } diff --git a/src/gui/widgets/stacked_widget.cpp b/src/gui/widgets/stacked_widget.cpp index d7651f699553..cb84fd203bd4 100644 --- a/src/gui/widgets/stacked_widget.cpp +++ b/src/gui/widgets/stacked_widget.cpp @@ -21,7 +21,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/generator.hpp" #include "gettext.hpp" -#include "utils/foreach.hpp" #include @@ -99,7 +98,7 @@ tstacked_widget::finalize(std::vector widget_builder) { assert(generator_); string_map empty_data; - FOREACH(const AUTO & builder, widget_builder) + for(const auto & builder : widget_builder) { generator_->create_item(-1, builder, empty_data, NULL); } @@ -235,7 +234,7 @@ tbuilder_stacked_widget::tbuilder_stacked_widget(const config& cfg) { const config& s = cfg.child("stack"); VALIDATE(s, _("No stack defined.")); - FOREACH(const AUTO & layer, s.child_range("layer")) + for(const auto & layer : s.child_range("layer")) { stack.push_back(new tbuilder_grid(layer)); } diff --git a/src/gui/widgets/text_box.cpp b/src/gui/widgets/text_box.cpp index 66a7268384ae..8365ecdb02c9 100644 --- a/src/gui/widgets/text_box.cpp +++ b/src/gui/widgets/text_box.cpp @@ -22,7 +22,6 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" #include "game_preferences.hpp" -#include "utils/foreach.hpp" #include "serialization/unicode.hpp" #include @@ -168,7 +167,7 @@ void ttext_box::update_canvas() const int max_width = get_text_maximum_width(); const int max_height = get_text_maximum_height(); - FOREACH(AUTO & tmp, canvas()) + for(auto & tmp : canvas()) { tmp.set_variable("text", variant(get_value())); @@ -264,7 +263,7 @@ void ttext_box::update_offsets() // Since this variable doesn't change set it here instead of in // update_canvas(). - FOREACH(AUTO & tmp, canvas()) + for(auto & tmp : canvas()) { tmp.set_variable("text_font_height", variant(text_height_)); } diff --git a/src/gui/widgets/toggle_button.cpp b/src/gui/widgets/toggle_button.cpp index 3cf4d62865e6..84a511940b62 100644 --- a/src/gui/widgets/toggle_button.cpp +++ b/src/gui/widgets/toggle_button.cpp @@ -22,7 +22,6 @@ #include "gui/core/log.hpp" #include "gui/core/window_builder/helper.hpp" #include "sound.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" #include @@ -104,7 +103,7 @@ void ttoggle_button::update_canvas() // set icon in canvases std::vector& canvases = tcontrol::canvas(); - FOREACH(AUTO & canvas, canvases) + for(auto & canvas : canvases) { canvas.set_variable("icon", variant(icon_name_)); } @@ -244,7 +243,7 @@ ttoggle_button_definition::tresolution::tresolution(const config& cfg) { // Note the order should be the same as the enum tstate in // toggle_button.hpp. - FOREACH(const AUTO& c, cfg.child_range("state")) + for(const auto& c : cfg.child_range("state")) { state.push_back(tstate_definition(c.child("enabled"))); state.push_back(tstate_definition(c.child("disabled"))); diff --git a/src/gui/widgets/toggle_panel.cpp b/src/gui/widgets/toggle_panel.cpp index 454cda5b11b6..9b6dd6155d78 100644 --- a/src/gui/widgets/toggle_panel.cpp +++ b/src/gui/widgets/toggle_panel.cpp @@ -23,7 +23,6 @@ #include "gui/core/window_builder/helper.hpp" #include "gettext.hpp" #include "sound.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" #include @@ -91,7 +90,7 @@ unsigned ttoggle_panel::num_states() const void ttoggle_panel::set_child_members( const std::map& data) { - FOREACH(const AUTO & item, data) + for(const auto & item : data) { tcontrol* control = dynamic_cast(find(item.first, false)); if(control) { @@ -366,7 +365,7 @@ ttoggle_panel_definition::tresolution::tresolution(const config& cfg) , right_border(cfg["right_border"]) { // Note the order should be the same as the enum tstate in toggle_panel.hpp. - FOREACH(const AUTO& c, cfg.child_range("state")) + for(const auto& c : cfg.child_range("state")) { state.push_back(tstate_definition(c.child("enabled"))); state.push_back(tstate_definition(c.child("disabled"))); diff --git a/src/gui/widgets/tree_view.cpp b/src/gui/widgets/tree_view.cpp index 60ba8f88996b..40c0e40600b2 100644 --- a/src/gui/widgets/tree_view.cpp +++ b/src/gui/widgets/tree_view.cpp @@ -377,7 +377,7 @@ tbuilder_tree_view::tbuilder_tree_view(const config& cfg) , nodes() { - FOREACH(const AUTO & node, cfg.child_range("node")) + for(const auto & node : cfg.child_range("node")) { nodes.push_back(ttree_node(node)); } diff --git a/src/gui/widgets/tree_view_node.cpp b/src/gui/widgets/tree_view_node.cpp index ecec2fde5564..cfaae72595e7 100644 --- a/src/gui/widgets/tree_view_node.cpp +++ b/src/gui/widgets/tree_view_node.cpp @@ -22,7 +22,6 @@ #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/toggle_panel.hpp" #include "gui/widgets/tree_view.hpp" -#include "utils/foreach.hpp" #include @@ -55,7 +54,7 @@ ttree_view_node::ttree_view_node( grid_.set_parent(this); set_parent(&parent_tree_view); if(id != "root") { - FOREACH(const AUTO & node_definition, node_definitions_) + for(const auto & node_definition : node_definitions_) { if(node_definition.id == id) { node_definition.builder->build(&grid_); @@ -283,7 +282,7 @@ void ttree_view_node::clear() int height_reduction = 0; if(!is_folded()) { - FOREACH(const AUTO & node, children_) + for(const auto & node : children_) { height_reduction += node.get_current_size().y; } @@ -376,7 +375,7 @@ void ttree_view_node::impl_populate_dirty_list( return; } - FOREACH(AUTO & node, children_) + for(auto & node : children_) { std::vector child_call_stack = call_stack; node.impl_populate_dirty_list(caller, child_call_stack); @@ -541,7 +540,7 @@ unsigned ttree_view_node::place(const unsigned indention_step_size, } DBG_GUI_L << LOG_HEADER << " set children.\n"; - FOREACH(AUTO & node, children_) + for(auto & node : children_) { origin.y += node.place(indention_step_size, origin, width); } @@ -564,7 +563,7 @@ void ttree_view_node::set_visible_rectangle(const SDL_Rect& rectangle) return; } - FOREACH(AUTO & node, children_) + for(auto & node : children_) { node.set_visible_rectangle(rectangle); } @@ -580,7 +579,7 @@ void ttree_view_node::impl_draw_children(surface& frame_buffer, return; } - FOREACH(AUTO & node, children_) + for(auto & node : children_) { node.impl_draw_children(frame_buffer, x_offset, y_offset); } @@ -712,7 +711,7 @@ int ttree_view_node::calculate_ypos() return 0; } int res = parent_node_->calculate_ypos(); - FOREACH(const AUTO& node, parent_node_->children_) { + for(const auto& node : parent_node_->children_) { if(&node == this) { break; } @@ -814,7 +813,7 @@ void ttree_view_node::layout_initialise(const bool full_initialisation) twidget::layout_initialise(full_initialisation); grid_.layout_initialise(full_initialisation); // Clear child caches. - FOREACH(AUTO & child, children_) + for(auto & child : children_) { child.layout_initialise(full_initialisation); } diff --git a/src/gui/widgets/unit_preview_pane.cpp b/src/gui/widgets/unit_preview_pane.cpp index 1e6446bc4347..adfa69c1fefe 100644 --- a/src/gui/widgets/unit_preview_pane.cpp +++ b/src/gui/widgets/unit_preview_pane.cpp @@ -34,8 +34,6 @@ #include "team.hpp" #include "units/types.hpp" -#include "utils/foreach.hpp" - #include namespace gui2 @@ -129,7 +127,7 @@ void tunit_preview_pane::set_displayed_type(const unit_type* type) bool has_traits = false; std::stringstream t_str; - FOREACH(const AUTO& tr, type->possible_traits()) + for(const auto& tr : type->possible_traits()) { if(tr["availability"] != "musthave") continue; @@ -158,7 +156,7 @@ void tunit_preview_pane::set_displayed_type(const unit_type* type) if(!type->abilities().empty()) { str << "" << _("Abilities") << "" << "\n"; - FOREACH(const AUTO& ab, type->abilities()) + for(const auto& ab : type->abilities()) { str << " " << ab << "\n"; } @@ -170,7 +168,7 @@ void tunit_preview_pane::set_displayed_type(const unit_type* type) if(!type->attacks().empty()) { str << "" << _("Attacks") << "" << "\n"; - FOREACH(const AUTO& a, type->attacks()) + for(const auto& a : type->attacks()) { str << "" << a.damage() << utils::unicode_multiplication_sign << a.num_attacks() << " " << a.name() << "" << "\n"; diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index 836b61eb0c69..654029b8d611 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -59,7 +59,6 @@ #include "sdl/rect.hpp" #include "sdl/utils.hpp" #include "tstring.hpp" -#include "utils/foreach.hpp" #include "formula/variant.hpp" #include "video.hpp" #include "wml_exception.hpp" @@ -814,7 +813,7 @@ void twindow::draw() return; } - FOREACH(AUTO & item, dirty_list_) + for(auto & item : dirty_list_) { assert(!item.empty()); @@ -1195,13 +1194,13 @@ void twindow::layout() void twindow::layout_linked_widgets() { // evaluate the group sizes - FOREACH(AUTO & linked_size, linked_size_) + for(auto & linked_size : linked_size_) { tpoint max_size(0, 0); // Determine the maximum size. - FOREACH(AUTO widget, linked_size.second.widgets) + for(auto widget : linked_size.second.widgets) { const tpoint size = widget->get_best_size(); @@ -1221,7 +1220,7 @@ void twindow::layout_linked_widgets() } // Set the maximum size. - FOREACH(AUTO widget, linked_size.second.widgets) + for(auto widget : linked_size.second.widgets) { tpoint size = widget->get_best_size(); diff --git a/src/map/map.cpp b/src/map/map.cpp index f5de9aff365a..8ea4fc8967e6 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -37,7 +37,6 @@ #include #include -#include "utils/foreach.hpp" static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -185,7 +184,7 @@ void gamemap::read(const std::string& data, const bool allow_invalid, int border // Convert the starting positions to the array int max_stating_pos = 0; - FOREACH(const AUTO& pair, starting_positions) { + for(const auto& pair : starting_positions) { // Check for valid position, // the first valid position is 1, // so the offset 0 in the array is never used. @@ -201,7 +200,7 @@ void gamemap::read(const std::string& data, const bool allow_invalid, int border max_stating_pos = std::max(max_stating_pos, pair.first); } starting_positions_.resize(max_stating_pos); - FOREACH(const AUTO& pair, starting_positions) { + for(const auto& pair : starting_positions) { starting_positions_[pair.first - 1] = map_location(pair.second.x - border_size_, pair.second.y - border_size_); } // Post processing on the map diff --git a/src/quit_confirmation.cpp b/src/quit_confirmation.cpp index 9e2cdd15bb42..81ad34f2dccf 100644 --- a/src/quit_confirmation.cpp +++ b/src/quit_confirmation.cpp @@ -19,6 +19,7 @@ #include "gui/dialogs/message.hpp" #include "gui/widgets/window.hpp" #include "resources.hpp" +#include std::vector quit_confirmation::blockers_ = std::vector(); bool quit_confirmation::open_ = false; diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index df98a6ae3928..0fa465644568 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -43,7 +43,6 @@ #include "chat_events.hpp" // for chat_handler, etc #include "config.hpp" // for config, etc #include "display_chat_manager.hpp" // for clear_chat_messages -#include "utils/foreach.hpp" #include "formatter.hpp" #include "game_board.hpp" // for game_board #include "game_classification.hpp" // for game_classification, etc @@ -4542,7 +4541,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle lua_settop(L, 0); - FOREACH(const AUTO& handler, game_events::wml_action::registry()) + for(const auto& handler : game_events::wml_action::registry()) { set_wml_action(handler.first, handler.second); } diff --git a/src/server/game.cpp b/src/server/game.cpp index 11bb230749ab..f7a3eb1c0772 100644 --- a/src/server/game.cpp +++ b/src/server/game.cpp @@ -22,7 +22,6 @@ #include "player_network.hpp" #include "serialization/string_utils.hpp" #include "util.hpp" -#include "utils/foreach.hpp" #include #include @@ -1371,7 +1370,7 @@ void game::load_next_scenario(const player_map::const_iterator user) { simple_wml::document doc_controllers; simple_wml::node & cfg_controllers = doc_controllers.root().add_child("controllers"); - FOREACH(const AUTO& side_user, sides_) { + for (const auto& side_user : sides_) { simple_wml::node & cfg_controller = cfg_controllers.add_child("controller"); cfg_controller.set_attr("is_local", side_user == user->first ? "yes" : "no"); } diff --git a/src/theme.cpp b/src/theme.cpp index 521e22d799ae..19f4f2ba0ff1 100644 --- a/src/theme.cpp +++ b/src/theme.cpp @@ -23,7 +23,6 @@ #include "log.hpp" #include "serialization/string_utils.hpp" #include "theme.hpp" -#include "utils/foreach.hpp" #include "wml_exception.hpp" #include "sdl/rect.hpp" @@ -174,7 +173,7 @@ namespace { */ static config get_resolution(const config& resolutions, const std::string& id) { - FOREACH(const AUTO& resolution, resolutions.child_range("resolution")) { + for(const auto& resolution : resolutions.child_range("resolution")) { if(resolution["id"] == id) { return resolution; } @@ -199,16 +198,16 @@ static config expand_partialresolution(const config& theme) config result; // Add all the resolutions - FOREACH(const AUTO& resolution, theme.child_range("resolution")) { + for(const auto& resolution : theme.child_range("resolution")) { result.add_child("resolution", resolution); } // Resolve all the partialresolutions - FOREACH(const AUTO& part, theme.child_range("partialresolution")) { + for(const auto& part : theme.child_range("partialresolution")) { config resolution = get_resolution(result, part["inherits"]); resolution.merge_attributes(part); - FOREACH(const AUTO& remove, part.child_range("remove")) { + for(const auto& remove : part.child_range("remove")) { VALIDATE(!remove["id"].empty() , missing_mandatory_wml_key( "[theme][partialresolution][remove]" @@ -217,7 +216,7 @@ static config expand_partialresolution(const config& theme) find_ref(remove["id"], resolution, true); } - FOREACH(const AUTO& change, part.child_range("change")) { + for(const auto& change : part.child_range("change")) { VALIDATE(!change["id"].empty() , missing_mandatory_wml_key( "[theme][partialresolution][change]" @@ -228,8 +227,8 @@ static config expand_partialresolution(const config& theme) } // cannot add [status] sub-elements, but who cares - FOREACH(const AUTO& add, part.child_range("add")) { - FOREACH(const AUTO& child, add.all_children_range()) { + for(const auto& add : part.child_range("add")) { + for(const auto& child : add.all_children_range()) { resolution.add_child(child.key, child.cfg); } } @@ -243,7 +242,7 @@ static config expand_partialresolution(const config& theme) static void do_resolve_rects(const config& cfg, config& resolved_config, config* resol_cfg = nullptr) { // recursively resolve children - BOOST_FOREACH(const config::any_child &value, cfg.all_children_range()) { + for(const config::any_child &value : cfg.all_children_range()) { config &childcfg = resolved_config.add_child(value.key); do_resolve_rects(value.cfg, childcfg, value.key == "resolution" ? &childcfg : resol_cfg); @@ -637,7 +636,7 @@ bool theme::set_resolution(const SDL_Rect& screen) int current_rating = 1000000; const config *current = nullptr; - BOOST_FOREACH(const config &i, cfg_.child_range("resolution")) + for(const config &i : cfg_.child_range("resolution")) { int width = i["width"]; int height = i["height"]; @@ -717,7 +716,7 @@ void theme::add_object(const config& cfg) if (const config &status_cfg = cfg.child("status")) { - BOOST_FOREACH(const config::any_child &i, status_cfg.all_children_range()) { + for(const config::any_child &i : status_cfg.all_children_range()) { status_.insert(std::pair(i.key, status_item(i.cfg))); } if (const config &unit_image_cfg = status_cfg.child("unit_image")) { @@ -727,19 +726,19 @@ void theme::add_object(const config& cfg) } } - BOOST_FOREACH(const config &p, cfg.child_range("panel")) { + for(const config &p : cfg.child_range("panel")) { panel new_panel(p); set_object_location(new_panel, p["rect"], p["ref"]); panels_.push_back(new_panel); } - BOOST_FOREACH(const config &lb, cfg.child_range("label")) { + for(const config &lb : cfg.child_range("label")) { label new_label(lb); set_object_location(new_label, lb["rect"], lb["ref"]); labels_.push_back(new_label); } - BOOST_FOREACH(const config &m, cfg.child_range("menu")) + for(const config &m : cfg.child_range("menu")) { menu new_menu(m); DBG_DP << "adding menu: " << (new_menu.is_context() ? "is context" : "not context") << "\n"; @@ -753,7 +752,7 @@ void theme::add_object(const config& cfg) DBG_DP << "done adding menu...\n"; } - BOOST_FOREACH(const config &a, cfg.child_range("action")) + for(const config &a : cfg.child_range("action")) { action new_action(a); DBG_DP << "adding action: " << (new_action.is_context() ? "is context" : "not context") << "\n"; @@ -767,7 +766,7 @@ void theme::add_object(const config& cfg) DBG_DP << "done adding action...\n"; } - BOOST_FOREACH(const config &s, cfg.child_range("slider")) + for(const config &s : cfg.child_range("slider")) { slider new_slider(s); DBG_DP << "adding slider\n"; @@ -847,7 +846,7 @@ void theme::modify(const config &cfg) } // Change existing theme objects. - BOOST_FOREACH(const config &c, cfg.child_range("change")) + for(const config &c : cfg.child_range("change")) { std::string id = c["id"]; std::string ref_id = c["ref"]; @@ -857,12 +856,12 @@ void theme::modify(const config &cfg) } // Add new theme objects. - BOOST_FOREACH(const config &c, cfg.child_range("add")) { + for(const config &c : cfg.child_range("add")) { add_object(c); } // Remove existent theme objects. - BOOST_FOREACH(const config &c, cfg.child_range("remove")) { + for(const config &c : cfg.child_range("remove")) { remove_object(c["id"]); } @@ -916,7 +915,7 @@ void theme::set_known_themes(const config* cfg) if (!cfg) return; - BOOST_FOREACH(const config &thm, cfg->child_range("theme")) + for(const config &thm : cfg->child_range("theme")) { std::string thm_id = thm["id"]; @@ -945,7 +944,7 @@ std::vector theme::get_known_themes() const theme::menu *theme::get_menu_item(const std::string &key) const { - BOOST_FOREACH(const theme::menu &m, menus_) { + for(const theme::menu &m : menus_) { if (m.get_id() == key) return &m; } return nullptr; @@ -953,7 +952,7 @@ const theme::menu *theme::get_menu_item(const std::string &key) const const theme::action *theme::get_action_item(const std::string &key) const { - BOOST_FOREACH(const theme::action &a, actions_) { + for(const theme::action &a : actions_) { if (a.get_id() == key) return &a; } return nullptr; diff --git a/src/utils/foreach.hpp b/src/utils/foreach.hpp deleted file mode 100644 index 61881624f9fd..000000000000 --- a/src/utils/foreach.hpp +++ /dev/null @@ -1,67 +0,0 @@ -/* - Copyright (C) 2013 - 2016 by Mark de Wever - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -#ifndef UTILS_FOREACH_TPP_INCLUDED -#define UTILS_FOREACH_TPP_INCLUDED - -/** - * @file - * Contains the emulation for the C++11 ranged for loop with auto: - * @code for(auto foo : bar) @endcode. - * The code is based upon Boost bug report [1] and uses BOOST_FOREACH and - * BOOST_TYPEOF internally. - * - * [1] https://svn.boost.org/trac/boost/ticket/3643 - */ - -#include -#include - -/** - * The ranged based for emulation macro. - * - * For example iterating over a std:vector named vec turns into: - * @code -FOREACH(value, vec) { - ... -} -@endcode - * This iterates over the copy of a the value, using a reference looks like: - * @code -FOREACH( & value, vec) { - ... -} -@endcode - * Which looks somewhat ugly. To 'fix' the problem the dummy macro @ref AUTO - * is defined, allowing to use the following syntax: - * @code -FOREACH(AUTO& value, vec) { - ... -} -@endcode - * The @ref AUTO could also have been used in the first example. For - * readability it might be a good idea to always use the @ref AUTO macro. - * That way the sytax also looks more like the real C++11 code. - */ -#define FOREACH(VAR, RANGE) \ - BOOST_FOREACH(BOOST_TYPEOF(*boost::begin(RANGE)) VAR, RANGE) - -/** - * Dummy macro. - * - * See @ref FOREACH for more info. - */ -#define AUTO - -#endif diff --git a/src/utils/iterable_pair.hpp b/src/utils/iterable_pair.hpp new file mode 100644 index 000000000000..6a61a21f68ae --- /dev/null +++ b/src/utils/iterable_pair.hpp @@ -0,0 +1,38 @@ +/* + Copyright (C) 2014 - 2016 by David White + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. + */ + +/** + * @file Enable range-for iteration over pairs of iterators. + */ + +#ifndef UTILS_ITERABLE_PAIR_HPP_INCLUDED +#define UTILS_ITERABLE_PAIR_HPP_INCLUDED + +#include + +namespace std { // Some cases don't work if not in std namespace + +template +inline T begin(const std::pair& p) { + return p.first; +} + +template +inline T end(const std::pair& p) { + return p.second; +} + +} + +#endif From bb02ce7c72ab6c8bd3595fd60cd9232809dfde57 Mon Sep 17 00:00:00 2001 From: loonycyborg Date: Fri, 1 Apr 2016 18:58:11 +0300 Subject: [PATCH 116/240] scons: add option to enable using c++14 features --- SConstruct | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index fdd05e8a51a0..86d505b67dca 100755 --- a/SConstruct +++ b/SConstruct @@ -103,6 +103,7 @@ opts.AddVariables( BoolVariable('ccache', "Use ccache", False), ('ctool', 'Set c compiler command if not using standard compiler.'), ('cxxtool', 'Set c++ compiler command if not using standard compiler.'), + EnumVariable('cxx_std', 'Target c++ std version', '11', ['11', '14']), BoolVariable('openmp', 'Enable openmp use.', False), BoolVariable("fast", "Make scons faster at cost of less precise dependency tracking.", False), BoolVariable("lockfile", "Create a lockfile to prevent multiple instances of scons from being run at the same time on this working copy.", False), @@ -500,7 +501,7 @@ for env in [test_env, client_env, env]: if "gcc" in env["TOOLS"]: env.AppendUnique(CCFLAGS = Split("-W -Wall"), CFLAGS = ["-std=c99"]) - env.AppendUnique(CXXFLAGS = "-std=c++11") + env.AppendUnique(CXXFLAGS = "-std=c++" + env["cxx_std"]) env.Append(CPPDEFINES = "HAVE_CXX0X") if env['openmp']: From ae09f7975b0d5e07b5ee53aaaf97a456529d6740 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 18:55:51 +0200 Subject: [PATCH 117/240] Add c++14 test to travis --- .travis.yml | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 249c6b242722..07a4ed641e7f 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,12 +11,15 @@ compiler: env: - BUILD="-O0" - BUILD="-O2" + - BUILD="C++14 -O2" - BUILD="translations" matrix: exclude: - compiler: gcc env: BUILD="-O2" + - compiler: gcc + env: BUILD="C++14 -O2" - compiler: gcc env: BUILD="translations" @@ -31,7 +34,7 @@ before_install: - export EXTRA_FLAGS_RELEASE="-O0" - export WML_TEST_TIME=20 - export NLS=false - - export CXX11=true + - export CXXSTD=11 - if [ "$CXX" == "g++" ]; then export CXX=g++-4.7; fi @@ -39,6 +42,11 @@ before_install: - if [ "$BUILD" == "-O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi - if [ "$BUILD" == "-O2" ]; then export WML_TEST_TIME=15; fi + - if [ "$BUILD" == "C++14 -O2" ]; then export STRICT_COMPILATION=false; fi + - if [ "$BUILD" == "C++14 -O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi + - if [ "$BUILD" == "C++14 -O2" ]; then export WML_TEST_TIME=15; fi + - if [ "$BUILD" == "C++14 -O2" ]; then export CXXSTD=14; fi + - if [ "$BUILD" == "-O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations"; fi - if [[ "$BUILD" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations -Wno-deprecated-register"; fi - if [ "$BUILD" == "-O0" ]; then export PLAY_TEST=false; fi @@ -59,8 +67,8 @@ script: - ./utils/travis/check_utf8.sh - ./utils/travis/utf8_bom_dog.sh - $CXX --version - - echo "*Params* --- " "cxxtool=$CXX --debug=time build=release extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx0x=$CXX11 nls=$NLS jobs=2" - - scons cxxtool=$CXX --debug=time build=release extra_flags_config="$EXTRA_FLAGS_ALL" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx0x=$CXX11 nls=$NLS jobs=2 + - echo "*Params* --- " "cxxtool=$CXX --debug=time build=release extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx_std=$CXXSTD nls=$NLS jobs=2" + - scons cxxtool=$CXX --debug=time build=release extra_flags_config="$EXTRA_FLAGS_ALL" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx_std=$CXXSTD nls=$NLS jobs=2 - "export DISPLAY=:99.0" - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1024x768x24" - if [ "$CPP_TESTS" = true ]; then ./utils/travis/test_wrapper.sh; fi From b7d6712184518fb11a65acce2ae2283a2e99116f Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 1 Apr 2016 13:36:57 -0400 Subject: [PATCH 118/240] tloadscreen: Disable escape/enter and avoid use of atomic iterator --- src/gui/dialogs/loadscreen.cpp | 26 ++++++++++++++------------ src/gui/dialogs/loadscreen.hpp | 2 +- 2 files changed, 15 insertions(+), 13 deletions(-) diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 39e07aa67440..7f98e3f7075a 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -70,8 +70,8 @@ tloadscreen::tloadscreen(boost::function f) , work_(f) , worker_() , cursor_setter_() - , current_stage_() - , current_visible_stage_() + , current_stage_(nullptr) + , current_visible_stage_(stages.end()) { current_load = this; } @@ -98,6 +98,8 @@ void tloadscreen::pre_show(twindow& window) progress_stage_label_ = &find_widget(&window, "status", false); animation_label_ = &find_widget(&window, "test_animation", false); + window.set_enter_disabled(true); + window.set_escape_disabled(true); } void tloadscreen::post_show(twindow& /*window*/) @@ -113,12 +115,7 @@ void tloadscreen::progress(const char* stage) return; } if(stage) { - auto iter = stages.find(stage); - if(iter == stages.end()) { - WRN_LS << "Stage ID '" << stage << "' missing description." << std::endl; - return; - } - current_load->current_stage_.store(iter, std::memory_order_release); + current_load->current_stage_.store(stage, std::memory_order_release); } } @@ -129,11 +126,16 @@ void tloadscreen::timer_callback(twindow& window) if (!worker_ || worker_->timed_join(boost::posix_time::milliseconds(0))) { window.close(); } - auto stage = current_stage_.load(std::memory_order_acquire); - if (stage != current_visible_stage_) + const char* stage = current_stage_.load(std::memory_order_acquire); + if (stage && (current_visible_stage_ == stages.end() || stage != current_visible_stage_->first)) { - current_visible_stage_ = stage; - progress_stage_label_->set_label(t_string(stage->second, "wesnoth-lib") + "..."); + auto iter = stages.find(stage); + if(iter == stages.end()) { + WRN_LS << "Stage ID '" << stage << "' missing description." << std::endl; + return; + } + current_visible_stage_ = iter; + progress_stage_label_->set_label(t_string(iter->second, "wesnoth-lib") + "..."); } ++animation_counter_; if (animation_counter_ % 2 == 0) { diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index aaadc1530642..d8758156d3d2 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -79,7 +79,7 @@ class tloadscreen : public tdialog tlabel* animation_label_; static tloadscreen* current_load; - std::atomic::const_iterator> current_stage_; + std::atomic current_stage_; std::map::const_iterator current_visible_stage_; }; From 90cd3bacc826943569e662498ae867a23163cf9e Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 22:29:00 +0200 Subject: [PATCH 119/240] attempt to fix travis c++14 build --- .travis.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index 07a4ed641e7f..6a2ce24d13b0 100644 --- a/.travis.yml +++ b/.travis.yml @@ -45,7 +45,7 @@ before_install: - if [ "$BUILD" == "C++14 -O2" ]; then export STRICT_COMPILATION=false; fi - if [ "$BUILD" == "C++14 -O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi - if [ "$BUILD" == "C++14 -O2" ]; then export WML_TEST_TIME=15; fi - - if [ "$BUILD" == "C++14 -O2" ]; then export CXXSTD=14; fi + - if [ "$BUILD" == "C++14 -O2" ]; then export CXXSTD="1y"; fi - if [ "$BUILD" == "-O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations"; fi - if [[ "$BUILD" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations -Wno-deprecated-register"; fi From b847c1878559b21875f195fde205c05311ea1164 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 22:34:13 +0200 Subject: [PATCH 120/240] fix msvc compilation. --- src/fake_unit_ptr.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/fake_unit_ptr.hpp b/src/fake_unit_ptr.hpp index 0cb19e7cd378..afc1c490da71 100644 --- a/src/fake_unit_ptr.hpp +++ b/src/fake_unit_ptr.hpp @@ -70,7 +70,7 @@ private : public: explicit operator bool() const - { return unit_.get(); } + { return unit_.get() != nullptr; } }; #endif From aaf9cb406f796db848c544a15197e360ef91ff69 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 1 Apr 2016 22:34:46 +0200 Subject: [PATCH 121/240] fix a c++11 todo --- src/menu_events.cpp | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/menu_events.cpp b/src/menu_events.cpp index d8fec8ff2964..dde1a593efe2 100644 --- a/src/menu_events.cpp +++ b/src/menu_events.cpp @@ -906,9 +906,7 @@ namespace { // Helpers for create_unit() create_dlg.show(gui.video()); if(create_dlg.no_choice()) { - // the static cast fixes http://connect.microsoft.com/VisualStudio/feedback/details/520043/ - // c++11's nullptr would be a better solution as soon as we support it. - return type_and_gender(static_cast(nullptr), unit_race::NUM_GENDERS); + return type_and_gender(nullptr, unit_race::NUM_GENDERS); } const std::string& ut_id = create_dlg.choice(); From c5ac29d505a6d8e5b9845a01e43268067dfbad8a Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 2 Apr 2016 11:05:59 +1100 Subject: [PATCH 122/240] Revert use of std::to_string in config to_string has problems with floating point types --- src/config.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/src/config.cpp b/src/config.cpp index fbe82097c9cc..245d4d483820 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -344,9 +344,9 @@ class config::attribute_value::string_visitor std::string operator()(const boost::blank &) const { return std::string(); } std::string operator()(const yes_no & b) const { return b.str(); } std::string operator()(const true_false & b) const { return b.str(); } - std::string operator()(int i) const { return std::to_string(i); } - std::string operator()(unsigned long long u) const { return std::to_string(u); } - std::string operator()(double d) const { return std::to_string(d); } + std::string operator()(int i) const { return lexical_cast(i); } + std::string operator()(unsigned long long u) const { return lexical_cast(u); } + std::string operator()(double d) const { return lexical_cast(d); } std::string operator()(std::string const &s) const { return s; } std::string operator()(t_string const &s) const { return s.str(); } }; From f758706ea2a4306aa67e00662ab6bf5f5173e5c6 Mon Sep 17 00:00:00 2001 From: Nils Kneuper Date: Sat, 2 Apr 2016 10:15:54 +0200 Subject: [PATCH 123/240] fixed compiling with CMake in a hacky way * Switched from C++98 to C++11 (as announced on the dev-ml) * Added support for boost-thread The current implementation is hacky and not clean. It at least builds on my gentoo ~amd64 system. --- CMakeLists.txt | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 91c0bad24239..cd46110fbc81 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -66,7 +66,7 @@ else (UNIX AND NOT APPLE AND NOT CYGWIN) find_package(SDL2 2.0.4 REQUIRED) endif (UNIX AND NOT APPLE AND NOT CYGWIN) -find_package(Boost 1.36 REQUIRED COMPONENTS iostreams program_options regex system) +find_package(Boost 1.36 REQUIRED COMPONENTS iostreams program_options regex system thread) find_package(Boost 1.40 REQUIRED COMPONENTS random) # no, gettext executables are not required when NLS is deactivated @@ -245,13 +245,16 @@ if(MSVC AND NOT DEFINED CXX_FLAGS_MSVC) endif(MSVC AND NOT DEFINED CXX_FLAGS_MSVC) set(CXX_FLAGS_PROJECT) -check_compiler_has_flag(CXX_FLAGS_PROJECT "-std=c++98" HAS_COMPILER_FLAG_STD) +check_compiler_has_flag(CXX_FLAGS_PROJECT "-std=c++11" HAS_COMPILER_FLAG_STD) check_compiler_has_flag(CXX_FLAGS_PROJECT "-W" HAS_COMPILER_FLAG_W) # MSVC's -Wall is not like gcc's, it really enables *all* warnings which include zillions for system headers and doesn't make sense. if(NOT MSVC) check_compiler_has_flag(CXX_FLAGS_PROJECT "-Wall" HAS_COMPILER_FLAG_WALL) endif(NOT MSVC) +### Set some extra var for C++11 +add_definitions(-DHAVE_CXX0X) + ### Set strict compiler flags. From adb0abfb6dec9449f309149e9e2d662e2ac9873d Mon Sep 17 00:00:00 2001 From: Nils Kneuper Date: Sat, 2 Apr 2016 10:24:17 +0200 Subject: [PATCH 124/240] add boost-thread to cmake recipe, part2 --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 12163edbb22c..ce278839050e 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -109,6 +109,7 @@ set(game-external-libs ${common-external-libs} ${Boost_SYSTEM_LIBRARIES} ${Boost_RANDOM_LIBRARY} + ${Boost_THREAD_LIBRARY} ${sdl_image-lib} ${sdl_mixer-lib} ${sdl_ttf-lib} From 104ccf6e36bc13db26aaecf884c378e3bd28d3e9 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 03:05:35 -0400 Subject: [PATCH 125/240] Remove obsolete class from FormulaAI This class appears to stem from the days when FormulaAI was implemented as a separate AI algorithm, rather than as an engine of the composite AI. Apart from one function which didn't access anything in the class (and has been moved elsewhere), the class was entirely unused. --- src/ai/formula/ai.cpp | 28 +++++++++++++---- src/ai/formula/ai.hpp | 1 - src/ai/formula/candidates.cpp | 51 ------------------------------ src/ai/formula/candidates.hpp | 58 ----------------------------------- 4 files changed, 22 insertions(+), 116 deletions(-) diff --git a/src/ai/formula/ai.cpp b/src/ai/formula/ai.cpp index 61d7c2866e34..df7c71b19435 100644 --- a/src/ai/formula/ai.cpp +++ b/src/ai/formula/ai.cpp @@ -77,9 +77,26 @@ using namespace game_logic; namespace ai { -game_logic::candidate_action_ptr formula_ai::load_candidate_action_from_config(const config& cfg) +using ca_ptr = game_logic::candidate_action_ptr; + +ca_ptr formula_ai::load_candidate_action_from_config(const config& rc_action) { - return candidate_action_manager_.load_candidate_action_from_config(cfg,this,&function_table_); + ca_ptr new_ca; + const t_string &name = rc_action["name"]; + try { + const t_string &type = rc_action["type"]; + + if( type == "movement") { + new_ca = ca_ptr(new move_candidate_action(name, type, rc_action, &function_table_)); + } else if( type == "attack") { + new_ca = ca_ptr(new attack_candidate_action(name, type, rc_action, &function_table_)); + } else { + ERR_AI << "Unknown candidate action type: " << type << std::endl; + } + } catch(formula_error& e) { + handle_exception(e, "Error while registering candidate action '" + name + "'"); + } + return new_ca; } int formula_ai::get_recursion_count() const{ @@ -97,8 +114,7 @@ formula_ai::formula_ai(readonly_context &context, const config &cfg) keeps_cache_(), infinite_loop_guardian_(), vars_(), - function_table_(*this), - candidate_action_manager_() + function_table_(*this) { add_ref(); init_readonly_context_proxy(context); @@ -956,13 +972,13 @@ void formula_ai::on_create(){ } -void formula_ai::evaluate_candidate_action(game_logic::candidate_action_ptr fai_ca) +void formula_ai::evaluate_candidate_action(ca_ptr fai_ca) { fai_ca->evaluate(this,*resources::units); } -bool formula_ai::execute_candidate_action(game_logic::candidate_action_ptr fai_ca) +bool formula_ai::execute_candidate_action(ca_ptr fai_ca) { game_logic::map_formula_callable callable(this); callable.add_ref(); diff --git a/src/ai/formula/ai.hpp b/src/ai/formula/ai.hpp index 450807c4dfde..60ab4cdc8db3 100644 --- a/src/ai/formula/ai.hpp +++ b/src/ai/formula/ai.hpp @@ -163,7 +163,6 @@ class formula_ai : public readonly_context_proxy, public game_logic::formula_cal gamestate_change_observer infinite_loop_guardian_; game_logic::map_formula_callable vars_; game_logic::ai_function_symbol_table function_table_; - game_logic::candidate_action_manager candidate_action_manager_; friend class ai_default; }; diff --git a/src/ai/formula/candidates.cpp b/src/ai/formula/candidates.cpp index e79073a7416a..22d5599ff176 100644 --- a/src/ai/formula/candidates.cpp +++ b/src/ai/formula/candidates.cpp @@ -30,57 +30,6 @@ static lg::log_domain log_formula_ai("ai/engine/fai"); namespace game_logic { -void candidate_action_manager::load_config(const config& cfg, ai::formula_ai* ai, function_symbol_table* function_table) -{ - // register candidate actions - BOOST_FOREACH(const config &rc_action, cfg.child_range("register_candidate_action")) - { - candidate_action_ptr new_ca = load_candidate_action_from_config(rc_action,ai,function_table); - - if (new_ca) { - candidate_actions_.push_back(new_ca); - } - - } -} - -candidate_action_ptr candidate_action_manager::load_candidate_action_from_config(const config& rc_action, ai::formula_ai* ai, function_symbol_table* function_table) -{ - candidate_action_ptr new_ca; - const t_string &name = rc_action["name"]; - try { - const t_string &type = rc_action["type"]; - - if( type == "movement") { - new_ca = candidate_action_ptr(new move_candidate_action(name, type, rc_action, function_table )); - } else if( type == "attack") { - new_ca = candidate_action_ptr(new attack_candidate_action(name, type, rc_action, function_table )); - } else { - ERR_AI << "Unknown candidate action type: " << type << std::endl; - } - } catch(formula_error& e) { - ai->handle_exception(e, "Error while registering candidate action '" + name + "'"); - } - return new_ca; -} - -bool candidate_action_manager::evaluate_candidate_actions(ai::formula_ai* ai, unit_map& units) -{ - evaluated_candidate_actions_.clear(); - - BOOST_FOREACH(candidate_action_ptr cm, candidate_actions_) - { - cm->evaluate(ai, units); - evaluated_candidate_actions_.insert(cm); - } - - if( evaluated_candidate_actions_.empty() || - (*evaluated_candidate_actions_.begin())->get_score() <= 0 ) //@note ai::candidate_action::BAD_SCORE ) - return false; - - return true; -} - base_candidate_action::base_candidate_action(const std::string& name, const std::string& type, const config& cfg, function_symbol_table* function_table) : diff --git a/src/ai/formula/candidates.hpp b/src/ai/formula/candidates.hpp index 23047f4b30a5..d065315c560f 100644 --- a/src/ai/formula/candidates.hpp +++ b/src/ai/formula/candidates.hpp @@ -20,8 +20,6 @@ #ifndef AI_FORMULA_CANDIDATES_HPP_INCLUDED #define AI_FORMULA_CANDIDATES_HPP_INCLUDED -#include "formula/function.hpp" - #include class unit_map; @@ -72,62 +70,6 @@ class base_candidate_action { int score_; }; -struct candidate_action_compare { - bool operator() (const candidate_action_ptr laction, - const candidate_action_ptr raction) const - { - return laction->get_score() > raction->get_score(); - } -}; - -typedef std::set candidate_action_set; - -//this class is responsible for managing candidate actions -class candidate_action_manager { -public: - candidate_action_manager() - : evaluated_candidate_actions_() - , candidate_actions_() - {} - - //register candidate actions from config - void load_config(const config& cfg, ai::formula_ai* ai, function_symbol_table* function_table); - - //register a single candidate action from config - candidate_action_ptr load_candidate_action_from_config(const config& cfg, ai::formula_ai* ai, function_symbol_table* function_table); - - //evaluate candidate action, return true if we have candidate action that have score > 0 - bool evaluate_candidate_actions(ai::formula_ai* ai, unit_map& units); - - const_formula_ptr get_best_action_formula() const { - if( evaluated_candidate_actions_.empty() ) - return game_logic::formula_ptr(); - return (*evaluated_candidate_actions_.begin())->get_action(); - } - - //calls same method from best candidate action - void update_callable_map(game_logic::map_formula_callable& callable){ - if( evaluated_candidate_actions_.empty() ) - return; - (*evaluated_candidate_actions_.begin())->update_callable_map(callable); - } - - void register_candidate_action(candidate_action_ptr& candidate_action){ - candidate_actions_.push_back(candidate_action); - } - - bool has_candidate_actions() const { return !candidate_actions_.empty(); } - - void clear() { - candidate_actions_.clear(); - evaluated_candidate_actions_.clear(); - } - -private: - game_logic::candidate_action_set evaluated_candidate_actions_; - std::vector candidate_actions_; -}; - class candidate_action_with_filters : public base_candidate_action { public: From ca382018b7a9b5b744f0669bf1442a30ead63c15 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 03:02:13 -0400 Subject: [PATCH 126/240] BOOST_FOREACH -> range for --- src/about.cpp | 21 ++- src/actions/attack.cpp | 2 - src/actions/create.cpp | 5 +- src/actions/heal.cpp | 10 +- src/actions/move.cpp | 5 +- src/actions/undo.cpp | 5 +- src/actions/undo_action.cpp | 7 +- src/actions/unit_creator.cpp | 3 +- src/actions/vision.cpp | 22 ++- src/addon/info.cpp | 13 +- src/addon/manager.cpp | 6 +- src/addon/manager_ui.cpp | 29 ++-- src/addon/validation.cpp | 6 +- src/ai/composite/ai.cpp | 11 +- src/ai/composite/aspect.hpp | 10 +- src/ai/composite/component.cpp | 7 +- src/ai/composite/goal.cpp | 13 +- src/ai/composite/property_handler.hpp | 13 +- src/ai/configuration.cpp | 24 ++- src/ai/contexts.cpp | 21 ++- src/ai/default/ca.cpp | 24 ++- src/ai/default/recruitment.cpp | 143 +++++++++--------- src/ai/default/recruitment.hpp | 7 +- src/ai/default/stage_rca.cpp | 9 +- src/ai/formula/ai.cpp | 12 +- src/ai/formula/candidates.cpp | 4 +- src/ai/formula/function_table.cpp | 12 +- src/ai/manager.cpp | 9 +- src/arrow.cpp | 4 +- src/campaign_server/addon_utils.cpp | 2 - src/campaign_server/blacklist.cpp | 2 - src/campaign_server/campaign_server.cpp | 1 - src/carryover.cpp | 26 ++-- src/commandline_options.cpp | 9 +- src/config.cpp | 69 +++++---- src/config_cache.cpp | 13 +- src/controller_base.cpp | 6 +- src/dialogs.cpp | 21 ++- src/display.cpp | 54 ++++--- src/display_chat_manager.cpp | 3 +- src/display_context.cpp | 12 +- src/editor/action/action.cpp | 16 +- src/editor/action/action_select.cpp | 14 +- src/editor/controller/editor_controller.cpp | 11 +- src/editor/editor_preferences.cpp | 6 +- src/editor/map/context_manager.cpp | 22 ++- src/editor/map/editor_map.cpp | 5 +- src/editor/map/map_context.cpp | 19 ++- src/editor/map/map_fragment.cpp | 26 ++-- src/editor/palette/editor_palettes.cpp | 6 +- src/editor/palette/editor_palettes.hpp | 4 +- src/editor/palette/item_palette.cpp | 5 +- src/editor/palette/palette_manager.cpp | 3 +- src/editor/palette/terrain_palettes.cpp | 10 +- src/editor/palette/unit_palette.cpp | 6 +- src/editor/toolkit/brush.cpp | 8 +- src/editor/toolkit/editor_toolkit.cpp | 10 +- src/filesystem_boost.cpp | 9 +- src/font.cpp | 19 ++- src/formula/formula.cpp | 12 +- src/formula/function.cpp | 9 +- src/game_board.cpp | 19 ++- src/game_config.cpp | 10 +- src/game_config_manager.cpp | 43 +++--- src/game_display.cpp | 7 +- src/game_events/action_wml.cpp | 20 +-- src/game_events/conditional_wml.cpp | 5 +- src/game_events/handlers.cpp | 1 - src/game_events/manager.cpp | 9 +- src/game_events/manager_impl.cpp | 5 +- src/game_events/pump.cpp | 15 +- src/game_events/wmi_container.cpp | 10 +- src/game_initialization/configure_engine.cpp | 5 +- src/game_initialization/connect_engine.cpp | 89 +++++------ src/game_initialization/create_engine.cpp | 71 ++++----- src/game_initialization/flg_manager.cpp | 30 ++-- src/game_initialization/mp_game_utils.cpp | 2 - src/game_initialization/mp_options.cpp | 44 +++--- src/game_initialization/multiplayer.cpp | 3 +- .../multiplayer_configure.cpp | 1 - .../multiplayer_connect.cpp | 17 +-- .../multiplayer_create.cpp | 7 +- src/game_initialization/multiplayer_lobby.cpp | 20 ++- src/game_initialization/multiplayer_ui.cpp | 8 +- src/game_initialization/multiplayer_wait.cpp | 13 +- src/game_initialization/playcampaign.cpp | 6 +- src/game_launcher.cpp | 5 +- src/game_preferences.cpp | 23 ++- src/game_state.cpp | 9 +- src/generators/cave_map_generator.cpp | 7 +- src/generators/default_map_generator_job.cpp | 5 +- src/generators/lua_map_generator.cpp | 4 +- src/gettext_boost.cpp | 3 +- src/gui/dialogs/advanced_graphics_options.cpp | 5 +- .../dialogs/editor/set_starting_position.cpp | 1 - src/gui/dialogs/lobby/lobby.cpp | 1 - .../dialogs/multiplayer/mp_alerts_options.cpp | 5 +- src/gui/widgets/grid_private.hpp | 6 +- src/gui/widgets/list.cpp | 3 +- src/help/help_impl.cpp | 45 +++--- src/help/help_topic_generators.cpp | 21 ++- src/hotkey/command_executor.cpp | 10 +- src/hotkey/hotkey_command.cpp | 6 +- src/hotkey/hotkey_item.cpp | 13 +- src/image.cpp | 5 +- src/image_modifications.cpp | 7 +- src/language.cpp | 11 +- src/leader_scroll_dialog.cpp | 3 - src/log.cpp | 7 +- src/log_windows.cpp | 1 - src/map/label.cpp | 18 +-- src/map/map.cpp | 3 +- src/menu_events.cpp | 19 ++- src/minimap.cpp | 6 +- src/mouse_events.cpp | 5 +- src/movetype.cpp | 30 ++-- src/mp_game_settings.cpp | 6 +- src/pathfind/pathfind.cpp | 6 +- src/pathfind/teleport.cpp | 12 +- src/pathutils.cpp | 8 +- src/persist_manager.cpp | 8 +- src/play_controller.cpp | 25 ++- src/playmp_controller.cpp | 2 - src/playsingle_controller.cpp | 6 +- src/playturn.cpp | 5 +- src/preferences_display.cpp | 1 - src/quit_confirmation.cpp | 4 +- src/recall_list_manager.cpp | 1 - src/replay.cpp | 9 +- src/replay_controller.cpp | 1 - src/replay_recorder_base.cpp | 6 +- src/reports.cpp | 33 ++-- src/save_index.cpp | 9 +- src/saved_game.cpp | 31 ++-- src/savegame.cpp | 28 ++-- src/scripting/application_lua_kernel.cpp | 7 +- src/scripting/game_lua_kernel.cpp | 65 ++++---- src/scripting/lua_api.cpp | 1 - src/scripting/lua_common.cpp | 7 +- src/scripting/lua_common.hpp | 2 +- src/scripting/lua_race.cpp | 7 +- src/scripting/lua_team.cpp | 3 +- src/scripting/lua_unit_type.cpp | 3 +- src/scripting/push_check.hpp | 3 +- src/serialization/parser.cpp | 7 +- src/serialization/preprocessor.cpp | 16 +- src/serialization/schema_validator.cpp | 8 +- src/serialization/unicode.cpp | 1 - src/server/ban.cpp | 7 +- src/server/game.cpp | 3 +- src/server/room_manager.cpp | 22 ++- src/server/server.cpp | 15 +- src/side_filter.cpp | 20 ++- src/sound.cpp | 6 +- src/statistics.cpp | 10 +- src/storyscreen/controller.cpp | 4 +- src/storyscreen/render.cpp | 12 +- src/synced_commands.cpp | 4 +- src/synced_user_choice.cpp | 13 +- src/syncmp_handler.cpp | 6 +- src/team.cpp | 10 +- src/teambuilder.cpp | 11 +- src/terrain/builder.cpp | 76 +++++----- src/terrain/filter.cpp | 18 +-- src/terrain/terrain.cpp | 10 +- src/tests/create_images.cpp | 1 - src/tests/gui/test_gui2.cpp | 11 +- src/tests/test_addons.cpp | 4 +- src/tests/test_config.cpp | 7 +- src/tests/test_filesystem.cpp | 6 +- src/tests/test_mp_connect.cpp | 1 - src/tests/test_whiteboard_side_actions.cpp | 5 +- src/text.cpp | 6 +- src/time_of_day.cpp | 4 +- src/tod_manager.cpp | 7 +- src/tools/exploder_cutter.cpp | 2 - src/tools/schema/tag.cpp | 8 +- src/tools/sdl2/sdl2.cpp | 2 - src/tooltips.cpp | 2 - src/tracer.cpp | 2 - src/units/abilities.cpp | 48 +++--- src/units/animation.cpp | 85 +++++------ src/units/attack_type.cpp | 7 +- src/units/drawer.cpp | 2 - src/units/filter.cpp | 21 ++- src/units/formula_manager.cpp | 4 +- src/units/map.cpp | 4 +- src/units/types.cpp | 81 +++++----- src/units/udisplay.cpp | 14 +- src/units/unit.cpp | 65 ++++---- src/units/unit.hpp | 2 +- src/utils/iterable_pair.hpp | 33 ++++ src/utils/smart_list.hpp | 2 +- src/variable.cpp | 21 ++- src/video.cpp | 2 - src/wesmage/filter.cpp | 1 - src/wesmage/options.cpp | 2 - src/wesmage/wesmage.cpp | 2 - src/wesnoth.cpp | 10 +- src/whiteboard/highlighter.cpp | 11 +- src/whiteboard/manager.cpp | 26 ++-- src/whiteboard/mapbuilder.cpp | 12 +- src/whiteboard/move.cpp | 10 +- src/whiteboard/recall.cpp | 4 +- src/whiteboard/side_actions.cpp | 12 +- src/whiteboard/utility.cpp | 14 +- 206 files changed, 1263 insertions(+), 1520 deletions(-) diff --git a/src/about.cpp b/src/about.cpp index 86def503b649..e5ea733c9530 100644 --- a/src/about.cpp +++ b/src/about.cpp @@ -38,7 +38,6 @@ #include "widgets/button.hpp" // for button #include // for max -#include // for auto_any_base, etc #include // for scoped_ptr #include // for map, map<>::mapped_type #include // for operator<<, basic_ostream, etc @@ -71,7 +70,7 @@ static void add_lines(std::vector &res, config const &c, bool split // get slight scrolling glitches in the credits screen. const std::vector& lines = utils::split(c["title"], '\n'); bool first = true; - BOOST_FOREACH(const std::string& line, lines) { + for(const std::string& line : lines) { if(first) { res.push_back("+" + line); first = false; @@ -87,7 +86,7 @@ static void add_lines(std::vector &res, config const &c, bool split } std::vector lines = utils::split(c["text"], '\n'); - BOOST_FOREACH(std::string &line, lines) + for(std::string &line : lines) { if (line.size() > 1 && line[0] == '+') line = "+ " + line.substr(1); @@ -102,7 +101,7 @@ static void add_lines(std::vector &res, config const &c, bool split } } - BOOST_FOREACH(const config &entry, c.child_range("entry")) { + for (const config &entry : c.child_range("entry")) { res.push_back("- "+ entry["name"].str()); } } @@ -115,7 +114,7 @@ std::vector get_text(const std::string &campaign, bool split_multil config::child_itors about_entries = about_list.child_range("about"); if (!campaign.empty()) { - BOOST_FOREACH(const config &about, about_entries) { + for (const config &about : about_entries) { // just finished a particular campaign if (campaign == about["id"]) { add_lines(res, about, split_multiline_headers); @@ -123,7 +122,7 @@ std::vector get_text(const std::string &campaign, bool split_multil } } - BOOST_FOREACH(const config &about, about_entries) { + for (const config &about : about_entries) { add_lines(res, about, split_multiline_headers); } @@ -136,7 +135,7 @@ void set_about(const config &cfg) images.clear(); images_default = ""; - BOOST_FOREACH(const config &about, cfg.child_range("about")) + for (const config &about : cfg.child_range("about")) { about_list.add_child("about", about); const std::string &im = about["images"]; @@ -149,7 +148,7 @@ void set_about(const config &cfg) } } - BOOST_FOREACH(const config &campaign, cfg.child_range("campaign")) + for (const config &campaign : cfg.child_range("campaign")) { config::const_child_itors abouts = campaign.child_range("about"); if (abouts.first == abouts.second) continue; @@ -161,7 +160,7 @@ void set_about(const config &cfg) temp["id"] = id; std::string campaign_images; - BOOST_FOREACH(const config &about, abouts) + for (const config &about : abouts) { const std::string &subtitle = about["title"]; if (!subtitle.empty()) @@ -174,12 +173,12 @@ void set_about(const config &cfg) text << '\n'; } - BOOST_FOREACH(const std::string &line, utils::split(about["text"], '\n')) + for (const std::string &line : utils::split(about["text"], '\n')) { text << " " << line << '\n'; } - BOOST_FOREACH(const config &entry, about.child_range("entry")) + for (const config &entry : about.child_range("entry")) { text << " " << entry["name"] << '\n'; } diff --git a/src/actions/attack.cpp b/src/actions/attack.cpp index 89277075a13e..489c78ff4505 100644 --- a/src/actions/attack.cpp +++ b/src/actions/attack.cpp @@ -53,8 +53,6 @@ #include "whiteboard/manager.hpp" #include "wml_exception.hpp" -#include - static lg::log_domain log_engine("engine"); #define DBG_NG LOG_STREAM(debug, log_engine) #define LOG_NG LOG_STREAM(info, log_engine) diff --git a/src/actions/create.cpp b/src/actions/create.cpp index aad3e4304462..2a491746031d 100644 --- a/src/actions/create.cpp +++ b/src/actions/create.cpp @@ -51,7 +51,6 @@ #include "variable.hpp" #include "whiteboard/manager.hpp" -#include #include static lg::log_domain log_engine("engine"); @@ -140,7 +139,7 @@ namespace { // Helpers for get_recalls() const unit_filter ufilt(vconfig(leader->recall_filter()), resources::filter_con); - BOOST_FOREACH(const unit_const_ptr & recall_unit_ptr, leader_team.recall_list()) + for (const unit_const_ptr & recall_unit_ptr : leader_team.recall_list()) { const unit & recall_unit = *recall_unit_ptr; // Do not add a unit twice. @@ -220,7 +219,7 @@ std::vector get_recalls(int side, const map_location &recall_lo if ( !leader_in_place ) { // Return the full recall list. - BOOST_FOREACH(const unit_const_ptr & recall, (*resources::teams)[side-1].recall_list()) + for (const unit_const_ptr & recall : (*resources::teams)[side-1].recall_list()) { result.push_back(recall); } diff --git a/src/actions/heal.cpp b/src/actions/heal.cpp index 10c8a227c71e..a36d6edf07f7 100644 --- a/src/actions/heal.cpp +++ b/src/actions/heal.cpp @@ -32,7 +32,6 @@ #include "units/udisplay.hpp" #include "units/map.hpp" -#include #include #include @@ -98,8 +97,7 @@ namespace { return POISON_CURE; // Regeneration? - BOOST_FOREACH (const unit_ability & regen, - patient.get_abilities("regenerate")) + for (const unit_ability & regen : patient.get_abilities("regenerate")) { curing = std::max(curing, poison_status((*regen.first)["poison"])); if ( curing == POISON_CURE ) @@ -111,7 +109,7 @@ namespace { // Look through the healers to find a curer. unit_map::iterator curer = units.end(); // Assumed: curing is not POISON_CURE at the start of any iteration. - BOOST_FOREACH (const unit_ability & heal, patient.get_abilities("heals")) + for (const unit_ability & heal : patient.get_abilities("heals")) { POISON_STATUS this_cure = poison_status((*heal.first)["poison"]); if ( this_cure <= curing ) @@ -219,7 +217,7 @@ namespace { if ( update_healing(healing, harming, heal_effect.get_composite_value()) ) { // Collect the healers involved. - BOOST_FOREACH (const unit_abilities::individual_effect & heal, heal_effect) + for (const unit_abilities::individual_effect & heal : heal_effect) healers.push_back(&*units.find(heal.loc)); if ( !healers.empty() ) { @@ -300,7 +298,7 @@ void calculate_healing(int side, bool update_display) std::list unit_list; // We look for all allied units, then we see if our healer is near them. - BOOST_FOREACH(unit &patient, *resources::units) { + for (unit &patient : *resources::units) { if ( patient.get_state("unhealable") || patient.incapacitated() ) { if ( patient.side() == side ) diff --git a/src/actions/move.cpp b/src/actions/move.cpp index 78365cba4c49..3e73c3e2c158 100644 --- a/src/actions/move.cpp +++ b/src/actions/move.cpp @@ -46,7 +46,6 @@ #include "units/animation_component.hpp" #include "whiteboard/manager.hpp" -#include #include #include #include @@ -585,7 +584,7 @@ namespace { // Private helpers for move_unit() reveal_ambusher(blocked_loc_, false); // Reveal ambushers. - BOOST_FOREACH(const map_location & reveal, ambushers_) { + for(const map_location & reveal : ambushers_) { reveal_ambusher(reveal, true); } @@ -840,7 +839,7 @@ namespace { // Private helpers for move_unit() */ std::string unit_mover::read_ambush_string(const unit & ambusher) { - BOOST_FOREACH( const unit_ability &hide, ambusher.get_abilities("hides") ) + for(const unit_ability &hide : ambusher.get_abilities("hides")) { const std::string & ambush_string = (*hide.first)["alert"].str(); if ( !ambush_string.empty() ) diff --git a/src/actions/undo.cpp b/src/actions/undo.cpp index 0beb25327790..fb71811734ca 100644 --- a/src/actions/undo.cpp +++ b/src/actions/undo.cpp @@ -54,7 +54,6 @@ #include "undo_update_shroud_action.hpp" #include // for reverse -#include // for auto_any_base, etc #include // for intrusive_ptr #include #include @@ -299,7 +298,7 @@ void undo_list::read(const config & cfg) committed_actions_ = committed_actions_ || cfg["committed"].to_bool(); // Build the undo stack. - BOOST_FOREACH( const config & child, cfg.child_range("undo") ) { + for (const config & child : cfg.child_range("undo")) { try { undo_action_base * action = create_action(child); if ( action ) { @@ -317,7 +316,7 @@ void undo_list::read(const config & cfg) } // Build the redo stack. - BOOST_FOREACH( const config & child, cfg.child_range("redo") ) { + for (const config & child : cfg.child_range("redo")) { try { undo_action_base * action = create_action(child); if ( undo_action* undoable_action = dynamic_cast(action)) { diff --git a/src/actions/undo_action.cpp b/src/actions/undo_action.cpp index 97d5e81d8409..eac5b74b7233 100644 --- a/src/actions/undo_action.cpp +++ b/src/actions/undo_action.cpp @@ -5,14 +5,13 @@ #include "game_events/pump.hpp" //game_events::queued_event #include -#include namespace actions { void undo_action::execute_undo_umc_wml() { assert(resources::lua_kernel); - BOOST_FOREACH(const config& c, umc_commands_undo) + for(const config& c : umc_commands_undo) { resources::lua_kernel->run_wml_action("command", vconfig(c), game_events::queued_event("undo", map_location(), map_location(), config())); } @@ -21,7 +20,7 @@ void undo_action::execute_undo_umc_wml() void undo_action::execute_redo_umc_wml() { assert(resources::lua_kernel); - BOOST_FOREACH(const config& c, umc_commands_redo) + for(const config& c : umc_commands_redo) { resources::lua_kernel->run_wml_action("command", vconfig(c), game_events::queued_event("redo", map_location(), map_location(), config())); } @@ -34,7 +33,7 @@ void undo_action::read_tconfig_vector(tconfig_vector& vec, const config& cfg, co } void undo_action::write_tconfig_vector(const tconfig_vector& vec, config& cfg, const std::string& tag) { - BOOST_FOREACH(const config& c, vec) + for(const config& c : vec) { cfg.add_child(tag, c); } diff --git a/src/actions/unit_creator.cpp b/src/actions/unit_creator.cpp index 0a705a11c193..fe9b57efb892 100644 --- a/src/actions/unit_creator.cpp +++ b/src/actions/unit_creator.cpp @@ -40,7 +40,6 @@ #include "game_display.hpp" // for resources::screen -#include #include static lg::log_domain log_engine("engine"); @@ -113,7 +112,7 @@ map_location unit_creator::find_location(const config &cfg, const unit* pass_che placements.push_back("map"); placements.push_back("recall"); - BOOST_FOREACH(const std::string& place, placements) + for (const std::string& place : placements) { map_location loc; diff --git a/src/actions/vision.cpp b/src/actions/vision.cpp index 7842da7c2d81..6a0015d91e46 100644 --- a/src/actions/vision.cpp +++ b/src/actions/vision.cpp @@ -35,8 +35,6 @@ #include "team.hpp" #include "units/unit.hpp" -#include - class unit_animation; static lg::log_domain log_engine("engine"); @@ -57,13 +55,13 @@ static void create_jamming_map(std::map & jamming, jamming.clear(); // Build the map. - BOOST_FOREACH (const unit &u, *resources::units) + for (const unit &u : *resources::units) { if ( u.jamming() < 1 || !view_team.is_enemy(u.side()) ) continue; pathfind::jamming_path jam_path(u, u.get_location()); - BOOST_FOREACH(const pathfind::paths::step& st, jam_path.destinations) { + for (const pathfind::paths::step& st : jam_path.destinations) { if ( jamming[st.curr] < st.move_left ) jamming[st.curr] = st.move_left; } @@ -365,14 +363,14 @@ bool shroud_clearer::clear_unit(const map_location &view_loc, team &view_team, resources::screen->draw(true); // Clear the fog. - BOOST_FOREACH (const pathfind::paths::step &dest, sight.destinations) { + for (const pathfind::paths::step &dest : sight.destinations) { bool known = known_units && known_units->count(dest.curr) != 0; if ( clear_loc(view_team, dest.curr, view_loc, real_loc, viewer_id, !known, *enemy_count, *friend_count, spectator) ) cleared_something = true; } //TODO guard with game_config option - BOOST_FOREACH (const map_location &dest, sight.edges) { + for (const map_location &dest : sight.edges) { bool known = known_units && known_units->count(dest) != 0; if ( clear_loc(view_team, dest, view_loc, real_loc, viewer_id, !known, *enemy_count, *friend_count, spectator) ) @@ -558,7 +556,7 @@ bool shroud_clearer::fire_events() std::vector sight_list; sight_list.swap(sightings_); - BOOST_FOREACH (const sight_data & event, sight_list) { + for (const sight_data & event : sight_list) { // Try to locate the sighting unit. unit_map::const_iterator find_it = units.find(event.sighter_id); const map_location & sight_loc = @@ -641,7 +639,7 @@ bool actor_sighted(const unit & target, const std::vector * cache) std::vector needs_event(teams_size, cache == nullptr); if ( cache != nullptr ) { // Flag just the sides in the cache as needing events. - BOOST_FOREACH (int side, *cache) + for (int side : *cache) needs_event[side-1] = true; } // Exclude the target's own team. @@ -659,7 +657,7 @@ bool actor_sighted(const unit & target, const std::vector * cache) // Look for units that can be used as the second unit in sighted events. std::vector second_units(teams_size, nullptr); std::vector distances(teams_size, UINT_MAX); - BOOST_FOREACH (const unit & viewer, *resources::units) { + for (const unit & viewer : *resources::units) { const size_t index = viewer.side() - 1; // Does viewer belong to a team for which we still need a unit? if ( needs_event[index] && distances[index] != 0 ) { @@ -713,7 +711,7 @@ void recalculate_fog(int side) // Exclude currently seen units from sighted events. std::set visible_locs; - BOOST_FOREACH (const unit &u, *resources::units) { + for (const unit &u : *resources::units) { const map_location & u_location = u.get_location(); if ( !tm.fogged(u_location) ) @@ -726,7 +724,7 @@ void recalculate_fog(int side) resources::screen->invalidate_all(); shroud_clearer clearer; - BOOST_FOREACH(const unit &u, *resources::units) + for (const unit &u : *resources::units) { if ( u.side() == side ) clearer.clear_unit(u.get_location(), u, tm, &visible_locs); @@ -762,7 +760,7 @@ bool clear_shroud(int side, bool reset_fog, bool fire_events) bool result = false; shroud_clearer clearer; - BOOST_FOREACH(const unit &u, *resources::units) + for (const unit &u : *resources::units) { if ( u.side() == side ) result |= clearer.clear_unit(u.get_location(), u, tm); diff --git a/src/addon/info.cpp b/src/addon/info.cpp index 5104b7323ffe..b741266f05f8 100644 --- a/src/addon/info.cpp +++ b/src/addon/info.cpp @@ -22,8 +22,6 @@ #include "log.hpp" #include "serialization/string_utils.hpp" -#include - static lg::log_domain log_addons_client("addons-client"); #define ERR_AC LOG_STREAM(err , log_addons_client) #define LOG_AC LOG_STREAM(info, log_addons_client) @@ -45,7 +43,7 @@ namespace { return; } - BOOST_FOREACH(const std::string& dep, base_deps) { + for(const std::string& dep : base_deps) { if(base_id == dep) { LOG_AC << dep << " depends upon itself; breaking circular dependency\n"; continue; @@ -76,7 +74,7 @@ void addon_info::read(const config& cfg) const config::const_child_itors& locales = cfg.child_range("translation"); - BOOST_FOREACH(const config& locale, locales) { + for(const config& locale : locales) { this->locales.push_back(locale["language"].str()); } @@ -101,7 +99,7 @@ void addon_info::write(config& cfg) const cfg["uploads"] = this->uploads; cfg["type"] = get_addon_type_string(this->type); - BOOST_FOREACH(const std::string& locale_id, this->locales) { + for (const std::string& locale_id : this->locales) { cfg.add_child("translation")["language"] = locale_id; } @@ -204,9 +202,10 @@ void read_addons_list(const config& cfg, addons_list& dest) unsigned order = 0; - /** @todo FIXME: get rid of this legacy "campaign"/"campaigns" silliness */ + /** @todo FIXME: get rid of this legacy "campaign"/"campaigns" silliness + */ const config::const_child_itors &addon_cfgs = cfg.child_range("campaign"); - BOOST_FOREACH(const config& addon_cfg, addon_cfgs) { + for(const config& addon_cfg : addon_cfgs) { const std::string& id = addon_cfg["name"].str(); if(dest.find(id) != dest.end()) { ERR_AC << "add-ons list has multiple entries for '" << id << "', not good; ignoring them" << std::endl; diff --git a/src/addon/manager.cpp b/src/addon/manager.cpp index 27e7354bc2fe..3decfa161679 100644 --- a/src/addon/manager.cpp +++ b/src/addon/manager.cpp @@ -40,8 +40,6 @@ #include "formula/string_utils.hpp" #include "addon/client.hpp" -#include - static lg::log_domain log_config("config"); #define ERR_CFG LOG_STREAM(err , log_config) #define LOG_CFG LOG_STREAM(info, log_config) @@ -317,11 +315,11 @@ static void unarchive_dir(const std::string& path, const config& cfg) filesystem::make_directory(dir); - BOOST_FOREACH(const config &d, cfg.child_range("dir")) { + for(const config &d : cfg.child_range("dir")) { unarchive_dir(dir, d); } - BOOST_FOREACH(const config &f, cfg.child_range("file")) { + for(const config &f : cfg.child_range("file")) { unarchive_file(dir, f); } } diff --git a/src/addon/manager_ui.cpp b/src/addon/manager_ui.cpp index 24a81ec53a38..672022a0cadc 100644 --- a/src/addon/manager_ui.cpp +++ b/src/addon/manager_ui.cpp @@ -42,7 +42,6 @@ #include "wml_exception.hpp" #include -#include #include "addon/client.hpp" @@ -166,7 +165,7 @@ addon_op_result do_resolve_addon_dependencies(CVideo& v, addons_client& client, std::vector missing_deps; std::vector broken_deps; - BOOST_FOREACH(const std::string& dep, deps) { + for(const std::string& dep : deps) { if(!is_addon_installed(dep)) { if(addons.find(dep) != addons.end()) { missing_deps.push_back(dep); @@ -187,7 +186,7 @@ addon_op_result do_resolve_addon_dependencies(CVideo& v, addons_client& client, broken_deps.size()); broken_deps_report += "\n"; - BOOST_FOREACH(const std::string& broken_dep_id, broken_deps) { + for(const std::string& broken_dep_id : broken_deps) { broken_deps_report += "\n " + utils::unicode_bullet + " " + make_addon_title(broken_dep_id); } @@ -216,7 +215,7 @@ addon_op_result do_resolve_addon_dependencies(CVideo& v, addons_client& client, cursor_setter.reset(new cursor::setter(cursor::WAIT)); - BOOST_FOREACH(const std::string& dep, missing_deps) { + for(const std::string& dep : missing_deps) { const addon_info& addon = addon_at(dep, addons); const std::string& display_size = size_display_string(addon.size); @@ -264,7 +263,7 @@ addon_op_result do_resolve_addon_dependencies(CVideo& v, addons_client& client, std::vector failed_titles; - BOOST_FOREACH(const std::string& dep, missing_deps) { + for(const std::string& dep : missing_deps) { const addon_info& addon = addon_at(dep, addons); if(!try_fetch_addon(v, client, addon)) { @@ -599,7 +598,7 @@ sorted_addon_pointer_list sort_addons_list(addons_list& addons, ADDON_SORT sort, sorted_addon_pointer_list res; addon_pointer_list_sorter sorter(sort, direction); - BOOST_FOREACH(const addons_list::value_type& entry, addons) { + for(const addons_list::value_type& entry : addons) { res.push_back(&entry); } @@ -681,7 +680,7 @@ void show_addons_manager_dialog(CVideo& v, addons_client& client, addons_list& a bool have_upgradable_addons = false; - BOOST_FOREACH(const sorted_addon_pointer_list::value_type& sorted_entry, sorted_addons) { + for(const sorted_addon_pointer_list::value_type& sorted_entry : sorted_addons) { const addons_list::value_type& entry = *sorted_entry; const addon_info& addon = entry.second; tracking[addon.id] = get_addon_tracking_info(addon); @@ -781,7 +780,7 @@ void show_addons_manager_dialog(CVideo& v, addons_client& client, addons_list& a utils::string_map i18n_syms; // Enter publish and remote deletion options - BOOST_FOREACH(const std::string& pub_id, can_publish_ids) { + for(const std::string& pub_id : can_publish_ids) { i18n_syms["addon_title"] = make_addon_title(pub_id); static const std::string publish_icon = "icons/icon-game.png~BLIT(icons/icon-addon-publish.png)"; @@ -790,7 +789,7 @@ void show_addons_manager_dialog(CVideo& v, addons_client& client, addons_list& a options.push_back(IMAGE_PREFIX + publish_icon + COLUMN_SEPARATOR + font::GOOD_TEXT + text); filter_options.push_back(text); } - BOOST_FOREACH(const std::string& del_id, can_delete_ids) { + for(const std::string& del_id : can_delete_ids) { i18n_syms["addon_title"] = make_addon_title(del_id); static const std::string delete_icon = "icons/icon-game.png~BLIT(icons/icon-addon-delete.png)"; @@ -929,7 +928,7 @@ void show_addons_manager_dialog(CVideo& v, addons_client& client, addons_list& a std::vector failed_titles; if(update_everything) { - BOOST_FOREACH(const std::string& id, option_ids) { + for(const std::string& id : option_ids) { if(tracking[id].state == ADDON_INSTALLED_UPGRADABLE) { ids_to_install.push_back(id); } @@ -940,7 +939,7 @@ void show_addons_manager_dialog(CVideo& v, addons_client& client, addons_list& a ids_to_install.push_back(option_ids[result]); } - BOOST_FOREACH(const std::string& id, ids_to_install) { + for(const std::string& id : ids_to_install) { const addon_info& addon = addon_at(id, addons); addon_op_result res = try_fetch_addon_with_checks(v, client, addons, addon); @@ -1093,7 +1092,7 @@ bool uninstall_local_addons(CVideo& v) std::map addon_titles_map; - BOOST_FOREACH(const std::string& id, addons) { + for(const std::string& id : addons) { std::string title; if(have_addon_install_info(id)) { @@ -1133,7 +1132,7 @@ bool uninstall_local_addons(CVideo& v) remove_names.clear(); - BOOST_FOREACH(const std::string& id, remove_ids) { + for(const std::string& id : remove_ids) { remove_names.insert(addon_titles_map[id]); } @@ -1150,7 +1149,7 @@ bool uninstall_local_addons(CVideo& v) std::set failed_names, skipped_names, succeeded_names; - BOOST_FOREACH(const std::string& id, remove_ids) { + for(const std::string& id : remove_ids) { const std::string& name = addon_titles_map[id]; if(have_addon_pbl_info(id) || have_addon_in_vcs_tree(id)) { @@ -1244,7 +1243,7 @@ bool ad_hoc_addon_fetch_session(CVideo& v, const std::vector& addon } bool return_value = true; - BOOST_FOREACH(const std::string & addon_id, addon_ids) { + for(const std::string & addon_id : addon_ids) { addons_list::const_iterator it = addons.find(addon_id); if(it != addons.end()) { const addon_info& addon = it->second; diff --git a/src/addon/validation.cpp b/src/addon/validation.cpp index ce464f2cef22..1abdab6fd783 100644 --- a/src/addon/validation.cpp +++ b/src/addon/validation.cpp @@ -17,8 +17,6 @@ #include "addon/validation.hpp" #include "config.hpp" -#include - const unsigned short default_campaignd_port = 15008; namespace { @@ -71,10 +69,10 @@ bool addon_filename_legal(const std::string& name) bool check_names_legal(const config& dir) { - BOOST_FOREACH(const config &path, dir.child_range("file")) { + for (const config &path : dir.child_range("file")) { if (!addon_filename_legal(path["name"])) return false; } - BOOST_FOREACH(const config &path, dir.child_range("dir")) { + for (const config &path : dir.child_range("dir")) { if (!addon_filename_legal(path["name"])) return false; if (!check_names_legal(path)) return false; } diff --git a/src/ai/composite/ai.cpp b/src/ai/composite/ai.cpp index 2c94376fde12..906752cb1649 100644 --- a/src/ai/composite/ai.cpp +++ b/src/ai/composite/ai.cpp @@ -31,7 +31,6 @@ #include #include "utils/boost_function_guarded.hpp" -#include namespace ai { @@ -60,7 +59,7 @@ void ai_composite::on_create() cfg_["id"]<<"]"< stages; create_stage(stages,cfg); int j=0; - BOOST_FOREACH(stage_ptr b, stages ){ + for (stage_ptr b : stages) { stages_.push_back(b); j++; } @@ -139,7 +138,7 @@ bool ai_composite::add_goal(const config &cfg) std::vector< goal_ptr > goals; create_goal(goals,cfg); int j=0; - BOOST_FOREACH(goal_ptr b, goals ){ + for (goal_ptr b : goals) { get_goals().push_back(b); j++; } @@ -148,7 +147,7 @@ bool ai_composite::add_goal(const config &cfg) void ai_composite::play_turn(){ - BOOST_FOREACH(stage_ptr &s, stages_){ + for (stage_ptr &s : stages_) { s->play_stage(); } } @@ -218,7 +217,7 @@ config ai_composite::to_config() const config cfg; //serialize the composite ai stages - BOOST_FOREACH(const stage_ptr &s, stages_){ + for (const stage_ptr &s : stages_) { cfg.add_child("stage",s->to_config()); } diff --git a/src/ai/composite/aspect.hpp b/src/ai/composite/aspect.hpp index c811f5184070..50b72f11e932 100644 --- a/src/ai/composite/aspect.hpp +++ b/src/ai/composite/aspect.hpp @@ -265,7 +265,7 @@ class composite_aspect : public typesafe_aspect { , default_() , parent_id_(id) { - BOOST_FOREACH(const config &cfg_element, this->cfg_.child_range("facet") ){ + for (const config &cfg_element : this->cfg_.child_range("facet")) { add_facet(-1,cfg_element); } @@ -295,7 +295,7 @@ class composite_aspect : public typesafe_aspect { { std::vector facets_base; engine::parse_aspect_from_config(*this,cfg,parent_id_,std::back_inserter(facets_base)); - BOOST_FOREACH(aspect_ptr a, facets_base ){ + for (aspect_ptr a : facets_base) { typename aspect_type::typesafe_ptr b = boost::dynamic_pointer_cast< typesafe_aspect > (a); if (composite_aspect* c = dynamic_cast*>(b.get())) { c->parent_id_ = parent_id_; @@ -308,7 +308,7 @@ class composite_aspect : public typesafe_aspect { virtual void recalculate() const { ///@todo 1.9 optimize in case of an aspect which returns variant - BOOST_FOREACH(const typename aspect_type::typesafe_ptr &f, make_pair(facets_.rbegin(),facets_.rend())) { + for (const typename aspect_type::typesafe_ptr &f : make_pair(facets_.rbegin(),facets_.rend())) { if (f->active()) { this->value_ = boost::shared_ptr(f->get_ptr()); this->valid_ = true; @@ -325,7 +325,7 @@ class composite_aspect : public typesafe_aspect { virtual config to_config() const { config cfg = aspect::to_config(); - BOOST_FOREACH(const typename aspect_type::typesafe_ptr f, facets_) { + for (const typename aspect_type::typesafe_ptr f : facets_) { cfg.add_child("facet",f->to_config()); } if (default_) { @@ -344,7 +344,7 @@ class composite_aspect : public typesafe_aspect { std::vector< aspect_ptr > facets; engine::parse_aspect_from_config(*this,cfg,parent_id_,std::back_inserter(facets)); int j=0; - BOOST_FOREACH(aspect_ptr a, facets ){ + for (aspect_ptr a : facets) { typename aspect_type::typesafe_ptr b = boost::dynamic_pointer_cast< typesafe_aspect > (a); if (composite_aspect* c = dynamic_cast*>(b.get())) { c->parent_id_ = parent_id_; diff --git a/src/ai/composite/component.cpp b/src/ai/composite/component.cpp index 52eda4a40164..8a25ab839394 100644 --- a/src/ai/composite/component.cpp +++ b/src/ai/composite/component.cpp @@ -28,7 +28,6 @@ #include #include -#include namespace pathfind { @@ -124,7 +123,7 @@ std::vector component::get_children(const std::string &type) std::vector component::get_children_types() { std::vector types; - BOOST_FOREACH(property_handler_map::value_type &ph, property_handlers_) { + for (property_handler_map::value_type &ph : property_handlers_) { types.push_back(ph.first); } return types; @@ -240,9 +239,9 @@ static void print_component(component *root, const std::string &type, std::strin s << offset_str << type<<"["<get_id() <<"] "<get_engine()<<" "<get_name()<< std::endl; - BOOST_FOREACH(std::string t, t_list) { + for (std::string t : t_list) { std::vector c_list = root->get_children(t); - BOOST_FOREACH(component *c, c_list) { + for (component *c : c_list) { print_component(c,t,s,offset+1); } } diff --git a/src/ai/composite/goal.cpp b/src/ai/composite/goal.cpp index a1994f915757..9ca842212190 100644 --- a/src/ai/composite/goal.cpp +++ b/src/ai/composite/goal.cpp @@ -37,7 +37,6 @@ #include "wml_exception.hpp" #include -#include #include #include @@ -154,7 +153,7 @@ void target_unit_goal::add_targets(std::back_insert_iterator< std::vector< targe //find the enemy leaders and explicit targets const unit_filter ufilt(vconfig(criteria), resources::filter_con); - BOOST_FOREACH(const unit &u, *resources::units) { + for (const unit &u : *resources::units) { if (ufilt( u )) { LOG_AI_GOAL << "found explicit target unit at ... " << u.get_location() << " with value: " << value() << "\n"; *target_list = target(u.get_location(), value(), target::TYPE::EXPLICIT); @@ -204,7 +203,7 @@ void target_location_goal::add_targets(std::back_insert_iterator< std::vector< t std::set items; filter_ptr_->get_locations(items); - BOOST_FOREACH(const map_location &loc, items) + for (const map_location &loc : items) { LOG_AI_GOAL << "found explicit target location ... " << loc << " with value: " << value() << std::endl; *target_list = target(loc, value(), target::TYPE::EXPLICIT); @@ -285,7 +284,7 @@ void protect_goal::add_targets(std::back_insert_iterator< std::vector< target > std::set items; if (protect_unit_) { const unit_filter ufilt(vconfig(criteria), resources::filter_con); - BOOST_FOREACH(const unit &u, units) + for (const unit &u : units) { //TODO: we will protect hidden units, by not testing for invisibility to current side if (ufilt(u)) { @@ -298,9 +297,9 @@ void protect_goal::add_targets(std::back_insert_iterator< std::vector< target > } DBG_AI_GOAL << "side " << get_side() << ": seaching for threats in "+goal_type+" goal" << std::endl; // Look for directions to protect a specific location or specific unit. - BOOST_FOREACH(const map_location &loc, items) + for (const map_location &loc : items) { - BOOST_FOREACH(const unit &u, units) + for (const unit &u : units) { int distance = distance_between(u.get_location(), loc); if (current_team().is_enemy(u.side()) && distance < radius_ && @@ -355,7 +354,7 @@ void lua_goal::add_targets(std::back_insert_iterator< std::vector< target > > ta try { std::vector < target > targets = *(l_obj->get()); - BOOST_FOREACH(target tg, targets) + for (target tg : targets) { *target_list = tg; } diff --git a/src/ai/composite/property_handler.hpp b/src/ai/composite/property_handler.hpp index 831ec37a2405..31ddbbeb4f0b 100644 --- a/src/ai/composite/property_handler.hpp +++ b/src/ai/composite/property_handler.hpp @@ -22,7 +22,6 @@ #define AI_COMPOSITE_PROPERTY_HANDLER_HPP_INCLUDED #include "utils/boost_function_guarded.hpp" -#include #include "config.hpp" #include "ai/composite/component.hpp" @@ -136,7 +135,7 @@ class vector_property_handler : public base_property_handler { std::vector handle_get_children() { std::vector children; - BOOST_FOREACH(t_ptr v, values_) { + for (t_ptr v : values_) { children.push_back(&*v); } return children; @@ -156,7 +155,7 @@ class vector_property_handler : public base_property_handler { t_ptr_vector values; call_factory(values,cfg); int j=0; - BOOST_FOREACH(t_ptr b, values ){ + for (t_ptr b : values ) { values_.insert(values_.begin()+pos+j,b); j++; } @@ -261,9 +260,9 @@ class aspect_property_handler : public base_property_handler { //* is a special case - 'delete all facets' if (child.id == "*") { bool b = false; - BOOST_FOREACH(typename aspect_map::value_type a, aspects_) { - b |= a.second->delete_all_facets(); - } + for (typename aspect_map::value_type a : aspects_) { + b |= a.second->delete_all_facets(); + } return b; } return false; @@ -273,7 +272,7 @@ class aspect_property_handler : public base_property_handler { std::vector handle_get_children() { std::vector children; - BOOST_FOREACH(typename aspect_map::value_type a, aspects_) { + for (typename aspect_map::value_type a : aspects_) { children.push_back(&*a.second); } return children; diff --git a/src/ai/configuration.cpp b/src/ai/configuration.cpp index 7d00da410e29..fe750c776430 100644 --- a/src/ai/configuration.cpp +++ b/src/ai/configuration.cpp @@ -27,8 +27,6 @@ #include "wml_exception.hpp" #include "config_assign.hpp" -#include - #include #include #include @@ -55,7 +53,7 @@ void configuration::init(const config &game_config) } - BOOST_FOREACH(const config &ai_configuration, ais.child_range("ai")) { + for (const config &ai_configuration : ais.child_range("ai")) { const std::string &id = ai_configuration["id"]; if (id.empty()){ @@ -80,7 +78,7 @@ void configuration::init(const config &game_config) namespace { void extract_ai_configurations(std::map &storage, const config &input) { - BOOST_FOREACH(const config &ai_configuration, input.child_range("ai")) { + for (const config &ai_configuration : input.child_range("ai")) { const std::string &id = ai_configuration["id"]; if (id.empty()){ @@ -112,7 +110,7 @@ void configuration::add_era_ai_from_config(const config &era) void configuration::add_mod_ai_from_config(config::const_child_itors mods) { mod_ai_configurations_.clear(); - BOOST_FOREACH(const config &mod, mods) { + for (const config &mod : mods) { extract_ai_configurations(mod_ai_configurations_, mod); } } @@ -184,7 +182,7 @@ bool configuration::parse_side_config(side_number side, const config& original_c //leave only the [ai] children cfg = config(); - BOOST_FOREACH(const config &aiparam, original_cfg.child_range("ai")) { + for (const config &aiparam : original_cfg.child_range("ai")) { cfg.add_child("ai",aiparam); } @@ -212,7 +210,7 @@ bool configuration::parse_side_config(side_number side, const config& original_c config parsed_cfg = config(); LOG_AI_CONFIGURATION << "side "<< side <<": merging AI configurations"<< std::endl; - BOOST_FOREACH(const config &aiparam, cfg.child_range("ai")) { + for (const config &aiparam : cfg.child_range("ai")) { parsed_cfg.append(aiparam); } @@ -221,7 +219,7 @@ bool configuration::parse_side_config(side_number side, const config& original_c parsed_cfg.merge_children_by_attribute("aspect","id"); LOG_AI_CONFIGURATION << "side "<< side <<": removing duplicate [default] tags from aspects"<< std::endl; - BOOST_FOREACH(config &aspect_cfg, parsed_cfg.child_range("aspect")) { + for (config &aspect_cfg : parsed_cfg.child_range("aspect")) { if (aspect_cfg["name"] != "composite_aspect") { // No point in warning about Lua or standard aspects lacking [default] continue; @@ -254,7 +252,7 @@ static const std::set old_goal_tags = {"target", "target_location", void configuration::expand_simplified_aspects(side_number side, config &cfg) { std::string algorithm; config base_config, parsed_config; - BOOST_FOREACH(const config &aiparam, cfg.child_range("ai")) { + for (const config &aiparam : cfg.child_range("ai")) { std::string turns, time_of_day, engine = "cpp"; if (aiparam.has_attribute("turns")) { turns = aiparam["turns"].str(); @@ -274,7 +272,7 @@ void configuration::expand_simplified_aspects(side_number side, config &cfg) { } } std::deque > facet_configs; - BOOST_FOREACH(const config::attribute &attr, aiparam.attribute_range()) { + for (const config::attribute &attr : aiparam.attribute_range()) { if (non_aspect_attributes.count(attr.first)) { continue; } @@ -286,7 +284,7 @@ void configuration::expand_simplified_aspects(side_number side, config &cfg) { facet_config["value"] = attr.second; facet_configs.push_back(std::make_pair(attr.first, facet_config)); } - BOOST_FOREACH(const config::any_child &child, aiparam.all_children_range()) { + for (const config::any_child &child : aiparam.all_children_range()) { if (just_copy_tags.count(child.key)) { // These aren't simplified, so just copy over unchanged. parsed_config.add_child(child.key, child.cfg); @@ -340,14 +338,14 @@ void configuration::expand_simplified_aspects(side_number side, config &cfg) { facet_configs.pop_front(); } typedef std::map::value_type aspect_pair; - BOOST_FOREACH(const aspect_pair& p, aspect_configs) { + for (const aspect_pair& p : aspect_configs) { parsed_config.add_child("aspect", p.second); } } if (algorithm.empty() && !parsed_config.has_child("stage")) { base_config = get_ai_config_for("ai_default_rca"); } - BOOST_FOREACH(const config::any_child &child, parsed_config.all_children_range()) { + for (const config::any_child &child : parsed_config.all_children_range()) { base_config.add_child(child.key, child.cfg); } cfg.clear_children("ai"); diff --git a/src/ai/contexts.cpp b/src/ai/contexts.cpp index 94ec86969cd0..42b79ce33c72 100644 --- a/src/ai/contexts.cpp +++ b/src/ai/contexts.cpp @@ -58,7 +58,6 @@ #include "formula/variant.hpp" // for variant #include // for find, count, max, fill_n -#include // for auto_any_base, etc #include // for intrusive_ptr #include // for dynamic_pointer_cast, etc #include // for sqrt @@ -265,19 +264,19 @@ readonly_context_impl::readonly_context_impl(side_context &context, const config void readonly_context_impl::on_readonly_context_create() { //init the composite ai engines - BOOST_FOREACH(const config &cfg_element, cfg_.child_range("engine")){ + for(const config &cfg_element : cfg_.child_range("engine")) { engine::parse_engine_from_config(*this,cfg_element,std::back_inserter(engines_)); } // init the composite ai aspects - BOOST_FOREACH(const config &cfg_element, cfg_.child_range("aspect")){ + for(const config &cfg_element : cfg_.child_range("aspect")) { std::vector aspects; engine::parse_aspect_from_config(*this,cfg_element,cfg_element["id"],std::back_inserter(aspects)); add_aspects(aspects); } // init the composite ai goals - BOOST_FOREACH(const config &cfg_element, cfg_.child_range("goal")){ + for(const config &cfg_element : cfg_.child_range("goal")) { engine::parse_goal_from_config(*this,cfg_element,std::back_inserter(get_goals())); } } @@ -297,13 +296,13 @@ config readwrite_context_impl::to_readwrite_context_config() const config readonly_context_impl::to_readonly_context_config() const { config cfg; - BOOST_FOREACH(const engine_ptr e, engines_) { + for(const engine_ptr e : engines_) { cfg.add_child("engine",e->to_config()); } - BOOST_FOREACH(const aspect_map::value_type a, aspects_) { + for(const aspect_map::value_type a : aspects_) { cfg.add_child("aspect",a.second->to_config()); } - BOOST_FOREACH(const goal_ptr g, goals_) { + for(const goal_ptr g : goals_) { cfg.add_child("goal",g->to_config()); } return cfg; @@ -419,7 +418,7 @@ void readonly_context_impl::calculate_moves(const unit_map& units, std::map::iterator m = res.begin(); m != res.end(); ++m) { - BOOST_FOREACH(const pathfind::paths::step &dest, m->second.destinations) + for(const pathfind::paths::step &dest : m->second.destinations) { const map_location& src = m->first; const map_location& dst = dest.curr; @@ -459,7 +458,7 @@ void readonly_context_impl::calculate_moves(const unit_map& units, std::map &aspects ) { - BOOST_FOREACH(aspect_ptr a, aspects) { + for(aspect_ptr a : aspects) { const std::string id = a->get_id(); known_aspect_map::iterator i = known_aspects_.find(id); if (i != known_aspects_.end()) { @@ -1130,7 +1129,7 @@ double readonly_context_impl::power_projection(const map_location& loc, const mo // The 0.5 power avoids underestimating too much the damage of a wounded unit. int hp = int(sqrt(double(un.hitpoints()) / un.max_hitpoints()) * 1000); int most_damage = 0; - BOOST_FOREACH(const attack_type &att, un.attacks()) + for(const attack_type &att : un.attacks()) { int damage = att.damage() * att.num_attacks() * (100 + tod_modifier); if (damage > most_damage) { @@ -1245,7 +1244,7 @@ const map_location& readonly_context_impl::suitable_keep(const map_location& lea map_location const* best_occupied_keep = &map_location::null_location(); double move_left_at_best_occupied_keep = 0.0; - BOOST_FOREACH(const pathfind::paths::step &dest, leader_paths.destinations) + for(const pathfind::paths::step &dest : leader_paths.destinations) { const map_location &loc = dest.curr; if (keeps().find(loc)!=keeps().end()){ diff --git a/src/ai/default/ca.cpp b/src/ai/default/ca.cpp index d4a51dce2560..504700c621dd 100644 --- a/src/ai/default/ca.cpp +++ b/src/ai/default/ca.cpp @@ -34,8 +34,6 @@ #include "pathfind/pathfind.hpp" #include "pathfind/teleport.hpp" -#include - #include #include @@ -307,7 +305,7 @@ double move_leader_to_goals_phase::evaluate() possible_moves.insert(std::pair(leader->get_location(), leader_paths)); map_location loc; - BOOST_FOREACH(const map_location &l, route.steps) + for (const map_location &l : route.steps) { if (leader_paths.destinations.contains(l) && power_projection(l, get_enemy_dstsrc()) < leader->hitpoints() * max_risk) @@ -390,7 +388,7 @@ double move_leader_to_keep_phase::evaluate() map_location best_keep; int shortest_distance = 99999; - BOOST_FOREACH(const unit_map::const_iterator& leader, leaders) { + for (const unit_map::const_iterator& leader : leaders) { if (leader->incapacitated() || leader->movement_left() == 0) { continue; } @@ -454,7 +452,7 @@ double move_leader_to_keep_phase::evaluate() // find next hop map_location next_hop = map_location::null_location(); int next_hop_cost = 0; - BOOST_FOREACH(const map_location& step, route.steps) { + for (const map_location& step : route.steps) { if (leader_paths.destinations.contains(step)) { next_hop = step; next_hop_cost += leader->movement_cost(resources::gameboard->map().get_terrain(step)); @@ -468,7 +466,7 @@ double move_leader_to_keep_phase::evaluate() //define the next hop to have the lowest cost (0) moves_toward_keep.insert(std::make_pair(0, next_hop)); - BOOST_FOREACH(const pathfind::paths::step &dest, leader_paths.destinations) { + for (const pathfind::paths::step &dest : leader_paths.destinations) { if (!units_.find(dest.curr).valid()) { route = pathfind::a_star_search(dest.curr, next_hop, 10000.0, &calc, resources::gameboard->map().w(), resources::gameboard->map().h(), &allowed_teleports); @@ -480,7 +478,7 @@ double move_leader_to_keep_phase::evaluate() // Find the first location which we can move to, // without the threat of enemies. - BOOST_FOREACH(const ordered_locations::value_type& pair, moves_toward_keep) { + for (const ordered_locations::value_type& pair : moves_toward_keep) { const map_location& loc = pair.second; if (get_enemy_dstsrc().count(loc) == 0) { move_ = check_move_action(leader->get_location(), loc, true); @@ -1415,12 +1413,12 @@ double retreat_phase::evaluate() }*/ //int leader_adj_count = 0; std::vector leaders_adj_v; - BOOST_FOREACH(unit_map::const_iterator leader, leaders){ + for (unit_map::const_iterator leader : leaders) { map_location tmp_leader_adj[6]; get_adjacent_tiles(leader->get_location(), tmp_leader_adj); - BOOST_FOREACH(map_location &loc, tmp_leader_adj){ + for (map_location &loc : tmp_leader_adj) { bool found = false; - BOOST_FOREACH(map_location &new_loc, leaders_adj_v){ + for (map_location &new_loc : leaders_adj_v) { if(new_loc == loc){ found = true; break; @@ -1591,7 +1589,7 @@ double leader_shares_keep_phase::evaluate() return BAD_SCORE; } bool allied_leaders_available = false; - BOOST_FOREACH(team &tmp_team, *resources::teams){ + for(team &tmp_team : *resources::teams) { if(!current_team().is_enemy(tmp_team.side())){ std::vector allied_leaders = resources::units->find_leaders(get_side()); if (!allied_leaders.empty()){ @@ -1618,7 +1616,7 @@ void leader_shares_keep_phase::execute() calculate_moves(*resources::units, possible_moves, friends_srcdst, friends_dstsrc, false, true); //check for each ai leader if he should move away from his keep - BOOST_FOREACH(unit_map::unit_iterator &ai_leader, ai_leaders){ + for (unit_map::unit_iterator &ai_leader : ai_leaders) { //only if leader is on a keep const map_location &keep = ai_leader->get_location(); if ( !resources::gameboard->map().is_keep(keep) ) { @@ -1679,7 +1677,7 @@ void leader_shares_keep_phase::execute() } ai_leader->remove_movement_ai(); } - BOOST_FOREACH(unit_map::unit_iterator &leader, ai_leaders){ + for(unit_map::unit_iterator &leader : ai_leaders) { leader->remove_movement_ai(); } //ERR_AI_TESTING_AI_DEFAULT << get_name() << ": evaluate - not yet implemented" << std::endl; diff --git a/src/ai/default/recruitment.cpp b/src/ai/default/recruitment.cpp index 4c5e5c92ce68..f58805eb619c 100644 --- a/src/ai/default/recruitment.cpp +++ b/src/ai/default/recruitment.cpp @@ -44,7 +44,6 @@ #include "wml_exception.hpp" #include "config_assign.hpp" -#include #include #include @@ -170,7 +169,7 @@ double recruitment::evaluate() { const unit_map& units = *resources::units; const std::vector leaders = units.find_leaders(get_side()); - BOOST_FOREACH(const unit_map::const_iterator& leader, leaders) { + for (const unit_map::const_iterator& leader : leaders) { if (leader == resources::units->end()) { return BAD_SCORE; } @@ -208,7 +207,7 @@ void recruitment::execute() { std::set global_recruits; - BOOST_FOREACH(const unit_map::const_iterator& leader, leaders) { + for (const unit_map::const_iterator& leader : leaders) { const map_location& keep = leader->get_location(); if (!resources::gameboard->map().is_keep(keep)) { LOG_AI_RECRUITMENT << "Leader " << leader->name() << " is not on keep. \n"; @@ -229,7 +228,7 @@ void recruitment::execute() { data data(leader); // Add team recruits. - BOOST_FOREACH(const std::string& recruit, current_team().recruits()) { + for (const std::string& recruit : current_team().recruits()) { if (!unit_types.find(recruit)) { lg::wml_error() << "Unit-type \"" << recruit << "\" doesn't exist.\n"; } @@ -239,7 +238,7 @@ void recruitment::execute() { } // Add extra recruits. - BOOST_FOREACH(const std::string& recruit, leader->recruits()) { + for (const std::string& recruit : leader->recruits()) { if (!unit_types.find(recruit)) { lg::wml_error() << "Unit-type \"" << recruit << "\" doesn't exist.\n"; } @@ -251,7 +250,7 @@ void recruitment::execute() { // Add recalls. // Recalls are treated as recruits. While recruiting // we'll check if we can do a recall instead of a recruitment. - BOOST_FOREACH(const unit_const_ptr & recall, current_team().recall_list()) { + for (const unit_const_ptr & recall : current_team().recall_list()) { // Check if this leader is allowed to recall this unit. const unit_filter ufilt( vconfig(leader->recall_filter()), resources::filter_con); if (!ufilt(*recall, map_location::null_location())) { @@ -296,7 +295,7 @@ void recruitment::execute() { show_important_hexes(); } - BOOST_FOREACH(const map_location& hex, important_hexes_) { + for (const map_location& hex : important_hexes_) { ++important_terrain_[map[hex]]; } @@ -311,7 +310,7 @@ void recruitment::execute() { do_combat_analysis(&leader_data); LOG_AI_RECRUITMENT << "Scores before extra treatments:\n"; - BOOST_FOREACH(const data& data, leader_data) { + for (const data& data : leader_data) { LOG_AI_RECRUITMENT << "\n" << data.to_string(); } @@ -320,7 +319,7 @@ void recruitment::execute() { handle_recruitment_more(&leader_data); LOG_AI_RECRUITMENT << "Scores after extra treatments:\n"; - BOOST_FOREACH(const data& data, leader_data) { + for (const data& data : leader_data) { LOG_AI_RECRUITMENT << "\n" << data.to_string(); } @@ -473,7 +472,7 @@ const std::string* recruitment::get_appropriate_recall(const std::string& type, const data& leader_data) const { const std::string* best_recall_id = nullptr; double best_recall_value = -1; - BOOST_FOREACH(const unit_const_ptr & recall_unit, current_team().recall_list()) { + for (const unit_const_ptr & recall_unit : current_team().recall_list()) { if (type != recall_unit->type_id()) { continue; } @@ -485,7 +484,7 @@ const std::string* recruitment::get_appropriate_recall(const std::string& type, } double average_cost_of_advanced_unit = 0; int counter = 0; - BOOST_FOREACH(const std::string& advancement, recall_unit->advances_to()) { + for (const std::string& advancement : recall_unit->advances_to()) { const unit_type* advancement_type = unit_types.find(advancement); if (!advancement_type) { continue; @@ -523,7 +522,7 @@ data* recruitment::get_best_leader_from_ratio_scores(std::vector& leader_d // Find things for normalization. int total_recruit_count = 0; double ratio_score_sum = 0.0; - BOOST_FOREACH(const data& data, leader_data) { + for (const data& data : leader_data) { ratio_score_sum += data.ratio_score; total_recruit_count += data.recruit_count; } @@ -535,7 +534,7 @@ data* recruitment::get_best_leader_from_ratio_scores(std::vector& leader_d // Find which leader should recruit according to ratio_scores. data* best_leader_data = nullptr; double biggest_difference = -99999.; - BOOST_FOREACH(data& data, leader_data) { + for (data& data : leader_data) { if (!leader_matches_job(data, job)) { continue; } @@ -564,7 +563,7 @@ const std::string recruitment::get_best_recruit_from_scores(const data& leader_d } std::string best_recruit = ""; double biggest_difference = -99999.; - BOOST_FOREACH(const score_map::value_type& i, leader_data.get_normalized_scores()) { + for (const score_map::value_type& i : leader_data.get_normalized_scores()) { const std::string& unit = i.first; const double score = i.second; @@ -639,7 +638,7 @@ void recruitment::compare_cost_maps_and_update_important_hexes( } // for double threshold = (biggest_border_movecost - smallest_border_movecost) * MAP_BORDER_WIDTH + smallest_border_movecost; - BOOST_FOREACH(const border_cost_map::value_type& candidate, important_hexes_candidates) { + for (const border_cost_map::value_type& candidate : important_hexes_candidates) { if (candidate.second < threshold) { important_hexes_.insert(candidate.first); } @@ -658,7 +657,7 @@ double recruitment::get_average_defense(const std::string& u_type) const { } long summed_defense = 0; int total_terrains = 0; - BOOST_FOREACH(const terrain_count_map::value_type& entry, important_terrain_) { + for (const terrain_count_map::value_type& entry : important_terrain_) { const t_translation::t_terrain& terrain = entry.first; int count = entry.second; int defense = 100 - u_info->movement_type().defense_modifier(terrain); @@ -685,7 +684,7 @@ const pathfind::full_cost_map recruitment::get_cost_map_of_side(int side) const // First add all existing units to cost_map. unsigned int unit_count = 0; - BOOST_FOREACH(const unit& unit, units) { + for (const unit& unit : units) { if (unit.side() != side || unit.can_recruit() || unit.incapacitated() || unit.total_movement() <= 0) { continue; @@ -697,14 +696,14 @@ const pathfind::full_cost_map recruitment::get_cost_map_of_side(int side) const // If this side has not so many units yet, add unit_types with the leaders position as origin. if (unit_count < UNIT_THRESHOLD) { std::vector leaders = units.find_leaders(side); - BOOST_FOREACH(const unit_map::const_iterator& leader, leaders) { + for (const unit_map::const_iterator& leader : leaders) { // First add team-recruits (it's fine when (team-)recruits are added multiple times). - BOOST_FOREACH(const std::string& recruit, team.recruits()) { + for (const std::string& recruit : team.recruits()) { cost_map.add_unit(leader->get_location(), unit_types.find(recruit), side); } // Next add extra-recruits. - BOOST_FOREACH(const std::string& recruit, leader->recruits()) { + for (const std::string& recruit : leader->recruits()) { cost_map.add_unit(leader->get_location(), unit_types.find(recruit), side); } } @@ -721,7 +720,7 @@ void recruitment::show_important_hexes() const { return; } resources::screen->labels().clear_all(); - BOOST_FOREACH(const map_location& loc, important_hexes_) { + for (const map_location& loc : important_hexes_) { // Little hack: use map_location north from loc and make 2 linebreaks to center the "X". resources::screen->labels().set_label(loc.get_direction(map_location::NORTH), "\n\nX"); } @@ -734,7 +733,7 @@ void recruitment::show_important_hexes() const { void recruitment::update_average_lawful_bonus() { int sum = 0; int counter = 0; - BOOST_FOREACH(const time_of_day& time, resources::tod_manager->times()) { + for (const time_of_day& time : resources::tod_manager->times()) { sum += time.lawful_bonus; ++counter; } @@ -757,7 +756,7 @@ void recruitment::update_average_local_cost() { map_location loc(x, y); int summed_cost = 0; int count = 0; - BOOST_FOREACH(const std::string& recruit, team.recruits()){ + for (const std::string& recruit : team.recruits()) { const unit_type* const unit_type = unit_types.find(recruit); if (!unit_type) { continue; @@ -789,7 +788,7 @@ void recruitment::update_important_hexes() { // Mark battle areas as important // This are locations where one of my units is adjacent // to a enemies unit. - BOOST_FOREACH(const unit& unit, units) { + for (const unit& unit : units) { if (unit.side() != get_side()) { continue; } @@ -812,7 +811,7 @@ void recruitment::update_important_hexes() { // The important hexes are those where my value on the cost map is // similar to a enemies one. const pathfind::full_cost_map my_cost_map = get_cost_map_of_side(get_side()); - BOOST_FOREACH(const team& team, *resources::teams) { + for (const team& team : *resources::teams) { if (current_team().is_enemy(team.side())) { const pathfind::full_cost_map enemy_cost_map = get_cost_map_of_side(team.side()); @@ -825,21 +824,21 @@ void recruitment::update_important_hexes() { // important villages first and add them and their surroundings // to important_hexes_ in a second step. std::vector important_villages; - BOOST_FOREACH(const map_location& village, map.villages()) { + for (const map_location& village : map.villages()) { std::vector surrounding; get_tiles_in_radius(village, MAP_VILLAGE_NEARNESS_THRESHOLD, surrounding); - BOOST_FOREACH(const map_location& hex, surrounding) { + for (const map_location& hex : surrounding) { if (important_hexes_.find(hex) != important_hexes_.end()) { important_villages.push_back(village); break; } } } - BOOST_FOREACH(const map_location& village, important_villages) { + for (const map_location& village : important_villages) { important_hexes_.insert(village); std::vector surrounding; get_tiles_in_radius(village, MAP_VILLAGE_SURROUNDING, surrounding); - BOOST_FOREACH(const map_location& hex, surrounding) { + for (const map_location& hex : surrounding) { // only add hex if one of our units can reach the hex if (map.on_board(hex) && my_cost_map.get_cost_at(hex.x, hex.y) != -1) { important_hexes_.insert(hex); @@ -926,7 +925,7 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { // Collect all enemy units (and their hp) we want to take into account in enemy_units. typedef std::vector > unit_hp_vector; unit_hp_vector enemy_units; - BOOST_FOREACH(const unit& unit, units) { + for (const unit& unit : units) { if (!current_team().is_enemy(unit.side()) || unit.incapacitated()) { continue; } @@ -934,7 +933,7 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { } if (enemy_units.size() < UNIT_THRESHOLD) { // Use also enemies recruitment lists and insert units into enemy_units. - BOOST_FOREACH(const team& team, *resources::teams) { + for (const team& team : *resources::teams) { if (!current_team().is_enemy(team.side())) { continue; } @@ -943,11 +942,11 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { possible_recruits.insert(team.recruits().begin(), team.recruits().end()); // Add extra recruits. const std::vector leaders = units.find_leaders(team.side()); - BOOST_FOREACH(unit_map::const_iterator leader, leaders) { + for (unit_map::const_iterator leader : leaders) { possible_recruits.insert(leader->recruits().begin(), leader->recruits().end()); } // Insert set in enemy_units. - BOOST_FOREACH(const std::string& possible_recruit, possible_recruits) { + for (const std::string& possible_recruit : possible_recruits) { const unit_type* recruit_type = unit_types.find(possible_recruit); if (recruit_type) { int hp = recruit_type->hitpoints(); @@ -957,17 +956,17 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { } } - BOOST_FOREACH(data& leader, *leader_data) { + for (data& leader : *leader_data) { if (leader.recruits.empty()) { continue; } typedef std::map simple_score_map; simple_score_map temp_scores; - BOOST_FOREACH(const unit_hp_vector::value_type& entry, enemy_units) { + for (const unit_hp_vector::value_type& entry : enemy_units) { const std::string& enemy_unit = entry.first; int enemy_unit_hp = entry.second; - BOOST_FOREACH(const std::string& recruit, leader.recruits) { + for (const std::string& recruit : leader.recruits) { double score = compare_unit_types(recruit, enemy_unit); score *= enemy_unit_hp; score = pow(score, COMBAT_SCORE_POWER); @@ -981,7 +980,7 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { // Find things for normalization. double max = -99999.; double sum = 0; - BOOST_FOREACH(const simple_score_map::value_type& entry, temp_scores) { + for (const simple_score_map::value_type& entry : temp_scores) { double score = entry.second; if (score > max) { max = score; @@ -1005,7 +1004,7 @@ void recruitment::do_combat_analysis(std::vector* leader_data) { new_0 -= 0.000001; } - BOOST_FOREACH(const simple_score_map::value_type& entry, temp_scores) { + for (const simple_score_map::value_type& entry : temp_scores) { const std::string& recruit = entry.first; double score = entry.second; @@ -1031,7 +1030,7 @@ const double* recruitment::get_cached_combat_value(const std::string& a, const s double best_distance = 999; const double* best_value = nullptr; const std::set& cache = combat_cache_[a][b]; - BOOST_FOREACH(const cached_combat_value& entry, cache) { + for (const cached_combat_value& entry : cache) { double distance_a = std::abs(entry.a_defense - a_defense); double distance_b = std::abs(entry.b_defense - b_defense); if (distance_a <= COMBAT_CACHE_TOLERANCY && distance_b <= COMBAT_CACHE_TOLERANCY) { @@ -1126,10 +1125,10 @@ void recruitment::simulate_attack( boost::shared_ptr best_att_attack; // Let attacker choose weapon - BOOST_FOREACH(const attack_type& att_weapon, attacker_weapons) { + for (const attack_type& att_weapon : attacker_weapons) { boost::shared_ptr best_def_response; // Let defender choose weapon - BOOST_FOREACH(const attack_type& def_weapon, defender_weapons) { + for (const attack_type& def_weapon : defender_weapons) { if (att_weapon.range() != def_weapon.range()) { continue; } @@ -1170,7 +1169,7 @@ config* recruitment::get_most_important_job() { config* most_important_job = nullptr; int most_important_importance = -1; int biggest_number = -1; - BOOST_FOREACH(config& job, recruitment_instructions_.child_range("recruit")) { + for (config& job : recruitment_instructions_.child_range("recruit")) { if (job.empty()) { continue; } @@ -1181,7 +1180,7 @@ config* recruitment::get_most_important_job() { // If the total flag is set we have to subtract // all existing units which matches the type. update_own_units_count(); - BOOST_FOREACH(const count_map::value_type& entry, own_units_count_) { + for (const count_map::value_type& entry : own_units_count_) { const std::string& unit_type = entry.first; const int count = entry.second; if (recruit_matches_job(unit_type, &job)) { @@ -1228,7 +1227,7 @@ const std::string recruitment::get_random_pattern_type_if_exists(const data& lea // Iteration through all elements. while (job_types_it != job_types.end()) { bool type_ok = false; - BOOST_FOREACH(const std::string& recruit, leader_data.recruits) { + for (const std::string& recruit : leader_data.recruits) { if (recruit_matches_type(recruit, *job_types_it) && limit_ok(recruit)) { type_ok = true; break; @@ -1288,7 +1287,7 @@ bool recruitment::leader_matches_job(const data& leader_data, const config* job) // First we make sure that this leader can recruit // at least one unit-type specified in the job. bool is_ok = false; - BOOST_FOREACH(const std::string& recruit, leader_data.recruits) { + for (const std::string& recruit : leader_data.recruits) { if (recruit_matches_job(recruit, job) && limit_ok(recruit)) { is_ok = true; break; @@ -1315,13 +1314,13 @@ bool recruitment::limit_ok(const std::string& recruit) const { // retrieve the aspect again. So the [limit]s can be altered during a turn. const config aspect = get_recruitment_instructions(); - BOOST_FOREACH(const config& limit, aspect.child_range("limit")) { + for (const config& limit : aspect.child_range("limit")) { std::vector types = utils::split(limit["type"]); // First check if the recruit matches one of the types. if (recruit_matches_types(recruit, types)) { // Count all own existing units which matches the type. int count = 0; - BOOST_FOREACH(const count_map::value_type& entry, own_units_count_) { + for (const count_map::value_type& entry : own_units_count_) { const std::string& unit = entry.first; int number = entry.second; if (recruit_matches_types(unit, types)) { @@ -1383,7 +1382,7 @@ bool recruitment::recruit_matches_types(const std::string& recruit, if (types.empty()) { return true; } - BOOST_FOREACH(const std::string& type, types) { + for (const std::string& type : types) { if (recruit_matches_type(recruit, type)) { return true; } @@ -1444,7 +1443,7 @@ double recruitment::get_estimated_unit_gain() const { double recruitment::get_estimated_village_gain() const { const gamemap& map = resources::gameboard->map(); int neutral_villages = 0; - BOOST_FOREACH(const map_location& village, map.villages()) { + for (const map_location& village : map.villages()) { if (resources::gameboard->village_owner(village) == -1) { ++neutral_villages; } @@ -1461,7 +1460,7 @@ double recruitment::get_unit_ratio() const { double own_total_value = 0.; double team_total_value = 0.; double enemy_total_value = 0.; - BOOST_FOREACH(const unit& unit, units) { + for (const unit& unit : units) { if (unit.incapacitated() || unit.total_movement() <= 0 || unit.can_recruit()) { continue; } @@ -1476,7 +1475,7 @@ double recruitment::get_unit_ratio() const { } } int allies_count = 0; - BOOST_FOREACH(const team& team, *resources::teams) { + for (const team& team : *resources::teams) { if (!current_team().is_enemy(team.side())) { ++allies_count; } @@ -1542,8 +1541,8 @@ void recruitment::do_randomness(std::vector* leader_data) const { if (!leader_data) { return; } - BOOST_FOREACH(data& data, *leader_data) { - BOOST_FOREACH(score_map::value_type& entry, data.scores) { + for (data& data : *leader_data) { + for (score_map::value_type& entry : data.scores) { double& score = entry.second; score += (static_cast(rand()) / RAND_MAX) * get_recruitment_randomness(); } @@ -1562,7 +1561,7 @@ void recruitment::do_similarity_penalty(std::vector* leader_data) const { if (!leader_data) { return; } - BOOST_FOREACH(data& data, *leader_data) { + for (data& data : *leader_data) { // First we count how many similarities each recruit have to other ones (in a map). // Some examples: // If unit A and unit B have nothing to do with each other, they have similarity = 0. @@ -1571,13 +1570,13 @@ void recruitment::do_similarity_penalty(std::vector* leader_data) const { // If A advances to B or C, A have similarity = 2. B and C have similarity = 1. typedef std::map similarity_map; similarity_map similarities; - BOOST_FOREACH(const score_map::value_type& entry, data.scores) { + for (const score_map::value_type& entry : data.scores) { const std::string& recruit = entry.first; const unit_type* recruit_type = unit_types.find(recruit); if (!recruit_type) { continue; } - BOOST_FOREACH(const std::string& advanced_type, recruit_type->advancement_tree()){ + for (const std::string& advanced_type : recruit_type->advancement_tree()) { if (data.scores.count(advanced_type) != 0) { ++similarities[recruit]; ++similarities[advanced_type]; @@ -1585,7 +1584,7 @@ void recruitment::do_similarity_penalty(std::vector* leader_data) const { } } // Now we divide each score by similarity + 1. - BOOST_FOREACH(score_map::value_type& entry, data.scores) { + for (score_map::value_type& entry : data.scores) { const std::string& recruit = entry.first; double& score = entry.second; score /= (similarities[recruit] + 1); @@ -1605,7 +1604,7 @@ int recruitment::get_cheapest_unit_cost_for_leader(const unit_map::const_iterato int cheapest_cost = 999999; // team recruits - BOOST_FOREACH(const std::string& recruit, current_team().recruits()) { + for (const std::string& recruit : current_team().recruits()) { const unit_type* const info = unit_types.find(recruit); if (!info) { continue; @@ -1615,7 +1614,7 @@ int recruitment::get_cheapest_unit_cost_for_leader(const unit_map::const_iterato } } // extra recruits - BOOST_FOREACH(const std::string& recruit, leader->recruits()) { + for (const std::string& recruit : leader->recruits()) { const unit_type* const info = unit_types.find(recruit); if (!info) { continue; @@ -1641,9 +1640,9 @@ void recruitment::handle_recruitment_more(std::vector* leader_data) const return; } const std::vector aspect = get_recruitment_more(); - BOOST_FOREACH(const std::string& type, aspect) { - BOOST_FOREACH(data& data, *leader_data) { - BOOST_FOREACH(score_map::value_type& entry, data.scores) { + for (const std::string& type : aspect) { + for (data& data : *leader_data) { + for (score_map::value_type& entry : data.scores) { const std::string& recruit = entry.first; double& score = entry.second; if (recruit_matches_type(recruit, type)) { @@ -1665,7 +1664,7 @@ bool recruitment::is_enemy_in_radius(const map_location& loc, int radius) const if (surrounding.empty()) { return false; } - BOOST_FOREACH(const map_location& loc, surrounding) { + for (const map_location& loc : surrounding) { const unit_map::const_iterator& enemy_it = units.find(loc); if(enemy_it == units.end()) { continue; @@ -1687,7 +1686,7 @@ void recruitment::update_own_units_count() { own_units_count_.clear(); total_own_units_ = 0; const unit_map& units = *resources::units; - BOOST_FOREACH(const unit& unit, units) { + for (const unit& unit : units) { if (unit.side() != get_side() || unit.can_recruit() || unit.incapacitated() || unit.total_movement() <= 0) { continue; @@ -1709,7 +1708,7 @@ void recruitment::update_scouts_wanted() { int neutral_villages = 0; // We recruit the initial allocation of scouts // based on how many neutral villages there are. - BOOST_FOREACH(const map_location& village, resources::gameboard->map().villages()) { + for (const map_location& village : resources::gameboard->map().villages()) { if (resources::gameboard->village_owner(village) == -1) { ++neutral_villages; } @@ -1729,7 +1728,7 @@ void recruitment::update_scouts_wanted() { } // Subtract already recruited scouts. - BOOST_FOREACH(const count_map::value_type& entry, own_units_count_) { + for (const count_map::value_type& entry : own_units_count_) { const std::string& unit_type = entry.first; const int count = entry.second; if (recruit_matches_type(unit_type, "scout")) { @@ -1783,12 +1782,12 @@ recruitment_aspect::recruitment_aspect(readonly_context &context, const config & { config parsed_cfg(cfg.has_child("value") ? cfg.child("value") : cfg); // First, transform simplified tags into [recruit] tags. - BOOST_FOREACH (config pattern, parsed_cfg.child_range("pattern")) { + for (config pattern : parsed_cfg.child_range("pattern")) { parsed_cfg["pattern"] = true; parsed_cfg.add_child("recruit", pattern); } parsed_cfg.clear_children("pattern"); - BOOST_FOREACH (config total, parsed_cfg.child_range("total")) { + for (config total : parsed_cfg.child_range("total")) { parsed_cfg["total"] = true; parsed_cfg.add_child("recruit", total); } @@ -1798,10 +1797,10 @@ recruitment_aspect::recruitment_aspect(readonly_context &context, const config & parsed_cfg.add_child("recruit", config_of("importance", 0)); } // Finally, populate our lists - BOOST_FOREACH (config job, parsed_cfg.child_range("recruit")) { + for (config job : parsed_cfg.child_range("recruit")) { create_job(jobs_, job); } - BOOST_FOREACH (config lim, parsed_cfg.child_range("limit")) { + for (config lim : parsed_cfg.child_range("limit")) { create_limit(limits_, lim); } boost::function2 >&, const config&> factory_jobs = @@ -1814,10 +1813,10 @@ recruitment_aspect::recruitment_aspect(readonly_context &context, const config & void recruitment_aspect::recalculate() const { config cfg; - BOOST_FOREACH (const boost::shared_ptr& job, jobs_) { + for (const boost::shared_ptr& job : jobs_) { cfg.add_child("recruit", job->to_config()); } - BOOST_FOREACH (const boost::shared_ptr& lim, limits_) { + for (const boost::shared_ptr& lim : limits_) { cfg.add_child("limit", lim->to_config()); } *this->value_ = cfg; diff --git a/src/ai/default/recruitment.hpp b/src/ai/default/recruitment.hpp index ce366a18e354..dae40729bc46 100644 --- a/src/ai/default/recruitment.hpp +++ b/src/ai/default/recruitment.hpp @@ -26,7 +26,6 @@ #include "units/unit.hpp" #include "units/map.hpp" -#include #include #include @@ -71,7 +70,7 @@ struct data { : leader(leader), ratio_score(1.0), recruit_count(0), in_danger(false) { } double get_score_sum() const { double sum = 0.0; - BOOST_FOREACH(const score_map::value_type& entry, scores) { + for (const score_map::value_type& entry : scores) { sum += entry.second; } return sum; @@ -82,7 +81,7 @@ struct data { return scores; } score_map normalized; - BOOST_FOREACH(const score_map::value_type& entry, scores) { + for (const score_map::value_type& entry : scores) { normalized[entry.first] = entry.second / sum; } return normalized; @@ -93,7 +92,7 @@ struct data { s << "For leader: " << leader->name() << "\n"; s << "ratio_score: " << ratio_score << "\n"; s << "recruit_count: " << recruit_count << "\n\n"; - BOOST_FOREACH(const score_map::value_type& entry, scores) { + for (const score_map::value_type& entry : scores) { s << std::setw(20) << entry.first << " score: " << std::setw(7) << entry.second << "\n"; } diff --git a/src/ai/default/stage_rca.cpp b/src/ai/default/stage_rca.cpp index 7fdc45f0b437..093cd51eb7df 100644 --- a/src/ai/default/stage_rca.cpp +++ b/src/ai/default/stage_rca.cpp @@ -28,7 +28,6 @@ #include "log.hpp" #include -#include namespace ai { @@ -49,7 +48,7 @@ candidate_action_evaluation_loop::candidate_action_evaluation_loop( ai_context & void candidate_action_evaluation_loop::on_create() { //init the candidate actions - BOOST_FOREACH(const config &cfg_element, cfg_.child_range("candidate_action")){ + for (const config &cfg_element : cfg_.child_range("candidate_action")) { engine::parse_candidate_action_from_config(*this,cfg_element,back_inserter(candidate_actions_)); } @@ -69,7 +68,7 @@ void candidate_action_evaluation_loop::create_candidate_action(std::vectorto_config()); } return cfg; @@ -88,7 +87,7 @@ bool candidate_action_evaluation_loop::do_play_stage() { LOG_AI_TESTING_RCA_DEFAULT << "Starting candidate action evaluation loop for side "<< get_side() << std::endl; - BOOST_FOREACH(candidate_action_ptr ca, candidate_actions_){ + for (candidate_action_ptr ca : candidate_actions_) { ca->enable(); } @@ -103,7 +102,7 @@ bool candidate_action_evaluation_loop::do_play_stage() candidate_action_ptr best_ptr; //Evaluation - BOOST_FOREACH(candidate_action_ptr ca_ptr, candidate_actions_){ + for (candidate_action_ptr ca_ptr : candidate_actions_) { if (!ca_ptr->is_enabled()){ DBG_AI_TESTING_RCA_DEFAULT << "Skipping disabled candidate action: "<< *ca_ptr << std::endl; continue; diff --git a/src/ai/formula/ai.cpp b/src/ai/formula/ai.cpp index df7c71b19435..76e81b739501 100644 --- a/src/ai/formula/ai.cpp +++ b/src/ai/formula/ai.cpp @@ -54,8 +54,6 @@ #include "ai/game_info.hpp" // for move_result_ptr, move_map, etc #include "candidates.hpp" // for base_candidate_action, etc - -#include // for auto_any_base, etc #include // for intrusive_ptr #include // for lexical_cast #include // for shared_ptr @@ -571,7 +569,7 @@ template variant villages_from_set(const Container& villages, const std::set* exclude=nullptr) { std::vector vars; - BOOST_FOREACH(const map_location& loc, villages) { + for(const map_location& loc : villages) { if(exclude && exclude->count(loc)) { continue; } @@ -632,7 +630,7 @@ variant formula_ai::get_value(const std::string& key) const { const std::vector &rp = get_recruitment_pattern(); std::vector vars; - BOOST_FOREACH(const std::string &i, rp) { + for(const std::string &i : rp) { vars.push_back(variant(i)); } return variant(&vars); @@ -766,7 +764,7 @@ variant formula_ai::get_value(const std::string& key) const std::vector v; tmp.push_back( v ); } - BOOST_FOREACH(const unit &u, units) { + for(const unit &u : units) { tmp[u.side() - 1].push_back(variant(new unit_callable(u))); } for( size_t i = 0; i - static lg::log_domain log_formula_ai("ai/engine/fai"); #define ERR_AI LOG_STREAM(err, log_formula_ai) @@ -66,7 +64,7 @@ candidate_action_with_filters::candidate_action_with_filters( const config & filter_params = cfg.child("filter"); if( filter_params ) { - BOOST_FOREACH( const config::attribute filter_param, filter_params.attribute_range() ) + for(const config::attribute filter_param : filter_params.attribute_range()) { game_logic::const_formula_ptr filter_formula( new game_logic::formula(filter_param.second, function_table)); diff --git a/src/ai/formula/function_table.cpp b/src/ai/formula/function_table.cpp index 1f81bfaec6c7..f22bc9dd49c6 100644 --- a/src/ai/formula/function_table.cpp +++ b/src/ai/formula/function_table.cpp @@ -37,8 +37,6 @@ #include "units/unit.hpp" #include "pathfind/pathfind.hpp" -#include - static lg::log_domain log_formula_ai("ai/engine/fai"); #define LOG_AI LOG_STREAM(info, log_formula_ai) #define WRN_AI LOG_STREAM(warn, log_formula_ai) @@ -343,7 +341,7 @@ class calculate_map_ownership_function : public function_expression { if( scores[current_side][i] > 98 ) continue; - BOOST_FOREACH( int side , enemies) { + for (int side : enemies) { int diff = scores[current_side][i] - scores[side][i]; if ( diff > enemy_tollerancy) { valid = false; @@ -353,7 +351,7 @@ class calculate_map_ownership_function : public function_expression { } if( valid ) { - BOOST_FOREACH( int side , allies) { + for (int side : allies) { if ( scores[current_side][i] - scores[side][i] > ally_tollerancy ) { valid = false; break; @@ -549,7 +547,7 @@ class castle_locs_function : public function_expression { visited_locs.erase(starting_loc); std::vector res; - BOOST_FOREACH( const map_location& ml, visited_locs) { + for (const map_location& ml : visited_locs) { res.push_back( variant(new location_callable( ml ) ) ); } @@ -825,7 +823,7 @@ class outcomes_function : public function_expression { ai::attack_analysis* analysis = convert_variant(attack); //unit_map units_with_moves(*resources::units); //typedef std::pair mv; - //BOOST_FOREACH(const mv &m, analysis->movements) { + //for(const mv &m : analysis->movements) { // units_with_moves.move(m.first, m.second); //} @@ -1602,7 +1600,7 @@ class max_possible_damage_with_retaliation_function : public function_expression std::vector attacks = attacker.attacks(); - BOOST_FOREACH(const attack_type &attack, attacks) { + for (const attack_type &attack : attacks) { const int dmg = round_damage(attack.damage(), defender.damage_from(attack), 100) * attack.num_attacks(); if (attack.range() == "melee") { highest_melee_damage = std::max(highest_melee_damage, dmg); diff --git a/src/ai/manager.cpp b/src/ai/manager.cpp index 111a012b4a63..879331f7b3df 100644 --- a/src/ai/manager.cpp +++ b/src/ai/manager.cpp @@ -45,7 +45,6 @@ #include // for min -#include // for auto_any_base, etc #include // for assert #include // for reverse_iterator, etc #include // for _Rb_tree_iterator, etc @@ -107,7 +106,7 @@ void holder::init( side_number side ) if (this->ai_) { ai_->on_create(); - BOOST_FOREACH(config &mod_ai, cfg_.child_range("modify_ai")) { + for (config &mod_ai : cfg_.child_range("modify_ai")) { if (!mod_ai.has_attribute("side")) { mod_ai["side"] = side; } @@ -169,8 +168,8 @@ void holder::modify_side_ai_config(config cfg) cfg_.merge_children_by_attribute("aspect","id"); } else { // else run 'add_facet' command on each [aspect][facet] - BOOST_FOREACH(const config &cfg_a, cfg.child_range("aspect")) { - BOOST_FOREACH(const config &cfg_f, cfg_a.child_range("facet")) { + for (const config &cfg_a : cfg.child_range("aspect")) { + for (const config &cfg_f : cfg_a.child_range("facet")) { readonly_context_->add_facet(cfg_a["id"],cfg_f); } } @@ -714,7 +713,7 @@ void manager::clear_ais() void manager::modify_active_ai_config_old_for_side ( side_number side, const config::const_child_itors &ai_parameters ) { - BOOST_FOREACH(const config& cfg, ai_parameters) { + for (const config& cfg : ai_parameters) { get_active_ai_holder_for_side(side).modify_side_ai_config(cfg); } } diff --git a/src/arrow.cpp b/src/arrow.cpp index 26d38757a120..b95676595469 100644 --- a/src/arrow.cpp +++ b/src/arrow.cpp @@ -23,8 +23,6 @@ #include "log.hpp" #include "resources.hpp" -#include - static lg::log_domain log_arrows("arrows"); #define ERR_ARR LOG_STREAM(err, log_arrows) #define WRN_ARR LOG_STREAM(warn, log_arrows) @@ -289,7 +287,7 @@ void arrow::invalidate_arrow_path(arrow_path_t const& path) { if(!SCREEN) return; - BOOST_FOREACH(map_location const& loc, path) + for (map_location const& loc : path) { SCREEN->invalidate(loc); } diff --git a/src/campaign_server/addon_utils.cpp b/src/campaign_server/addon_utils.cpp index b1bb9c7a294e..082584d857fc 100644 --- a/src/campaign_server/addon_utils.cpp +++ b/src/campaign_server/addon_utils.cpp @@ -21,8 +21,6 @@ #include "log.hpp" #include "serialization/string_utils.hpp" -#include - static lg::log_domain log_network("network"); #define LOG_CS if (lg::err().dont_log(log_network)) ; else lg::err()(log_network, false) diff --git a/src/campaign_server/blacklist.cpp b/src/campaign_server/blacklist.cpp index 2ed4a44cfa5e..a01be4b592c1 100644 --- a/src/campaign_server/blacklist.cpp +++ b/src/campaign_server/blacklist.cpp @@ -18,8 +18,6 @@ #include "serialization/string_utils.hpp" #include "serialization/unicode.hpp" -#include - static lg::log_domain log_campaignd_bl("campaignd/blacklist"); #define LOG_BL LOG_STREAM(err, log_campaignd_bl) diff --git a/src/campaign_server/campaign_server.cpp b/src/campaign_server/campaign_server.cpp index e9e2913acff6..9adcd5994568 100644 --- a/src/campaign_server/campaign_server.cpp +++ b/src/campaign_server/campaign_server.cpp @@ -40,7 +40,6 @@ #include #include -#include #include #include #include diff --git a/src/carryover.cpp b/src/carryover.cpp index 1296727b6a1d..1b3d2f2b20cb 100644 --- a/src/carryover.cpp +++ b/src/carryover.cpp @@ -19,7 +19,6 @@ #include "config.hpp" #include "team.hpp" #include "units/unit.hpp" -#include #include carryover::carryover(const config& side) @@ -32,7 +31,7 @@ carryover::carryover(const config& side) , save_id_(side["save_id"]) , variables_(side.child_or_empty("variables")) { - BOOST_FOREACH(const config& u, side.child_range("unit")){ + for(const config& u : side.child_range("unit")) { recall_list_.push_back(u); config& u_back = recall_list_.back(); u_back.remove_attribute("side"); @@ -52,7 +51,7 @@ carryover::carryover(const team& t, const int gold, const bool add) , save_id_(t.save_id()) , variables_(t.variables()) { - BOOST_FOREACH(const unit_const_ptr & u, t.recall_list()) { + for(const unit_const_ptr & u : t.recall_list()) { recall_list_.push_back(config()); u->write(recall_list_.back()); } @@ -87,7 +86,7 @@ void carryover::transfer_all_recruits_to(config& side_cfg){ } void carryover::transfer_all_recalls_to(config& side_cfg){ - BOOST_FOREACH(const config & u_cfg, recall_list_) { + for(const config & u_cfg : recall_list_) { side_cfg.add_child("unit", u_cfg); } recall_list_.clear(); @@ -106,7 +105,7 @@ std::string carryover::get_recruits(bool erase){ const std::string carryover::to_string(){ std::string side = ""; side.append("Side " + save_id_ + ": gold " + std::to_string(gold_) + " recruits " + get_recruits(false) + " units "); - BOOST_FOREACH(const config & u_cfg, recall_list_) { + for(const config & u_cfg : recall_list_) { side.append(u_cfg["name"].str() + ", "); } return side; @@ -119,8 +118,9 @@ void carryover::to_config(config& cfg){ side["add"] = add_; side["current_player"] = current_player_; side["previous_recruits"] = get_recruits(false); - BOOST_FOREACH(const config & u_cfg, recall_list_) + for(const config & u_cfg : recall_list_) { side.add_child("unit", u_cfg); + } } carryover_info::carryover_info(const config& cfg, bool from_snpashot) @@ -131,7 +131,7 @@ carryover_info::carryover_info(const config& cfg, bool from_snpashot) , next_scenario_(cfg["next_scenario"]) , next_underlying_unit_id_(cfg["next_underlying_unit_id"].to_int(0)) { - BOOST_FOREACH(const config& side, cfg.child_range("side")) + for(const config& side : cfg.child_range("side")) { if(side["lost"].to_bool(false) || !side["persistent"].to_bool(true)) { @@ -141,7 +141,7 @@ carryover_info::carryover_info(const config& cfg, bool from_snpashot) } this->carryover_sides_.push_back(carryover(side)); } - BOOST_FOREACH(const config& item, cfg.child_range("menu_item")) + for(const config& item : cfg.child_range("menu_item")) { wml_menu_items_.push_back(new config(item)); } @@ -222,7 +222,7 @@ void carryover_info::transfer_to(config& level) } if(!level.has_child("menu_item")){ - BOOST_FOREACH(config& item , wml_menu_items_) + for(config& item : wml_menu_items_) { level.add_child("menu_item").swap(item); } @@ -240,7 +240,7 @@ const config carryover_info::to_config() cfg["next_underlying_unit_id"] = next_underlying_unit_id_; cfg["next_scenario"] = next_scenario_; - BOOST_FOREACH(carryover& c, carryover_sides_){ + for(carryover& c : carryover_sides_) { c.to_config(cfg); } @@ -248,7 +248,7 @@ const config carryover_info::to_config() cfg["random_calls"] = rng_.get_random_calls(); cfg.add_child("variables", variables_); - BOOST_FOREACH(const config& item , wml_menu_items_) + for(const config& item : wml_menu_items_) { cfg.add_child("menu_item", item); } @@ -256,7 +256,7 @@ const config carryover_info::to_config() } carryover* carryover_info::get_side(std::string save_id){ - BOOST_FOREACH(carryover& side, carryover_sides_){ + for(carryover& side : carryover_sides_) { if(side.get_save_id() == save_id){ return &side; } @@ -267,7 +267,7 @@ carryover* carryover_info::get_side(std::string save_id){ void carryover_info::merge_old_carryover(const carryover_info& old_carryover) { - BOOST_FOREACH(const carryover & old_side, old_carryover.carryover_sides_) + for(const carryover & old_side : old_carryover.carryover_sides_) { std::vector::iterator iside = std::find_if( carryover_sides_.begin(), diff --git a/src/commandline_options.cpp b/src/commandline_options.cpp index 66ce059fa09e..6cc779dab3f7 100644 --- a/src/commandline_options.cpp +++ b/src/commandline_options.cpp @@ -22,7 +22,6 @@ #include "util.hpp" // for lexical_cast #include // for any -#include // for auto_any_base, etc #include #include // for validation_error, etc #include @@ -497,7 +496,7 @@ commandline_options::commandline_options (const std::vector& args) void commandline_options::parse_log_domains_(const std::string &domains_string, const int severity) { const std::vector domains = utils::split(domains_string, ','); - BOOST_FOREACH(const std::string& domain, domains) + for (const std::string& domain : domains) { if (!log) log = std::vector >(); @@ -507,7 +506,7 @@ void commandline_options::parse_log_domains_(const std::string &domains_string, void commandline_options::parse_log_strictness (const std::string & severity ) { static lg::logger const *loggers[] = { &lg::err(), &lg::warn(), &lg::info(), &lg::debug() }; - BOOST_FOREACH (const lg::logger * l, loggers ) { + for (const lg::logger * l : loggers ) { if (severity == l->get_name()) { lg::set_strict_severity(*l); return ; @@ -543,7 +542,7 @@ std::vector > commandline_options::parse_ const std::string& expected_format = std::string() + "UINT" + separator + "STRING"; - BOOST_FOREACH(const std::string &s, strings) + for (const std::string &s : strings) { const std::vector tokens = utils::split(s, separator); if(tokens.size() != 2) { @@ -571,7 +570,7 @@ std::vector > commandline_opt const std::string& expected_format = std::string() + "UINT" + separator + "STRING" + separator + "STRING"; - BOOST_FOREACH(const std::string &s, strings) + for (const std::string &s : strings) { const std::vector tokens = utils::split(s, separator); if(tokens.size() != 3) { diff --git a/src/config.cpp b/src/config.cpp index 245d4d483820..6e9cc433d192 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -32,7 +32,6 @@ #include #include -#include #include #include #include @@ -501,7 +500,7 @@ bool config::valid_id(const std::string& id) if (id.empty()) { return false; } - BOOST_FOREACH(char c, id) { + for (char c : id) { if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_') { //valid character. } @@ -542,7 +541,7 @@ void config::append_children(const config &cfg) { check_valid(cfg); - BOOST_FOREACH(const any_child &value, cfg.all_children_range()) { + for (const any_child &value : cfg.all_children_range()) { add_child(value.key, value.cfg); } } @@ -550,7 +549,7 @@ void config::append_children(const config &cfg) void config::append_attributes(const config &cfg) { check_valid(cfg); - BOOST_FOREACH(const attribute &v, cfg.values) { + for (const attribute &v : cfg.values) { values[v.first] = v.second; } } @@ -559,7 +558,7 @@ void config::append_children(const config &cfg, const std::string& key) { check_valid(cfg); - BOOST_FOREACH(const config &value, cfg.child_range(key)) { + for (const config &value : cfg.child_range(key)) { add_child(key, value); } } @@ -567,7 +566,7 @@ void config::append_children(const config &cfg, const std::string& key) void config::append(const config &cfg) { append_children(cfg); - BOOST_FOREACH(const attribute &v, cfg.values) { + for (const attribute &v : cfg.values) { values[v.first] = v.second; } } @@ -579,7 +578,7 @@ void config::merge_children(const std::string& key) if (child_count(key) < 2) return; config merged_children; - BOOST_FOREACH(const config &cfg, child_range(key)) { + for (const config &cfg : child_range(key)) { merged_children.append(cfg); } @@ -595,7 +594,7 @@ void config::merge_children_by_attribute(const std::string& key, const std::stri typedef std::map config_map; config_map merged_children_map; - BOOST_FOREACH(const config &cfg, child_range(key)) { + for (const config &cfg : child_range(key)) { const std::string &value = cfg[attribute]; config_map::iterator m = merged_children_map.find(value); if ( m!=merged_children_map.end() ) { @@ -606,7 +605,7 @@ void config::merge_children_by_attribute(const std::string& key, const std::stri } clear_children(key); - BOOST_FOREACH(const config_map::value_type &i, merged_children_map) { + for (const config_map::value_type &i : merged_children_map) { add_child(key,i.second); } } @@ -828,7 +827,7 @@ void config::clear_children(const std::string& key) ordered_children.erase(std::remove_if(ordered_children.begin(), ordered_children.end(), remove_ordered(i)), ordered_children.end()); - BOOST_FOREACH(config *c, i->second) { + for (config *c : i->second) { delete c; } @@ -864,7 +863,7 @@ void config::recursive_clear_value(const std::string& key) values.erase(key); - BOOST_FOREACH(const any_child &value, all_children_range()) { + for (const any_child &value : all_children_range()) { const_cast(&value.cfg)->recursive_clear_value(key); } } @@ -875,7 +874,7 @@ std::vector::iterator config::remove_child( /* Find the position with the correct index and decrement all the indices in the ordering that are above this index. */ unsigned found = 0; - BOOST_FOREACH(child_pos &p, ordered_children) + for (child_pos &p : ordered_children) { if (p.pos != pos) continue; if (p.index == index) @@ -971,7 +970,7 @@ void config::merge_attributes(const config &cfg) check_valid(cfg); assert(this != &cfg); - BOOST_FOREACH(const attribute &v, cfg.values) { + for (const attribute &v : cfg.values) { std::string key = v.first; if (key.substr(0,7) == "add_to_") { @@ -1257,21 +1256,21 @@ void config::apply_diff(const config& diff, bool track /* = false */) if (track) values[diff_track_attribute] = "modified"; if (const config &inserts = diff.child("insert")) { - BOOST_FOREACH(const attribute &v, inserts.attribute_range()) { + for (const attribute &v : inserts.attribute_range()) { values[v.first] = v.second; } } if (const config &deletes = diff.child("delete")) { - BOOST_FOREACH(const attribute &v, deletes.attribute_range()) { + for (const attribute &v : deletes.attribute_range()) { values.erase(v.first); } } - BOOST_FOREACH(const config &i, diff.child_range("change_child")) + for (const config &i : diff.child_range("change_child")) { const size_t index = lexical_cast(i["index"].str()); - BOOST_FOREACH(const any_child &item, i.all_children_range()) + for (const any_child &item : i.all_children_range()) { if (item.key.empty()) { continue; @@ -1286,19 +1285,19 @@ void config::apply_diff(const config& diff, bool track /* = false */) } } - BOOST_FOREACH(const config &i, diff.child_range("insert_child")) + for (const config &i : diff.child_range("insert_child")) { const size_t index = lexical_cast(i["index"].str()); - BOOST_FOREACH(const any_child &item, i.all_children_range()) { + for (const any_child &item : i.all_children_range()) { config& inserted = add_child_at(item.key, item.cfg, index); if (track) inserted[diff_track_attribute] = "new"; } } - BOOST_FOREACH(const config &i, diff.child_range("delete_child")) + for (const config &i : diff.child_range("delete_child")) { const size_t index = lexical_cast(i["index"].str()); - BOOST_FOREACH(const any_child &item, i.all_children_range()) { + for (const any_child &item : i.all_children_range()) { if (!track) { remove_child(item.key, index); } else { @@ -1315,18 +1314,18 @@ void config::apply_diff(const config& diff, bool track /* = false */) void config::clear_diff_track(const config& diff) { remove_attribute(diff_track_attribute); - BOOST_FOREACH(const config &i, diff.child_range("delete_child")) + for (const config &i : diff.child_range("delete_child")) { const size_t index = lexical_cast(i["index"].str()); - BOOST_FOREACH(const any_child &item, i.all_children_range()) { + for (const any_child &item : i.all_children_range()) { remove_child(item.key, index); } } - BOOST_FOREACH(const config &i, diff.child_range("change_child")) + for (const config &i : diff.child_range("change_child")) { const size_t index = lexical_cast(i["index"].str()); - BOOST_FOREACH(const any_child &item, i.all_children_range()) + for (const any_child &item : i.all_children_range()) { if (item.key.empty()) { continue; @@ -1340,7 +1339,7 @@ void config::clear_diff_track(const config& diff) itor->second[index]->clear_diff_track(item.cfg); } } - BOOST_FOREACH(const any_child &value, all_children_range()) { + for (const any_child &value : all_children_range()) { const_cast(&value.cfg)->remove_attribute(diff_track_attribute); } } @@ -1388,7 +1387,7 @@ void config::merge_with(const config& c) // Remove those marked so std::map removals; - BOOST_FOREACH(const child_pos& pos, to_remove) { + for (const child_pos& pos : to_remove) { const std::string& tag = pos.pos->first; unsigned &removes = removals[tag]; remove_child(tag, pos.index - removes++); @@ -1412,20 +1411,20 @@ bool config::matches(const config &filter) const { check_valid(filter); - BOOST_FOREACH(const attribute &i, filter.attribute_range()) + for (const attribute &i : filter.attribute_range()) { const attribute_value *v = get(i.first); if (!v || *v != i.second) return false; } - BOOST_FOREACH(const any_child &i, filter.all_children_range()) + for (const any_child &i : filter.all_children_range()) { if (i.key == "not") { if (matches(i.cfg)) return false; continue; } bool found = false; - BOOST_FOREACH(const config &j, child_range(i.key)) { + for (const config &j : child_range(i.key)) { if (j.matches(i.cfg)) { found = true; break; @@ -1449,12 +1448,12 @@ std::ostream& operator << (std::ostream& outstream, const config& cfg) { static int i = 0; i++; - BOOST_FOREACH(const config::attribute &val, cfg.attribute_range()) { + for (const config::attribute &val : cfg.attribute_range()) { if(val.second.blank()) continue; for (int j = 0; j < i-1; j++){ outstream << char(9); } outstream << val.first << " = " << val.second << '\n'; } - BOOST_FOREACH(const config::any_child &child, cfg.all_children_range()) + for (const config::any_child &child : cfg.all_children_range()) { for (int j = 0; j < i - 1; ++j) outstream << char(9); outstream << "[" << child.key << "]\n"; @@ -1483,7 +1482,7 @@ std::string config::hash() const hash_str[hash_length] = 0; i = 0; - BOOST_FOREACH(const attribute &val, values) + for (const attribute &val : values) { for (c = val.first.begin(); c != val.first.end(); ++c) { hash_str[i] ^= *c; @@ -1496,10 +1495,10 @@ std::string config::hash() const } } - BOOST_FOREACH(const any_child &ch, all_children_range()) + for (const any_child &ch : all_children_range()) { std::string child_hash = ch.cfg.hash(); - BOOST_FOREACH(char c, child_hash) { + for (char c : child_hash) { hash_str[i] ^= c; ++i; if(i == hash_length) { diff --git a/src/config_cache.cpp b/src/config_cache.cpp index 25f07aec8fe2..dbdaf0517f31 100644 --- a/src/config_cache.cpp +++ b/src/config_cache.cpp @@ -26,7 +26,6 @@ #include "serialization/string_utils.hpp" #include "version.hpp" -#include #include #include @@ -112,7 +111,7 @@ void config_cache::write_file(std::string path, const preproc_map& defines) config_writer writer(*stream, true, game_config::cache_compression_level); // Write all defines to stream. - BOOST_FOREACH(const preproc_map::value_type& define, defines) { + for(const preproc_map::value_type& define : defines) { define.second.write(writer, define.first); } } @@ -149,7 +148,7 @@ void config_cache::read_cache(const std::string& path, config& cfg) bool is_valid = true; - BOOST_FOREACH(const preproc_map::value_type& d, defines_map_) { + for(const preproc_map::value_type& d : defines_map_) { // // Only WESNOTH_VERSION is allowed to be non-empty. // @@ -262,7 +261,7 @@ void config_cache::read_defines_file(const std::string& path) // use static preproc_define::read_pair(config) to make a object // and pass that object config_cache_transaction::insert_to_active method - BOOST_FOREACH(const config::any_child &value, cfg.all_children_range()) { + for(const config::any_child &value : cfg.all_children_range()) { config_cache_transaction::instance().insert_to_active( preproc_define::read_pair(value.cfg)); } @@ -272,7 +271,7 @@ void config_cache::read_defines_queue() { const std::vector& files = config_cache_transaction::instance().get_define_files(); - BOOST_FOREACH(const std::string &path, files) { + for(const std::string &path : files) { read_defines_file(path); } } @@ -378,7 +377,7 @@ bool config_cache::delete_cache_files(const std::vector& paths, const bool delete_everything = exclude_pattern.empty(); bool status = true; - BOOST_FOREACH(const std::string& path, paths) + for(const std::string& path : paths) { if(!delete_everything) { const std::string& fn = filesystem::base_name(path); @@ -479,7 +478,7 @@ void config_cache_transaction::add_defines_map_diff(preproc_map& new_map) std::insert_iterator(temp,temp.begin()), &compare_define); - BOOST_FOREACH(const preproc_map::value_type &def, temp) { + for(const preproc_map::value_type &def : temp) { insert_to_active(def); } diff --git a/src/controller_base.cpp b/src/controller_base.cpp index ec0b8fcb1b0a..ffe7ec5fb2f3 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -26,8 +26,6 @@ #include "scripting/plugins/context.hpp" #include "soundsource.hpp" -#include - static lg::log_domain log_display("display"); #define ERR_DP LOG_STREAM(err, log_display) @@ -139,7 +137,7 @@ bool controller_base::handle_scroll(CKey& key, int mousex, int mousey, int mouse int dx = 0, dy = 0; int scroll_threshold = (preferences::mouse_scroll_enabled()) ? preferences::mouse_scroll_threshold() : 0; - BOOST_FOREACH(const theme::menu& m, get_display().get_theme().menus()) { + for (const theme::menu& m : get_display().get_theme().menus()) { if (sdl::point_in_rect(mousex, mousey, m.get_location())) { scroll_threshold = 0; } @@ -307,7 +305,7 @@ void controller_base::execute_action(const std::vector& items_arg, } std::vector items; - BOOST_FOREACH(const std::string& item, items_arg) { + for (const std::string& item : items_arg) { const hotkey::hotkey_command& command = hotkey::get_hotkey_command(item); if(cmd_exec->can_execute_command(command)) diff --git a/src/dialogs.cpp b/src/dialogs.cpp index eafabec9817e..30db677a0905 100644 --- a/src/dialogs.cpp +++ b/src/dialogs.cpp @@ -61,7 +61,6 @@ #include "gui/dialogs/transient_message.hpp" #include "ai/lua/aspect_advancements.hpp" -#include #include #include @@ -107,7 +106,7 @@ template void dump(const T & units) LOG_DP << "size: " << units.size() << "\n"; size_t idx = 0; - BOOST_FOREACH(const unit_const_ptr & u_ptr, units) { + for (const unit_const_ptr & u_ptr : units) { LOG_DP << "unit[" << (idx++) << "]: " << u_ptr->id() << " name = '" << u_ptr->name() << "'\n"; } } @@ -194,7 +193,7 @@ int advance_unit_dialog(const map_location &loc) } bool always_display = false; - BOOST_FOREACH(const config &mod, u->get_modification_advances()) + for (const config &mod : u->get_modification_advances()) { if (mod["always_display"].to_bool()) always_display = true; sample_units->push_back(::get_amla_unit(*u, mod)); @@ -483,7 +482,7 @@ int recall_dialog(display& disp, const boost::shared_ptrname(); @@ -499,7 +498,7 @@ int recall_dialog(display& disp, const boost::shared_ptroverlays()) + for(const std::string& overlay : u->overlays()) { option << "~BLIT(" << overlay << ")"; } @@ -545,7 +544,7 @@ int recall_dialog(display& disp, const boost::shared_ptrtype_name() << " " << name << " " << u->level(); option << COLUMN_SEPARATOR; - BOOST_FOREACH(const t_string& trait, u->trait_names()) { + for(const t_string& trait : u->trait_names()) { option << trait << '\n'; option_to_filter << " " << trait; } @@ -711,7 +710,7 @@ void unit_preview_pane::draw_contents() image_rect = rect; if(!det.overlays.empty()) { - BOOST_FOREACH(const std::string& overlay, det.overlays) { + for(const std::string& overlay : det.overlays) { sdl::timage oi = image::get_texture(overlay); if(!oi.null()) { @@ -856,7 +855,7 @@ void unit_preview_pane::draw_contents() image_rect = rect; if(!det.overlays.empty()) { - BOOST_FOREACH(const std::string& overlay, det.overlays) { + for(const std::string& overlay : det.overlays) { surface os = image::get_image(overlay); if(!os) { @@ -1049,7 +1048,7 @@ const unit_preview_pane::details units_list_preview_pane::get_details() const det.overlays.push_back(unit::leader_crown()); }; - BOOST_FOREACH(const std::string& overlay, u.overlays()) { + for(const std::string& overlay : u.overlays()) { det.overlays.push_back(overlay); } @@ -1097,7 +1096,7 @@ const unit_types_preview_pane::details unit_types_preview_pane::get_details() co det.race = t->race()->name(t->genders().front()); //FIXME: This probably must be move into a unit_type function - BOOST_FOREACH(const config &tr, t->possible_traits()) + for (const config &tr : t->possible_traits()) { if (tr["availability"] != "musthave") continue; @@ -1128,7 +1127,7 @@ const unit_types_preview_pane::details unit_types_preview_pane::get_details() co // Check if AMLA color is needed // FIXME: not sure if it's fully accurate (but not very important for unit_type) // xp_color also need a simpler function for doing this - BOOST_FOREACH(const config &adv, t->modification_advancements()) + for (const config &adv : t->modification_advancements()) { if (!adv["strict_amla"].to_bool() || !t->can_advance()) { det.xp_color = "<170,0,255>"; // from unit::xp_color() diff --git a/src/display.cpp b/src/display.cpp index 4b4082e6a12a..32c78258df2a 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -50,8 +50,6 @@ #include -#include - #ifdef __SUNPRO_CC // GCC doesn't have hypot in cmath so include it for Sun Studio #include @@ -84,7 +82,7 @@ void display::parse_team_overlays() { const team& curr_team = dc_->teams()[playing_team()]; const team& prev_team = dc_->teams()[playing_team()-1 < dc_->teams().size() ? playing_team()-1 : dc_->teams().size()-1]; - BOOST_FOREACH(const game_display::overlay_map::value_type i, *overlays_) { + for (const game_display::overlay_map::value_type i : *overlays_) { const overlay& ov = i.second; if (!ov.team_name.empty() && ((ov.team_name.find(curr_team.team_name()) + 1) != 0) != @@ -976,15 +974,15 @@ void display::create_buttons() void display::render_buttons() { - BOOST_FOREACH(gui::button &btn, menu_buttons_) { + for (gui::button &btn : menu_buttons_) { btn.set_dirty(true); } - BOOST_FOREACH(gui::button &btn, action_buttons_) { + for (gui::button &btn : action_buttons_) { btn.set_dirty(true); } - BOOST_FOREACH(gui::slider &sld, sliders_) { + for (gui::slider &sld : sliders_) { sld.set_dirty(true); } } @@ -1094,7 +1092,7 @@ std::vector display::get_fog_shroud_images(const map_location& loc, ima std::vector res; #endif - BOOST_FOREACH(std::string& name, names) { + for (std::string& name : names) { #ifdef SDL_GPU const sdl::timage img(image::get_texture(name, image_type)); if (!img.null()) @@ -1336,8 +1334,8 @@ void display::drawing_buffer_commit() * layergroup > location > layer > 'tblit' > surface */ - BOOST_FOREACH(tblit &blit, drawing_buffer_) { - BOOST_FOREACH(sdl::timage& img, blit.images()) { + for (tblit &blit : drawing_buffer_) { + for (sdl::timage& img : blit.images()) { if (!img.null()) { screen_.draw_texture(img, blit.x(), blit.y()); } @@ -1363,8 +1361,8 @@ void display::drawing_buffer_commit() * layergroup > location > layer > 'tblit' > surface */ - BOOST_FOREACH(const tblit &blit, drawing_buffer_) { - BOOST_FOREACH(const surface& surf, blit.surf()) { + for (const tblit &blit : drawing_buffer_) { + for (const surface& surf : blit.surf()) { // Note that dstrect can be changed by sdl_blit // and so a new instance should be initialized // to pass to each call to sdl_blit. @@ -2678,7 +2676,7 @@ void display::redraw_everything() int ticks3 = SDL_GetTicks(); LOG_DP << "invalidate and draw: " << (ticks3 - ticks2) << " and " << (ticks2 - ticks1) << "\n"; - BOOST_FOREACH(boost::function f, redraw_observers_) { + for (boost::function f : redraw_observers_) { f(*this); } @@ -2789,7 +2787,7 @@ void display::draw_invalidated() { SDL_Rect clip_rect = get_clip_rect(); surface& screen = get_screen_surface(); clip_rect_setter set_clip_rect(screen, &clip_rect); - BOOST_FOREACH(const map_location& loc, invalidated_) { + for (const map_location& loc : invalidated_) { int xpos = get_location_x(loc); int ypos = get_location_y(loc); @@ -2811,7 +2809,7 @@ void display::draw_invalidated() { unit_drawer drawer = unit_drawer(*this, energy_bar_rects_); - BOOST_FOREACH(const map_location& loc, invalidated_) { + for (const map_location& loc : invalidated_) { unit_map::const_iterator u_it = dc_->units().find(loc); exclusive_unit_draw_requests_t::iterator request = exclusive_unit_draw_requests_.find(loc); if (u_it != dc_->units().end() @@ -2938,7 +2936,7 @@ void display::draw_hex(const map_location& loc) { // Paint arrows arrows_map_t::const_iterator arrows_in_hex = arrows_map_.find(loc); if(arrows_in_hex != arrows_map_.end()) { - BOOST_FOREACH(arrow* const a, arrows_in_hex->second) { + for (arrow* const a : arrows_in_hex->second) { a->draw_hex(loc); } } @@ -3543,7 +3541,7 @@ bool display::invalidate(const std::set& locs) if(invalidateAll_) return false; bool ret = false; - BOOST_FOREACH(const map_location& loc, locs) { + for (const map_location& loc : locs) { #ifdef _OPENMP #pragma omp critical(invalidated_) #endif //_OPENMP @@ -3593,7 +3591,7 @@ bool display::invalidate_locations_in_rect(const SDL_Rect& rect) return false; bool result = false; - BOOST_FOREACH(const map_location &loc, hexes_under_rect(rect)) { + for (const map_location &loc : hexes_under_rect(rect)) { result |= invalidate(loc); } return result; @@ -3614,7 +3612,7 @@ void display::invalidate_animations() new_animation_frame(); animate_map_ = preferences::animate_map(); if (animate_map_) { - BOOST_FOREACH(const map_location &loc, get_visible_hexes()) + for (const map_location &loc : get_visible_hexes()) { if (shrouded(loc)) continue; if (builder_->update_animation(loc)) { @@ -3626,22 +3624,22 @@ void display::invalidate_animations() } #ifndef _OPENMP - BOOST_FOREACH(const unit & u, dc_->units()) { + for (const unit & u : dc_->units()) { u.anim_comp().refresh(); } - BOOST_FOREACH(const unit* u, *fake_unit_man_) { + for (const unit* u : *fake_unit_man_) { u->anim_comp().refresh(); } #else std::vector open_mp_list; - BOOST_FOREACH(const unit & u, dc_->units()) { + for (const unit & u : dc_->units()) { open_mp_list.push_back(&u); } // Note that it is an important assumption of the // system that the fake units are added to the list // after the real units, so that e.g. whiteboard // planned moves are drawn over the real units. - BOOST_FOREACH(const unit* u, *fake_unit_man_) { + for (const unit* u : *fake_unit_man_) { open_mp_list.push_back(u); } @@ -3663,10 +3661,10 @@ void display::invalidate_animations() do { new_inval = false; #ifndef _OPENMP - BOOST_FOREACH(const unit & u, dc_->units()) { + for (const unit & u : dc_->units()) { new_inval |= u.anim_comp().invalidate(*this); } - BOOST_FOREACH(const unit* u, *fake_unit_man_) { + for (const unit* u : *fake_unit_man_) { new_inval |= u->anim_comp().invalidate(*this); } #else @@ -3681,7 +3679,7 @@ void display::invalidate_animations() void display::add_arrow(arrow& arrow) { const arrow_path_t & arrow_path = arrow.get_path(); - BOOST_FOREACH(const map_location& loc, arrow_path) + for (const map_location& loc : arrow_path) { arrows_map_[loc].push_back(&arrow); } @@ -3690,7 +3688,7 @@ void display::add_arrow(arrow& arrow) void display::remove_arrow(arrow& arrow) { const arrow_path_t & arrow_path = arrow.get_path(); - BOOST_FOREACH(const map_location& loc, arrow_path) + for (const map_location& loc : arrow_path) { arrows_map_[loc].remove(&arrow); } @@ -3699,12 +3697,12 @@ void display::remove_arrow(arrow& arrow) void display::update_arrow(arrow & arrow) { const arrow_path_t & previous_path = arrow.get_previous_path(); - BOOST_FOREACH(const map_location& loc, previous_path) + for (const map_location& loc : previous_path) { arrows_map_[loc].remove(&arrow); } const arrow_path_t & arrow_path = arrow.get_path(); - BOOST_FOREACH(const map_location& loc, arrow_path) + for (const map_location& loc : arrow_path) { arrows_map_[loc].push_back(&arrow); } diff --git a/src/display_chat_manager.cpp b/src/display_chat_manager.cpp index be0e5a54ced9..b261c46007d3 100644 --- a/src/display_chat_manager.cpp +++ b/src/display_chat_manager.cpp @@ -26,7 +26,6 @@ #include "serialization/string_utils.hpp" #include -#include #include #include @@ -205,7 +204,7 @@ void display_chat_manager::prune_chat_messages(bool remove_all) } } - BOOST_FOREACH(const chat_message &cm, chat_messages_) { + for(const chat_message &cm : chat_messages_) { font::move_floating_label(cm.speaker_handle, 0, - movement); font::move_floating_label(cm.handle, 0, - movement); } diff --git a/src/display_context.cpp b/src/display_context.cpp index f4f99550f74e..a94f7b95400c 100644 --- a/src/display_context.cpp +++ b/src/display_context.cpp @@ -20,8 +20,6 @@ #include "units/unit.hpp" #include "units/map.hpp" -#include - std::vector& display_context::hidden_label_categories_ref() { return const_cast&>(this->hidden_label_categories()); } @@ -31,7 +29,7 @@ bool display_context::would_be_discovered(const map_location & loc, int side_num map_location adjs[6]; get_adjacent_tiles(loc,adjs); - BOOST_FOREACH(const map_location &u_loc, adjs) + for (const map_location &u_loc : adjs) { unit_map::const_iterator u_it = units().find(u_loc); if (!u_it.valid()) { @@ -119,7 +117,7 @@ int display_context::village_owner(const map_location& loc) const */ bool display_context::is_observer() const { - BOOST_FOREACH(const team &t, teams()) { + for (const team &t : teams()) { if (t.is_local()) return false; } @@ -132,7 +130,7 @@ bool display_context::is_observer() const int display_context::side_units(int side) const { int res = 0; - BOOST_FOREACH(const unit &u, units()) { + for (const unit &u : units()) { if (u.side() == side) ++res; } return res; @@ -141,7 +139,7 @@ int display_context::side_units(int side) const int display_context::side_units_cost(int side) const { int res = 0; - BOOST_FOREACH(const unit &u, units()) { + for (const unit &u : units()) { if (u.side() == side) res += u.cost(); } return res; @@ -150,7 +148,7 @@ int display_context::side_units_cost(int side) const int display_context::side_upkeep(int side) const { int res = 0; - BOOST_FOREACH(const unit &u, units()) { + for (const unit &u : units()) { if (u.side() == side) res += u.upkeep(); } return res; diff --git a/src/editor/action/action.cpp b/src/editor/action/action.cpp index fdb9dfe977dd..2eb3333a544d 100644 --- a/src/editor/action/action.cpp +++ b/src/editor/action/action.cpp @@ -25,8 +25,6 @@ #include "resources.hpp" -#include - namespace editor { int editor_action::next_id_ = 1; @@ -77,25 +75,25 @@ void editor_action_whole_map::perform_without_undo(map_context& mc) const { editor_action_chain::editor_action_chain(const editor::editor_action_chain &other) : editor_action(), actions_() { - BOOST_FOREACH(editor_action* a, other.actions_) { + for (editor_action* a : other.actions_) { actions_.push_back(a->clone()); } } editor_action_chain& editor_action_chain::operator=(const editor_action_chain& other) { if (this == &other) return *this; - BOOST_FOREACH(editor_action* a, actions_) { + for (editor_action* a : actions_) { delete a; } actions_.clear(); - BOOST_FOREACH(editor_action* a, other.actions_) { + for (editor_action* a : other.actions_) { actions_.push_back(a->clone()); } return *this; } editor_action_chain::~editor_action_chain() { - BOOST_FOREACH(editor_action* a, actions_) { + for (editor_action* a : actions_) { delete a; } } @@ -105,7 +103,7 @@ editor_action_chain* editor_action_chain::clone() const } int editor_action_chain::action_count() const { int count = 0; - BOOST_FOREACH(const editor_action* a, actions_) { + for (const editor_action* a : actions_) { if (a) { count += a->action_count(); } @@ -135,7 +133,7 @@ editor_action* editor_action_chain::pop_first_action() { } editor_action_chain* editor_action_chain::perform(map_context& mc) const { util::unique_ptr undo(new editor_action_chain()); - BOOST_FOREACH(editor_action* a, actions_) { + for (editor_action* a : actions_) { if (a != nullptr) { undo->append_action(a->perform(mc)); } @@ -145,7 +143,7 @@ editor_action_chain* editor_action_chain::perform(map_context& mc) const { } void editor_action_chain::perform_without_undo(map_context& mc) const { - BOOST_FOREACH(editor_action* a, actions_) { + for (editor_action* a : actions_) { if (a != nullptr) { a->perform_without_undo(mc); } diff --git a/src/editor/action/action_select.cpp b/src/editor/action/action_select.cpp index 26aa98ed94ea..d7bc785613e1 100644 --- a/src/editor/action/action_select.cpp +++ b/src/editor/action/action_select.cpp @@ -21,8 +21,6 @@ #include "editor/action/action_select.hpp" #include "editor/map/map_context.hpp" -#include - namespace editor { editor_action_select* editor_action_select::clone() const @@ -32,7 +30,7 @@ editor_action_select* editor_action_select::clone() const void editor_action_select::extend(const editor_map& /*map*/, const std::set& locs) { - BOOST_FOREACH(const map_location& loc, locs) { + for (const map_location& loc : locs) { LOG_ED << "Extending by " << loc << "\n"; area_.insert(loc); } @@ -41,7 +39,7 @@ void editor_action_select::extend(const editor_map& /*map*/, const std::set undo_locs; - BOOST_FOREACH(const map_location& loc, area_) { + for (const map_location& loc : area_) { undo_locs.insert(loc); mc.add_changed_location(loc); } @@ -51,7 +49,7 @@ editor_action* editor_action_select::perform(map_context& mc) const void editor_action_select::perform_without_undo(map_context& mc) const { - BOOST_FOREACH(const map_location& loc, area_) { + for (const map_location& loc : area_) { mc.get_map().add_to_selection(loc); mc.add_changed_location(loc); @@ -65,7 +63,7 @@ editor_action_deselect* editor_action_deselect::clone() const void editor_action_deselect::extend(const editor_map& map, const std::set& locs) { - BOOST_FOREACH(const map_location& loc, locs) { + for (const map_location& loc : locs) { LOG_ED << "Checking " << loc << "\n"; if (!map.in_selection(loc)) { LOG_ED << "Extending by " << loc << "\n"; @@ -77,7 +75,7 @@ void editor_action_deselect::extend(const editor_map& map, const std::set undo_locs; - BOOST_FOREACH(const map_location& loc, area_) { + for (const map_location& loc : area_) { if (mc.get_map().in_selection(loc)) { undo_locs.insert(loc); mc.add_changed_location(loc); @@ -89,7 +87,7 @@ editor_action* editor_action_deselect::perform(map_context& mc) const void editor_action_deselect::perform_without_undo(map_context& mc) const { - BOOST_FOREACH(const map_location& loc, area_) { + for (const map_location& loc : area_) { mc.get_map().remove_from_selection(loc); mc.add_changed_location(loc); } diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index 674a943f84c2..9294f4d4c6f0 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -54,7 +54,6 @@ #include "halo.hpp" #include -#include namespace { static std::vector saved_windows_; @@ -112,7 +111,7 @@ void editor_controller::init_gui() void editor_controller::init_tods(const config& game_config) { - BOOST_FOREACH(const config &schedule, game_config.child_range("editor_times")) { + for (const config &schedule : game_config.child_range("editor_times")) { const std::string& schedule_id = schedule["id"]; const std::string& schedule_name = schedule["name"]; @@ -132,7 +131,7 @@ void editor_controller::init_tods(const config& game_config) continue; } - BOOST_FOREACH(const config &time, schedule.child_range("time")) { + for (const config &time : schedule.child_range("time")) { times->second.second.push_back(time_of_day(time)); } @@ -149,8 +148,8 @@ void editor_controller::init_music(const config& game_config) if (!game_config.has_child(tag_name)) ERR_ED << "No editor music defined" << std::endl; else { - BOOST_FOREACH(const config& editor_music, game_config.child_range(tag_name)) { - BOOST_FOREACH(const config& music, editor_music.child_range("music")) { + for (const config& editor_music : game_config.child_range(tag_name)) { + for (const config& music : editor_music.child_range("music")) { sound::music_track track(music); if (track.file_path().empty()) WRN_ED << "Music track " << track.id() << " not found." << std::endl; @@ -1042,7 +1041,7 @@ void editor_controller::show_menu(const std::vector& items_arg, int if (!items.empty() && items.front() == "editor-playlist") { active_menu_ = editor::MUSIC; items.erase(items.begin()); - BOOST_FOREACH(const sound::music_track& track, music_tracks_) { + for (const sound::music_track& track : music_tracks_) { items.push_back(track.title().empty() ? track.id() : track.title()); } } diff --git a/src/editor/editor_preferences.cpp b/src/editor/editor_preferences.cpp index 86118bf1cad6..5e53172422b9 100644 --- a/src/editor/editor_preferences.cpp +++ b/src/editor/editor_preferences.cpp @@ -18,8 +18,6 @@ #include "serialization/string_utils.hpp" #include "util.hpp" -#include - namespace preferences { namespace editor { @@ -119,7 +117,7 @@ namespace editor { return mru; } - BOOST_FOREACH(const config& child, cfg.child_range("entry")) + for(const config& child : cfg.child_range("entry")) { const std::string& entry = child["path"].str(); if(!entry.empty()) { @@ -137,7 +135,7 @@ namespace editor { config cfg; unsigned n = 0; - BOOST_FOREACH(const std::string& entry, mru) + for(const std::string& entry : mru) { if(entry.empty()) { continue; diff --git a/src/editor/map/context_manager.cpp b/src/editor/map/context_manager.cpp index 4f9eb376ba3c..e5f9259f7632 100644 --- a/src/editor/map/context_manager.cpp +++ b/src/editor/map/context_manager.cpp @@ -41,8 +41,6 @@ #include "gui/dialogs/editor/edit_scenario.hpp" #include "gui/dialogs/editor/edit_side.hpp" -#include - #include "terrain/translation.hpp" #include "wml_separators.hpp" @@ -120,7 +118,7 @@ bool context_manager::is_active_transitions_hotkey(const std::string& item) { size_t context_manager::modified_maps(std::string& message) { std::vector modified; - BOOST_FOREACH(map_context* mc, map_contexts_) { + for (map_context* mc : map_contexts_) { if (mc->modified()) { if (!mc->get_filename().empty()) { modified.push_back(mc->get_filename()); @@ -129,7 +127,7 @@ size_t context_manager::modified_maps(std::string& message) { } } } - BOOST_FOREACH(std::string& str, modified) { + for (std::string& str : modified) { message += "\n" + std::string("• ") + str; } return modified.size(); @@ -155,10 +153,10 @@ context_manager::context_manager(editor_display& gui, const config& game_config) context_manager::~context_manager() { - BOOST_FOREACH(map_generator* m, map_generators_) { + for (map_generator* m : map_generators_) { delete m; } - BOOST_FOREACH(map_context* mc, map_contexts_) { + for (map_context* mc : map_contexts_) { delete mc; } @@ -334,7 +332,7 @@ void context_manager::expand_load_mru_menu(std::vector& items) continue; } - BOOST_FOREACH(std::string& path, mru) + for (std::string& path : mru) { // TODO: add proper leading ellipsization instead, since otherwise // it'll be impossible to tell apart files with identical names and @@ -417,7 +415,7 @@ void context_manager::expand_time_menu(std::vector& items) assert(tod_m != nullptr); - BOOST_FOREACH(const time_of_day& time, tod_m->times()) { + for (const time_of_day& time : tod_m->times()) { std::stringstream label; if (!time.image.empty()) @@ -441,7 +439,7 @@ void context_manager::expand_local_time_menu(std::vector& items) tod_manager* tod_m = get_map_context().get_time_manager(); - BOOST_FOREACH(const time_of_day& time, tod_m->times(get_map_context().get_active_area())) { + for (const time_of_day& time : tod_m->times(get_map_context().get_active_area())) { std::stringstream label; if (!time.image.empty()) @@ -532,7 +530,7 @@ void context_manager::refresh_after_action(bool drag_part) get_map_context().set_needs_terrain_rebuild(false); gui_.invalidate_all(); } else { - BOOST_FOREACH(const map_location& loc, changed_locs) { + for (const map_location& loc : changed_locs) { gui_.rebuild_terrain(loc); } gui_.invalidate(changed_locs); @@ -670,7 +668,7 @@ void context_manager::save_scenario_as_dialog() void context_manager::init_map_generators(const config& game_config) { - BOOST_FOREACH(const config &i, game_config.child_range("multiplayer")) { + for (const config &i : game_config.child_range("multiplayer")) { if (!i["map_generation"].empty() || !i["scenario_generation"].empty()) { @@ -745,7 +743,7 @@ void context_manager::create_default_context() map_context* mc = new map_context(editor_map(game_config_, 44, 33, default_terrain), gui_, true, default_schedule); add_map_context(mc); } else { - BOOST_FOREACH(const std::string& filename, saved_windows_) { + for (const std::string& filename : saved_windows_) { map_context* mc = new map_context(game_config_, filename, gui_); add_map_context(mc); } diff --git a/src/editor/map/editor_map.cpp b/src/editor/map/editor_map.cpp index eebeab76b055..164487646d45 100644 --- a/src/editor/map/editor_map.cpp +++ b/src/editor/map/editor_map.cpp @@ -25,7 +25,6 @@ #include "terrain/type_data.hpp" -#include #include #include @@ -113,7 +112,7 @@ void editor_map::sanity_check() ++errors; } } - BOOST_FOREACH(const map_location& loc, selection_) { + for (const map_location& loc : selection_) { if (!on_board_with_border(loc)) { ERR_ED << "Off-map tile in selection: " << loc << std::endl; } @@ -173,7 +172,7 @@ bool editor_map::add_to_selection(const map_location& loc) bool editor_map::set_selection(const std::set& area) { clear_selection(); - BOOST_FOREACH(const map_location& loc, area) { + for (const map_location& loc : area) { if (!add_to_selection(loc)) return false; } diff --git a/src/editor/map/map_context.cpp b/src/editor/map/map_context.cpp index ed000ea5923f..02f988ad1a46 100644 --- a/src/editor/map/map_context.cpp +++ b/src/editor/map/map_context.cpp @@ -35,7 +35,6 @@ #include "formula/string_utils.hpp" #include -#include namespace editor { @@ -289,31 +288,31 @@ void map_context::load_scenario(const config& game_config) labels_.read(scenario); tod_manager_.reset(new tod_manager(scenario)); - BOOST_FOREACH(const config &time_area, scenario.child_range("time_area")) { + for(const config &time_area : scenario.child_range("time_area")) { tod_manager_->add_time_area(map_,time_area); } - BOOST_FOREACH(const config& item, scenario.child_range("item")) { + for(const config& item : scenario.child_range("item")) { const map_location loc(item); overlays_.insert(std::pair(loc, overlay(item) )); } - BOOST_FOREACH(const config& music, scenario.child_range("music")) { + for(const config& music : scenario.child_range("music")) { music_tracks_.insert(std::pair(music["name"], sound::music_track(music))); } resources::teams = &teams_; int i = 1; - BOOST_FOREACH(config &side, scenario.child_range("side")) + for(config &side : scenario.child_range("side")) { team t; side["side"] = i; t.build(side, map_); teams_.push_back(t); - BOOST_FOREACH(config &a_unit, side.child_range("unit")) { + for(config &a_unit : side.child_range("unit")) { map_location loc(a_unit, nullptr); a_unit["side"] = i; units_.add(loc, unit(a_unit, true) ); @@ -370,7 +369,7 @@ void map_context::draw_terrain(const t_translation::t_terrain & terrain, t_translation::t_terrain full_terrain = one_layer_only ? terrain : map_.get_terrain_info(terrain).terrain_with_default_base(); - BOOST_FOREACH(const map_location& loc, locs) { + for(const map_location& loc : locs) { draw_terrain_actual(full_terrain, loc, one_layer_only); } } @@ -454,7 +453,7 @@ config map_context::to_config() item["team_name"] = it->second.team_name; } - BOOST_FOREACH(const music_map::value_type& track, music_tracks_) { + for(const music_map::value_type& track : music_tracks_) { track.second.write(scenario, true); } @@ -482,7 +481,7 @@ config map_context::to_config() side["gold"] = t->gold(); side["income"] = t->base_income(); - BOOST_FOREACH(const map_location& village, t->villages()) { + for(const map_location& village : t->villages()) { village.write(side.add_child("village")); } @@ -719,7 +718,7 @@ void map_context::trim_stack(action_stack& stack) void map_context::clear_stack(action_stack& stack) { - BOOST_FOREACH(editor_action* a, stack) { + for (editor_action* a : stack) { delete a; } stack.clear(); diff --git a/src/editor/map/map_fragment.cpp b/src/editor/map/map_fragment.cpp index fc8e60a6b9f3..c3fca94f1c17 100644 --- a/src/editor/map/map_fragment.cpp +++ b/src/editor/map/map_fragment.cpp @@ -17,8 +17,6 @@ #include "util.hpp" -#include - namespace editor { map_fragment::map_fragment() @@ -44,7 +42,7 @@ void map_fragment::add_tile(const gamemap& map, const map_location& loc) void map_fragment::add_tiles(const gamemap& map, const std::set& locs) { - BOOST_FOREACH(const map_location& loc, locs) { + for (const map_location& loc : locs) { add_tile(map, loc); } } @@ -57,7 +55,7 @@ std::set map_fragment::get_area() const std::set map_fragment::get_offset_area(const map_location& loc) const { std::set result; - BOOST_FOREACH(const tile_info& i, items_) { + for (const tile_info& i : items_) { result.insert(i.offset.vector_sum(loc)); } return result; @@ -65,14 +63,14 @@ std::set map_fragment::get_offset_area(const map_location& loc) co void map_fragment::paste_into(gamemap& map, const map_location& loc) const { - BOOST_FOREACH(const tile_info& i, items_) { + for (const tile_info& i : items_) { map.set_terrain(i.offset.vector_sum(loc), i.terrain); } } void map_fragment::shift(const map_location& offset) { - BOOST_FOREACH(tile_info& ti, items_) { + for (tile_info& ti : items_) { ti.offset.vector_sum_assign(offset); } } @@ -80,7 +78,7 @@ void map_fragment::shift(const map_location& offset) map_location map_fragment::center_of_mass() const { map_location sum(0, 0); - BOOST_FOREACH(const tile_info& ti, items_) { + for (const tile_info& ti : items_) { sum.vector_sum_assign(ti.offset); } if (items_.size() > 0) { @@ -94,7 +92,7 @@ void map_fragment::center_by_mass() { shift(center_of_mass().vector_negation()); area_.clear(); - BOOST_FOREACH(tile_info& ti, items_) { + for (tile_info& ti : items_) { area_.insert(ti.offset); } } @@ -102,7 +100,7 @@ void map_fragment::center_by_mass() void map_fragment::rotate_60_cw() { area_.clear(); - BOOST_FOREACH(tile_info& ti, items_) { + for (tile_info& ti : items_) { map_location l = map_location::ZERO(); int x = ti.offset.x; int y = ti.offset.y; @@ -122,7 +120,7 @@ void map_fragment::rotate_60_cw() void map_fragment::rotate_60_ccw() { area_.clear(); - BOOST_FOREACH(tile_info& ti, items_) { + for (tile_info& ti : items_) { map_location l = map_location::ZERO(); int x = ti.offset.x; int y = ti.offset.y; @@ -141,7 +139,7 @@ void map_fragment::rotate_60_ccw() void map_fragment::flip_horizontal() { - BOOST_FOREACH(tile_info& ti, items_) { + for (tile_info& ti : items_) { ti.offset.x = -ti.offset.x; } center_by_mass(); @@ -149,7 +147,7 @@ void map_fragment::flip_horizontal() void map_fragment::flip_vertical() { - BOOST_FOREACH(tile_info& ti, items_) { + for (tile_info& ti : items_) { ti.offset.y = -ti.offset.y; if (ti.offset.x % 2) { ti.offset.y--; @@ -168,11 +166,11 @@ std::string map_fragment::dump() const { std::stringstream ss; ss << "MF: "; - BOOST_FOREACH(const tile_info& ti, items_) { + for (const tile_info& ti : items_) { ss << "(" << ti.offset << ")"; } ss << " -- "; - BOOST_FOREACH(const map_location& loc, area_) { + for (const map_location& loc : area_) { ss << "(" << loc << ")"; } return ss.str(); diff --git a/src/editor/palette/editor_palettes.cpp b/src/editor/palette/editor_palettes.cpp index 82ed90f9dab4..b982b2730fdb 100644 --- a/src/editor/palette/editor_palettes.cpp +++ b/src/editor/palette/editor_palettes.cpp @@ -27,15 +27,13 @@ #include "wml_separators.hpp" -#include - namespace editor { template sdl_handler_vector editor_palette::handler_members() { sdl_handler_vector h; - BOOST_FOREACH(gui::widget& b, buttons_) { + for (gui::widget& b : buttons_) { h.push_back(&b); } return h; @@ -169,7 +167,7 @@ void editor_palette::set_group(const std::string& id) assert(!id.empty()); bool found = false; - BOOST_FOREACH(const item_group& group, groups_) { + for (const item_group& group : groups_) { if (group.id == id) { found = true; gui::button* palette_menu_button = gui_.find_menu_button("menu-editor-terrain"); diff --git a/src/editor/palette/editor_palettes.hpp b/src/editor/palette/editor_palettes.hpp index 0a5f4deaf95b..241680ab9c9b 100644 --- a/src/editor/palette/editor_palettes.hpp +++ b/src/editor/palette/editor_palettes.hpp @@ -19,8 +19,6 @@ #include "common_palette.hpp" #include "tristate_button.hpp" -#include - namespace editor { template @@ -135,7 +133,7 @@ class editor_palette : public common_palette { if (!hidden) help_handle_ = gui_.video().set_help_string(get_help_string()); else gui_.video().clear_help_string(help_handle_); - BOOST_FOREACH(gui::widget& w, buttons_) { + for (gui::widget& w : buttons_) { w.hide(hidden); } } diff --git a/src/editor/palette/item_palette.cpp b/src/editor/palette/item_palette.cpp index c49f9186036a..ecb0b19438d6 100644 --- a/src/editor/palette/item_palette.cpp +++ b/src/editor/palette/item_palette.cpp @@ -21,7 +21,6 @@ #include "item_palette.hpp" #include "gettext.hpp" -#include #include namespace editor { @@ -34,11 +33,11 @@ std::string item_palette::get_help_string() void item_palette::setup(const config& cfg) { - BOOST_FOREACH(const config& group, cfg.child_range("item_group")) { + for (const config& group : cfg.child_range("item_group")) { groups_.push_back(item_group(group)); - BOOST_FOREACH(const config& item, group.child_range("item")) { + for (const config& item : group.child_range("item")) { item_map_.insert(std::pair(item["id"], overlay(item))); group_map_[group["id"]].push_back(item["id"]); diff --git a/src/editor/palette/palette_manager.cpp b/src/editor/palette/palette_manager.cpp index c74e537f7aea..82280bf6563d 100644 --- a/src/editor/palette/palette_manager.cpp +++ b/src/editor/palette/palette_manager.cpp @@ -19,7 +19,6 @@ #include "tooltips.hpp" #include "editor/action/mouse/mouse_action.hpp" -#include namespace editor { @@ -144,7 +143,7 @@ void palette_manager::draw_contents() sdl_handler_vector palette_manager::handler_members() { //handler_vector h; -// BOOST_FOREACH(gui::widget& b, active_palette().get_widgets()) { +// for (gui::widget& b : active_palette().get_widgets()) { // h.push_back(&b); // } //return h; diff --git a/src/editor/palette/terrain_palettes.cpp b/src/editor/palette/terrain_palettes.cpp index 387ec8d96eb5..b34cf6496f5d 100644 --- a/src/editor/palette/terrain_palettes.cpp +++ b/src/editor/palette/terrain_palettes.cpp @@ -23,8 +23,6 @@ #include "gettext.hpp" #include "formula/string_utils.hpp" -#include - namespace { static t_translation::t_terrain fg_terrain; static t_translation::t_terrain bg_terrain; @@ -79,7 +77,7 @@ void terrain_palette::setup(const config& cfg) // Get the available groups and add them to the structure std::set group_names; - BOOST_FOREACH(const config &group, cfg.child_range("editor_group")) + for (const config &group : cfg.child_range("editor_group")) { if (group_names.find(group["id"]) == group_names.end()) { @@ -96,12 +94,12 @@ void terrain_palette::setup(const config& cfg) } std::map id_to_group; - BOOST_FOREACH(item_group& group, groups_) { + for (item_group& group : groups_) { id_to_group.insert(std::make_pair(group.id, &group)); } // add the groups for all terrains to the map - BOOST_FOREACH(const t_translation::t_terrain& t, items) { + for (const t_translation::t_terrain& t : items) { const terrain_type& t_info = map().get_terrain_info(t); DBG_ED << "Palette: processing terrain " << t_info.name() @@ -120,7 +118,7 @@ void terrain_palette::setup(const config& cfg) item_map_[get_id(t)] = t; - BOOST_FOREACH(const std::string& k, keys) { + for (const std::string& k : keys) { group_map_[k].push_back(get_id(t)); nmax_items_ = std::max(nmax_items_, group_map_[k].size()); std::map::iterator i = id_to_group.find(k); diff --git a/src/editor/palette/unit_palette.cpp b/src/editor/palette/unit_palette.cpp index 7a427c25cfaf..d83f64c489cc 100644 --- a/src/editor/palette/unit_palette.cpp +++ b/src/editor/palette/unit_palette.cpp @@ -24,8 +24,6 @@ #include "units/types.hpp" -#include - namespace editor { std::string unit_palette::get_help_string() { @@ -34,7 +32,7 @@ std::string unit_palette::get_help_string() { void unit_palette::setup(const config& /*cfg*/) { - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { if (i.second.do_not_list()) continue; @@ -52,7 +50,7 @@ void unit_palette::setup(const config& /*cfg*/) } } - BOOST_FOREACH(const race_map::value_type &i, unit_types.races()) + for (const race_map::value_type &i : unit_types.races()) { if (group_map_[i.second.id()].empty()) continue; diff --git a/src/editor/toolkit/brush.cpp b/src/editor/toolkit/brush.cpp index 29e6955ed24c..0d9334b33f01 100644 --- a/src/editor/toolkit/brush.cpp +++ b/src/editor/toolkit/brush.cpp @@ -18,8 +18,6 @@ #include "pathutils.hpp" -#include - namespace editor { /*WIKI @@ -74,11 +72,11 @@ brush::brush(const config& cfg) if (radius > 0) { std::vector in_radius; get_tiles_in_radius(map_location(0, 0), radius, in_radius); - BOOST_FOREACH(map_location& loc, in_radius) { + for (map_location& loc : in_radius) { add_relative_location(loc.x, loc.y); } } - BOOST_FOREACH(const config &relative, cfg.child_range("relative")) + for (const config &relative : cfg.child_range("relative")) { int x = relative["x"]; int y = relative["y"]; @@ -97,7 +95,7 @@ void brush::add_relative_location(int relative_x, int relative_y) std::set brush::project(const map_location& hotspot) const { std::set result; - BOOST_FOREACH(const map_location& relative, relative_tiles_) { + for (const map_location& relative : relative_tiles_) { result.insert(relative.vector_sum(hotspot)); } return result; diff --git a/src/editor/toolkit/editor_toolkit.cpp b/src/editor/toolkit/editor_toolkit.cpp index 33a3304ab26c..662b47b31f09 100644 --- a/src/editor/toolkit/editor_toolkit.cpp +++ b/src/editor/toolkit/editor_toolkit.cpp @@ -22,8 +22,6 @@ #include "editor/action/mouse/mouse_action_item.hpp" #include "editor/action/mouse/mouse_action_select.hpp" -#include - namespace editor { editor_toolkit::editor_toolkit(editor_display& gui, const CKey& key, @@ -44,7 +42,7 @@ editor_toolkit::editor_toolkit(editor_display& gui, const CKey& key, editor_toolkit::~editor_toolkit() { //TODO ask someone about that - //BOOST_FOREACH(const mouse_action_map::value_type a, mouse_actions_) { + //for (const mouse_action_map::value_type a : mouse_actions_) { // delete a.second; //} //delete palette_manager_.get(); @@ -52,7 +50,7 @@ editor_toolkit::~editor_toolkit() void editor_toolkit::init_brushes(const config& game_config) { - BOOST_FOREACH(const config &i, game_config.child_range("brush")) { + for (const config &i : game_config.child_range("brush")) { brushes_.push_back(brush(i)); } if (brushes_.empty()) { @@ -89,7 +87,7 @@ void editor_toolkit::init_mouse_actions(context_manager& cmanager) mouse_actions_.insert(std::make_pair(hotkey::HOTKEY_EDITOR_TOOL_ITEM, new mouse_action_item(key_, *palette_manager_->item_palette_.get()))); - BOOST_FOREACH(const theme::menu& menu, gui_.get_theme().menus()) { + for (const theme::menu& menu : gui_.get_theme().menus()) { if (menu.items().size() == 1) { hotkey::HOTKEY_COMMAND hk = hotkey::get_id(menu.items().front()); mouse_action_map::iterator i = mouse_actions_.find(hk); @@ -152,7 +150,7 @@ void editor_toolkit::clear_mouseover_overlay() void editor_toolkit::set_brush(std::string id) { - BOOST_FOREACH(brush& i, brushes_) { + for (brush& i : brushes_) { if (i.id() == id) { brush_ = &i; } diff --git a/src/filesystem_boost.cpp b/src/filesystem_boost.cpp index 39eb2242a36d..2e7b0e2d0876 100644 --- a/src/filesystem_boost.cpp +++ b/src/filesystem_boost.cpp @@ -25,7 +25,6 @@ #include #include -#include #include #include #include @@ -1002,7 +1001,7 @@ void binary_paths_manager::set_paths(const config& cfg) cleanup(); init_binary_paths(); - BOOST_FOREACH(const config &bp, cfg.child_range("binary_path")) + for (const config &bp : cfg.child_range("binary_path")) { std::string path = bp["path"].str(); if (path.find("..") != std::string::npos) { @@ -1076,7 +1075,7 @@ const std::vector& get_binary_paths(const std::string& type) init_binary_paths(); - BOOST_FOREACH(const std::string &path, binary_paths) + for(const std::string &path : binary_paths) { res.push_back(get_user_data_dir() + "/" + path + type + "/"); @@ -1109,7 +1108,7 @@ std::string get_binary_file_location(const std::string& type, const std::string& if (!is_legal_file(filename)) return std::string(); - BOOST_FOREACH(const std::string &bp, get_binary_paths(type)) + for(const std::string &bp : get_binary_paths(type)) { path bpath(bp); bpath /= filename; @@ -1129,7 +1128,7 @@ std::string get_binary_dir_location(const std::string &type, const std::string & if (!is_legal_file(filename)) return std::string(); - BOOST_FOREACH(const std::string &bp, get_binary_paths(type)) + for (const std::string &bp : get_binary_paths(type)) { path bpath(bp); bpath /= filename; diff --git a/src/font.cpp b/src/font.cpp index 99195429cbc6..a86c85fe550c 100644 --- a/src/font.cpp +++ b/src/font.cpp @@ -33,7 +33,6 @@ #include "serialization/unicode.hpp" #include "preferences.hpp" -#include #include #include @@ -413,12 +412,12 @@ void manager::init() const #endif #if CAIRO_HAS_WIN32_FONT - BOOST_FOREACH(const std::string& path, filesystem::get_binary_paths("fonts")) { + for(const std::string& path : filesystem::get_binary_paths("fonts")) { std::vector files; if(filesystem::is_directory(path)) { filesystem::get_files_in_dir(path, &files, nullptr, filesystem::ENTIRE_FILE_PATH); } - BOOST_FOREACH(const std::string& file, files) { + for(const std::string& file : files) { if(file.substr(file.length() - 4) == ".ttf" || file.substr(file.length() - 4) == ".ttc") { const std::wstring wfile = unicode_cast(file); @@ -436,11 +435,11 @@ void manager::deinit() const #endif #if CAIRO_HAS_WIN32_FONT - BOOST_FOREACH(const std::string& path, filesystem::get_binary_paths("fonts")) { + for(const std::string& path : filesystem::get_binary_paths("fonts")) { std::vector files; if(filesystem::is_directory(path)) filesystem::get_files_in_dir(path, &files, nullptr, filesystem::ENTIRE_FILE_PATH); - BOOST_FOREACH(const std::string& file, files) { + for(const std::string& file : files) { if(file.substr(file.length() - 4) == ".ttf" || file.substr(file.length() - 4) == ".ttc") { const std::wstring wfile = unicode_cast(file); @@ -487,7 +486,7 @@ font::subset_descriptor::subset_descriptor(const config & font) std::vector ranges = utils::split(font["codepoints"]); - BOOST_FOREACH(const std::string & i, ranges) { + for (const std::string & i : ranges) { std::vector r = utils::split(i, '-'); if(r.size() == 1) { size_t r1 = lexical_cast_default(r[0], 0); @@ -546,7 +545,7 @@ static void set_font_list(const std::vector& fontlist) italic_names.push_back(""); } - BOOST_FOREACH(const subset_descriptor::range &cp_range, itor->present_codepoints) { + for (const subset_descriptor::range &cp_range : itor->present_codepoints) { char_blocks.insert(cp_range.first, cp_range.second, subset); } } @@ -705,7 +704,7 @@ void text_surface::measure() const w_ = 0; h_ = 0; - BOOST_FOREACH(text_chunk const &chunk, chunks_) + for(text_chunk const &chunk : chunks_) { TTF_Font* ttfont = get_font(font_id(chunk.subset, font_size_, style_)); if(ttfont == nullptr) { @@ -751,7 +750,7 @@ std::vector const &text_surface::get_surfaces() const if(width() > max_text_line_width) return surfs_; - BOOST_FOREACH(text_chunk const &chunk, chunks_) + for(text_chunk const &chunk : chunks_) { TTF_Font* ttfont = get_font(font_id(chunk.subset, font_size_, style_)); @@ -1071,7 +1070,7 @@ bool load_font_config() return false; std::set known_fonts; - BOOST_FOREACH(const config &font, fonts_config.child_range("font")) { + for (const config &font : fonts_config.child_range("font")) { known_fonts.insert(font["name"]); if (font.has_attribute("bold_name")) { known_fonts.insert(font["bold_name"]); diff --git a/src/formula/formula.cpp b/src/formula/formula.cpp index b23f8da01255..6186396370fa 100644 --- a/src/formula/formula.cpp +++ b/src/formula/formula.cpp @@ -21,8 +21,6 @@ #include "random_new.hpp" #include "serialization/string_utils.hpp" -#include - namespace game_logic { @@ -123,7 +121,7 @@ class list_expression : public formula_expression { std::stringstream s; s << '['; bool first_item = true; - BOOST_FOREACH(expression_ptr a , items_) { + for(expression_ptr a : items_) { if (!first_item) { s << ','; } else { @@ -236,7 +234,7 @@ class string_callable : public formula_callable { return variant(string_.as_string().empty()); } else if(key == "char" || key == "chars") { std::vector chars; - BOOST_FOREACH(char c , string_.as_string()) { + for(char c : string_.as_string()) { chars.push_back(variant(std::string(1, c))); } return variant(&chars); @@ -255,7 +253,7 @@ class string_callable : public formula_callable { std::vector split = utils::parenthetical_split(string_.as_string(), ','); std::vector items; items.reserve(split.size()); - BOOST_FOREACH(const std::string s , split) { + for(const std::string s : split) { items.push_back(variant(s)); } return variant(&items); @@ -320,7 +318,7 @@ class map_callable : public formula_callable { } std::string key = key_variant.as_string(); bool valid = true; - BOOST_FOREACH(char c , key) { + for(char c : key) { if(!isalpha(c) && c != '_') { valid = false; break; @@ -603,7 +601,7 @@ class where_expression: public formula_expression { std::stringstream s; s << "{where:("; s << body_->str(); - BOOST_FOREACH(const expr_table::value_type &a, *clauses_) { + for(const expr_table::value_type &a : *clauses_) { s << ", [" << a.first << "] -> ["<< a.second->str()<<"]"; } s << ")}"; diff --git a/src/formula/function.cpp b/src/formula/function.cpp index c5f8eccfd309..ca5d5bec27a4 100644 --- a/src/formula/function.cpp +++ b/src/formula/function.cpp @@ -22,7 +22,6 @@ #include "game_config.hpp" #include "log.hpp" -#include #include using namespace boost::math::constants; @@ -46,7 +45,7 @@ std::string function_expression::str() const s << get_name(); s << '('; bool first_arg = true; - BOOST_FOREACH(expression_ptr a , args()) { + for (expression_ptr a : args()) { if (!first_arg) { s << ','; } else { @@ -510,7 +509,7 @@ class concatenate_function : public function_expression { variant execute(const formula_callable& variables, formula_debugger *fdb) const { std::string result; - BOOST_FOREACH(expression_ptr arg, args()) { + for(expression_ptr arg : args()) { result += arg->evaluate(variables, fdb).string_cast(); } @@ -1072,7 +1071,7 @@ class zip_function : public function_expression { } else { std::vector input; input.reserve(args().size()); - BOOST_FOREACH(expression_ptr expr, args()) { + for(expression_ptr expr : args()) { input.push_back(expr->evaluate(variables, fdb)); } return input; @@ -1501,7 +1500,7 @@ typedef std::map functions_map; struct functions_map_manager { functions_map map_; ~functions_map_manager() { - BOOST_FOREACH (functions_map::value_type & v, map_) { + for (functions_map::value_type & v : map_) { delete(v.second); } } diff --git a/src/game_board.cpp b/src/game_board.cpp index f3658402faeb..8c12258b45e1 100644 --- a/src/game_board.cpp +++ b/src/game_board.cpp @@ -21,7 +21,6 @@ #include "terrain/type_data.hpp" #include "units/unit.hpp" -#include #include #include @@ -68,7 +67,7 @@ game_board & game_board::operator= (game_board other) } void game_board::new_turn(int player_num) { - BOOST_FOREACH (unit & i, units_) { + for (unit & i : units_) { if (i.side() == player_num) { i.new_turn(); } @@ -76,7 +75,7 @@ void game_board::new_turn(int player_num) { } void game_board::end_turn(int player_num) { - BOOST_FOREACH (unit & i, units_) { + for (unit & i : units_) { if (i.side() == player_num) { i.end_turn(); } @@ -84,7 +83,7 @@ void game_board::end_turn(int player_num) { } void game_board::set_all_units_user_end_turn() { - BOOST_FOREACH (unit & i, units_) { + for (unit & i : units_) { i.set_user_end_turn(true); } } @@ -108,7 +107,7 @@ void game_board::check_victory(bool & continue_level, bool & found_player, bool not_defeated = std::set(); - BOOST_FOREACH( const unit & i , units()) + for (const unit & i : units()) { DBG_EE << "Found a unit: " << i.id() << " on side " << i.side() << std::endl; const team& tm = teams()[i.side()-1]; @@ -120,7 +119,7 @@ void game_board::check_victory(bool & continue_level, bool & found_player, bool } } - BOOST_FOREACH(team& tm, teams_) + for (team& tm : teams_) { if(tm.defeat_condition() == team::DEFEAT_CONDITION::NEVER) { @@ -237,7 +236,7 @@ bool game_board::team_is_defeated(const team& t) const case team::DEFEAT_CONDITION::NO_LEADER: return !units_.find_leader(t.side()).valid(); case team::DEFEAT_CONDITION::NO_UNITS: - BOOST_FOREACH(const unit& u, units_) + for (const unit& u : units_) { if(u.side() == t.side()) return false; @@ -332,7 +331,7 @@ bool game_board::change_terrain(const map_location &loc, const std::string &t_st map_->set_terrain(loc, new_t); - BOOST_FOREACH(const t_translation::t_terrain &ut, map_->underlying_union_terrain(loc)) { + for(const t_translation::t_terrain &ut : map_->underlying_union_terrain(loc)) { preferences::encountered_terrains().insert(ut); } return true; @@ -351,7 +350,7 @@ void game_board::write_config(config & cfg) const //current units { - BOOST_FOREACH(const unit & i, units_) { + for (const unit & i : units_) { if (i.side() == side_num) { config& u = side.add_child("unit"); i.get_location().write(u); @@ -361,7 +360,7 @@ void game_board::write_config(config & cfg) const } //recall list { - BOOST_FOREACH(const unit_const_ptr & j, t->recall_list()) { + for (const unit_const_ptr & j : t->recall_list()) { config& u = side.add_child("unit"); j->write(u); } diff --git a/src/game_config.cpp b/src/game_config.cpp index ffb5780dccca..6e61127289ac 100644 --- a/src/game_config.cpp +++ b/src/game_config.cpp @@ -27,8 +27,6 @@ #include "revision.h" #endif -#include - static lg::log_domain log_engine("engine"); #define DBG_NG LOG_STREAM(debug, log_engine) #define LOG_NG LOG_STREAM(info, log_engine) @@ -301,7 +299,7 @@ namespace game_config } server_list.clear(); - BOOST_FOREACH(const config &server, v.child_range("server")) + for (const config &server : v.child_range("server")) { server_info sinf; sinf.name = server["name"].str(); @@ -335,7 +333,7 @@ namespace game_config void add_color_info(const config &v) { - BOOST_FOREACH(const config &teamC, v.child_range("color_range")) + for (const config &teamC : v.child_range("color_range")) { const config::attribute_value *a1 = teamC.get("id"), *a2 = teamC.get("rgb"); @@ -362,9 +360,9 @@ namespace game_config team_rgb_colors.insert(std::make_pair(id,tp)); } - BOOST_FOREACH(const config &cp, v.child_range("color_palette")) + for (const config &cp : v.child_range("color_palette")) { - BOOST_FOREACH(const config::attribute &rgb, cp.attribute_range()) + for (const config::attribute &rgb : cp.attribute_range()) { std::vector temp; if(!string2rgb(rgb.second, temp)) { diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index 9132301b9348..dc8e2dd44ac1 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -35,7 +35,6 @@ #include "theme.hpp" #include "image.hpp" -#include #include static lg::log_domain log_config("config"); @@ -108,7 +107,7 @@ namespace { /// returns true if every define in special is also defined in general bool map_includes(const preproc_map& general, const preproc_map& special) { - BOOST_FOREACH(const preproc_map::value_type& pair, special) + for (const preproc_map::value_type& pair : special) { preproc_map::const_iterator it = general.find(pair.first); if (it == general.end() || it->second != pair.second) { @@ -176,7 +175,7 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, filesystem::get_files_in_dir(user_campaign_dir, &user_files, &user_dirs, filesystem::ENTIRE_FILE_PATH); } - BOOST_FOREACH(const std::string& umc, user_dirs) { + for (const std::string& umc : user_dirs) { const std::string cores_file = umc + "/cores.cfg"; if (filesystem::file_exists(cores_file)) { config cores; @@ -189,7 +188,7 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, config valid_cores; bool current_core_valid = false; std::string wml_tree_root; - BOOST_FOREACH(const config& core, cores_cfg.child_range("core")) { + for (const config& core : cores_cfg.child_range("core")) { const std::string& id = core["id"]; if (id.empty()) { @@ -274,10 +273,10 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, if (const config& campaign = game_config().find_child("campaign", "id", classification->campaign)) { const bool require_campaign = campaign["require_campaign"].to_bool(true); - BOOST_FOREACH(config& scenario, game_config_.child_range("scenario")) + for (config& scenario : game_config_.child_range("scenario")) { scenario["require_scenario"] = require_campaign; - BOOST_FOREACH(config& side, scenario.child_range("side")) + for (config& side : scenario.child_range("side")) { side["no_leader"] = side["no_leader"].to_bool(true); } @@ -352,7 +351,7 @@ void game_config_manager::load_addons_cfg() std::vector error_log; // Append the $user_campaign_dir/*.cfg files to addons_to_load. - BOOST_FOREACH(const std::string& uc, user_files) { + for(const std::string& uc : user_files) { const std::string file = uc; const int size_minus_extension = file.size() - 4; if(file.substr(size_minus_extension, file.size()) == ".cfg") { @@ -375,7 +374,7 @@ void game_config_manager::load_addons_cfg() filesystem::FILE_NAME_ONLY); // Append the $user_campaign_dir/*/_main.cfg files to addons_to_load. - BOOST_FOREACH(const std::string& uc, user_dirs) { + for (const std::string& uc : user_dirs) { const std::string addon_id = uc; const std::string addon_dir = user_campaign_dir + "/" + uc; @@ -408,7 +407,7 @@ void game_config_manager::load_addons_cfg() } // Load the addons. - BOOST_FOREACH(const addon_source & addon, addons_to_load) { + for (const addon_source & addon : addons_to_load) { try { // Load this addon from the cache, to a config config umc_cfg; @@ -419,7 +418,7 @@ void game_config_manager::load_addons_cfg() for (const char ** type = tags_with_addon_id; *type; type++) { - BOOST_FOREACH(config & cfg, umc_cfg.child_range(*type)) { + for (config & cfg : umc_cfg.child_range(*type)) { cfg["addon_id"] = addon.addon_id; // Note that this may reformat the string in a canonical form. cfg["addon_version"] = addon.version.str(); @@ -463,7 +462,7 @@ void game_config_manager::load_addons_cfg() void game_config_manager::set_multiplayer_hashes() { config& hashes = game_config_.add_child("multiplayer_hashes"); - BOOST_FOREACH(const config &ch, game_config_.child_range("multiplayer")) { + for (const config &ch : game_config_.child_range("multiplayer")) { hashes[ch["id"]] = ch.hash(); } } @@ -521,17 +520,13 @@ void game_config_manager::load_game_config_for_game( typedef boost::shared_ptr define; std::deque extra_defines; - BOOST_FOREACH(const std::string& extra_define, - classification.campaign_xtra_defines) { - define new_define - (new game_config::scoped_preproc_define(extra_define)); + for (const std::string& extra_define : classification.campaign_xtra_defines) { + define new_define(new game_config::scoped_preproc_define(extra_define)); extra_defines.push_back(new_define); } std::deque modification_defines; - BOOST_FOREACH(const std::string& mod_define, - classification.mod_defines) { - define new_define - (new game_config::scoped_preproc_define(mod_define, !mod_define.empty())); + for (const std::string& mod_define : classification.mod_defines) { + define new_define(new game_config::scoped_preproc_define(mod_define, !mod_define.empty())); modification_defines.push_back(new_define); } @@ -542,9 +537,8 @@ void game_config_manager::load_game_config_for_game( cache_.clear_defines(); std::deque previous_defines; - BOOST_FOREACH(const preproc_map::value_type& preproc, old_defines_map_) { - define new_define - (new game_config::scoped_preproc_define(preproc.first)); + for (const preproc_map::value_type& preproc : old_defines_map_) { + define new_define(new game_config::scoped_preproc_define(preproc.first)); previous_defines.push_back(new_define); } @@ -568,9 +562,8 @@ void game_config_manager::load_game_config_for_create(bool is_mp) cache_.clear_defines(); std::deque previous_defines; - BOOST_FOREACH(const preproc_map::value_type& preproc, old_defines_map_) { - define new_define - (new game_config::scoped_preproc_define(preproc.first)); + for (const preproc_map::value_type& preproc : old_defines_map_) { + define new_define(new game_config::scoped_preproc_define(preproc.first)); previous_defines.push_back(new_define); } diff --git a/src/game_display.cpp b/src/game_display.cpp index 8d8c6eb0fe76..b72792e120bb 100644 --- a/src/game_display.cpp +++ b/src/game_display.cpp @@ -45,7 +45,6 @@ #include "units/drawer.hpp" #include "whiteboard/manager.hpp" -#include #include static lg::log_domain log_display("display"); @@ -275,7 +274,7 @@ void game_display::draw_invalidated() unit_drawer drawer = unit_drawer(*this, energy_bar_rects_); - BOOST_FOREACH(const unit* temp_unit, *fake_unit_man_) { + for (const unit* temp_unit : *fake_unit_man_) { const map_location& loc = temp_unit->get_location(); exclusive_unit_draw_requests_t::iterator request = exclusive_unit_draw_requests_.find(loc); if (invalidated_.find(loc) != invalidated_.end() @@ -477,7 +476,7 @@ void game_display::draw_sidebar() // We display the unit the mouse is over if it is over a unit, // otherwise we display the unit that is selected. - BOOST_FOREACH(const std::string &name, reports_object_->report_list()) { + for (const std::string &name : reports_object_->report_list()) { refresh_report(name); } invalidateGameStatus_ = false; @@ -694,7 +693,7 @@ void game_display::highlight_reach(const pathfind::paths &paths_list) void game_display::highlight_another_reach(const pathfind::paths &paths_list) { // Fold endpoints of routes into reachability map. - BOOST_FOREACH(const pathfind::paths::step &dest, paths_list.destinations) { + for (const pathfind::paths::step &dest : paths_list.destinations) { reach_map_[dest.curr]++; } reach_map_changed_ = true; diff --git a/src/game_events/action_wml.cpp b/src/game_events/action_wml.cpp index 153318b6a507..c520724e262b 100644 --- a/src/game_events/action_wml.cpp +++ b/src/game_events/action_wml.cpp @@ -67,7 +67,6 @@ #include "wml_exception.hpp" #include "whiteboard/manager.hpp" -#include #include #include #include @@ -228,7 +227,7 @@ namespace { // Support functions t_filter.get_locations(locs, true); // Loop through sides. - BOOST_FOREACH(const int &side_num, sides) + for (const int &side_num : sides) { team &t = (*resources::teams)[side_num-1]; if ( !clear ) @@ -243,8 +242,9 @@ namespace { // Support functions t.add_fog_override(locs); else // Simply clear fog from the locations. - BOOST_FOREACH(const map_location &hex, locs) + for (const map_location &hex : locs) { t.clear_fog(hex); + } } // Flag a screen update. @@ -453,7 +453,7 @@ WML_HANDLER_FUNCTION(move_units_fake, cfg) size_t longest_path = 0; - BOOST_FOREACH(const vconfig& config, unit_cfgs) { + for (const vconfig& config : unit_cfgs) { const std::vector xvals = utils::split(config["x"]); const std::vector yvals = utils::split(config["y"]); int skip_steps = config["skip_steps"]; @@ -533,7 +533,7 @@ WML_HANDLER_FUNCTION(recall, cfg) const map_location cfg_loc = cfg_to_loc(cfg); /// @todo fendrin: comment this monster - BOOST_FOREACH(unit_map::const_unit_iterator leader, leaders) { + for (unit_map::const_unit_iterator leader : leaders) { DBG_NG << "...considering " + leader->id() + " as the recalling leader...\n"; map_location loc = cfg_loc; if ( lfilt(*leader) && @@ -909,7 +909,7 @@ WML_HANDLER_FUNCTION(set_variable, cfg) variable_access_const vi = resources::gamedata->get_variable_access_read(array_name); bool first = true; - BOOST_FOREACH(const config &cfg, vi.as_array()) + for (const config &cfg : vi.as_array()) { std::string current_string = cfg[key_name]; if (remove_empty && current_string.empty()) continue; @@ -942,7 +942,7 @@ WML_HANDLER_FUNCTION(set_variables, cfg) try { variable_access_const tovar = resources::gamedata->get_variable_access_read(cfg["to_variable"]); - BOOST_FOREACH(const config& c, tovar.as_array()) + for (const config& c : tovar.as_array()) { data.push_back(c); } @@ -953,7 +953,7 @@ WML_HANDLER_FUNCTION(set_variables, cfg) } } else { typedef std::pair vchild; - BOOST_FOREACH(const vchild& p, cfg.all_ordered()) { + for (const vchild& p : cfg.all_ordered()) { if(p.first == "value") { data.push_back(p.second.get_parsed_config()); } else if(p.first == "literal") { @@ -1003,7 +1003,7 @@ WML_HANDLER_FUNCTION(set_variables, cfg) { //merge children into one config merged_children; - BOOST_FOREACH(const config &cfg, data) { + for (const config &cfg : data) { merged_children.append(cfg); } data = boost::assign::list_of(merged_children).convert_to_container >(); @@ -1177,7 +1177,7 @@ WML_HANDLER_FUNCTION(tunnel, cfg) const bool remove = cfg["remove"].to_bool(false); if (remove) { const std::vector ids = utils::split(cfg["id"]); - BOOST_FOREACH(const std::string &id, ids) { + for (const std::string &id : ids) { resources::tunnels->remove(id); } } else if (cfg.get_children("source").empty() || diff --git a/src/game_events/conditional_wml.cpp b/src/game_events/conditional_wml.cpp index d130d585a91b..a05cc389c109 100644 --- a/src/game_events/conditional_wml.cpp +++ b/src/game_events/conditional_wml.cpp @@ -36,7 +36,6 @@ #include "util.hpp" #include "variable.hpp" -#include #include static lg::log_domain log_engine("engine"); @@ -72,7 +71,7 @@ namespace { // Support functions ? utils::parse_ranges((*u)["count"]) : default_counts; int match_count = 0; const unit_filter ufilt(*u, resources::filter_con); - BOOST_FOREACH(const unit &i, *resources::units) + for (const unit &i : *resources::units) { if ( i.hitpoints() > 0 && ufilt(i) ) { ++match_count; @@ -125,7 +124,7 @@ namespace { // Support functions // to see if the variable matches the conditions or not. const vconfig::child_list& variables = cond.get_children("variable"); - BOOST_FOREACH(const vconfig &values, variables) + for (const vconfig &values : variables) { const std::string name = values["name"]; config::attribute_value value = resources::gamedata->get_variable_const(name); diff --git a/src/game_events/handlers.cpp b/src/game_events/handlers.cpp index fc90a75d8357..d8437bd7da4c 100644 --- a/src/game_events/handlers.cpp +++ b/src/game_events/handlers.cpp @@ -34,7 +34,6 @@ #include "soundsource.hpp" #include "util.hpp" -#include #include #include diff --git a/src/game_events/manager.cpp b/src/game_events/manager.cpp index 96eaf02b87de..a304fddd85ed 100644 --- a/src/game_events/manager.cpp +++ b/src/game_events/manager.cpp @@ -32,7 +32,6 @@ #include "soundsource.hpp" #include "util.hpp" -#include #include #include @@ -72,10 +71,10 @@ manager::manager() void manager::read_scenario(const config& scenario_cfg) { - BOOST_FOREACH(const config &ev, scenario_cfg.child_range("event")) { + for(const config &ev : scenario_cfg.child_range("event")) { add_event_handler(ev); } - BOOST_FOREACH(const std::string &id, utils::split(scenario_cfg["unit_wml_ids"])) { + for(const std::string &id : utils::split(scenario_cfg["unit_wml_ids"])) { unit_wml_ids_.insert(id); } @@ -169,7 +168,7 @@ void manager::add_events(const config::const_child_itors &cfgs, const std::strin if(std::find(unit_wml_ids_.begin(),unit_wml_ids_.end(),type) != unit_wml_ids_.end()) return; unit_wml_ids_.insert(type); } - BOOST_FOREACH(const config &new_ev, cfgs) { + for(const config &new_ev : cfgs) { if(type.empty() && new_ev["id"].empty()) { WRN_NG << "attempt to add an [event] with empty id=, ignoring " << std::endl; @@ -181,7 +180,7 @@ void manager::add_events(const config::const_child_itors &cfgs, const std::strin void manager::write_events(config& cfg) { - BOOST_FOREACH(const handler_ptr &eh, *event_handlers_) { + for(const handler_ptr &eh : *event_handlers_) { if ( !eh || eh->is_menu_item() ) { continue; } diff --git a/src/game_events/manager_impl.cpp b/src/game_events/manager_impl.cpp index 183e7f203825..9196ea321f5b 100644 --- a/src/game_events/manager_impl.cpp +++ b/src/game_events/manager_impl.cpp @@ -29,7 +29,6 @@ #include "soundsource.hpp" #include "util.hpp" -#include #include #include @@ -50,7 +49,7 @@ namespace game_events { std::stringstream ss; - BOOST_FOREACH( const handler_ptr & h, active_ ) { + for (const handler_ptr & h : active_) { if ( !h ) continue; const config& cfg = h->get_config(); @@ -132,7 +131,7 @@ namespace game_events { dynamic_.push_back(new_handler); else { std::vector name_list = utils::split(name); - BOOST_FOREACH( const std::string & single_name, name_list ) + for (const std::string & single_name : name_list) by_name_[standardize_name(single_name)].push_back(new_handler); } // File by ID. diff --git a/src/game_events/pump.cpp b/src/game_events/pump.cpp index 810ed642873f..c8848f9cf7f3 100644 --- a/src/game_events/pump.cpp +++ b/src/game_events/pump.cpp @@ -39,7 +39,6 @@ #include "variable.hpp" #include "resources.hpp" -#include #include #include @@ -192,21 +191,21 @@ namespace { // Support functions unit_map::const_iterator unit2 = units->find(ev.loc2); vconfig filters(handler.get_config()); - BOOST_FOREACH(const vconfig &condition, filters.get_children("filter_condition")) + for (const vconfig &condition : filters.get_children("filter_condition")) { if (!conditional_passed(condition)) { return false; } } - BOOST_FOREACH(const vconfig &f, filters.get_children("filter_side")) + for (const vconfig &f : filters.get_children("filter_side")) { side_filter ssf(f, &resources::controller->gamestate()); if ( !ssf.match(resources::controller->current_side()) ) return false; } - BOOST_FOREACH(const vconfig &f, filters.get_children("filter")) + for (const vconfig &f : filters.get_children("filter")) { if ( !ev.loc1.matches_unit_filter(unit1, f) ) { return false; @@ -219,7 +218,7 @@ namespace { // Support functions { const bool matches_unit = ev.loc1.matches_unit(unit1); const config & attack = ev.data.child("first"); - BOOST_FOREACH(const vconfig &f, special_filters) + for (const vconfig &f : special_filters) { if ( f.empty() ) special_matches = true; @@ -234,7 +233,7 @@ namespace { // Support functions return false; } - BOOST_FOREACH(const vconfig &f, filters.get_children("filter_second")) + for (const vconfig &f : filters.get_children("filter_second")) { if ( !ev.loc2.matches_unit_filter(unit2, f) ) { return false; @@ -247,7 +246,7 @@ namespace { // Support functions { const bool matches_unit = ev.loc2.matches_unit(unit2); const config & attack = ev.data.child("second"); - BOOST_FOREACH(const vconfig &f, special_filters) + for (const vconfig &f : special_filters) { if ( f.empty() ) special_matches = true; @@ -508,7 +507,7 @@ bool t_pump::operator()() } if(!lg::debug().dont_log("event_handler")) { std::stringstream ss; - BOOST_FOREACH(const queued_event& ev, impl_->events_queue) { + for(const queued_event& ev : impl_->events_queue) { ss << "name=" << ev.name << "; "; } DBG_EH << "processing queued events: " << ss.str() << "\n"; diff --git a/src/game_events/wmi_container.cpp b/src/game_events/wmi_container.cpp index c8f7b2e90cfa..37d3ac1e9553 100644 --- a/src/game_events/wmi_container.cpp +++ b/src/game_events/wmi_container.cpp @@ -29,8 +29,6 @@ #include "log.hpp" #include "map/location.hpp" -#include - static lg::log_domain log_engine("engine"); #define WRN_NG LOG_STREAM(warn, log_engine) #define LOG_NG LOG_STREAM(info, log_engine) @@ -122,7 +120,7 @@ std::vector, std::string> > wmi scoped_xy_unit highlighted_unit("unit", hex.x, hex.y, units); // Check each menu item. - BOOST_FOREACH( const item_ptr & item, std::make_pair (start, finish) ) + for (const item_ptr & item : std::make_pair (start, finish)) { // Can this item be shown? if ( item->use_wml_menu() && (!item->is_synced() || resources::controller->can_use_synced_wml_menu()) && item->can_show(hex, gamedata, fc) ) @@ -151,7 +149,7 @@ void wmi_container::init_handlers() const unsigned wmi_count = 0; // Loop through each menu item. - BOOST_FOREACH( const item_ptr & wmi, *this ) { + for (const item_ptr & wmi : *this) { // If this menu item has a [command], add a handler for it. wmi->init_handler(); // Count the menu items (for the diagnostic message). @@ -167,7 +165,7 @@ void wmi_container::init_handlers() const void wmi_container::to_config(config& cfg) const { // Loop through our items. - BOOST_FOREACH( const item_ptr & item, *this ) + for (const item_ptr & item : *this) { // Add this item as a child of cfg. item->to_config(cfg.add_child("menu_item")); @@ -198,7 +196,7 @@ void wmi_container::set_item(const std::string& id, const vconfig& menu_item) void wmi_container::set_menu_items(const config& cfg) { wml_menu_items_.clear(); - BOOST_FOREACH(const config &item, cfg.child_range("menu_item")) + for (const config &item : cfg.child_range("menu_item")) { if(!item.has_attribute("id")){ continue; } diff --git a/src/game_initialization/configure_engine.cpp b/src/game_initialization/configure_engine.cpp index d0503e7a21d9..5e8c28909c89 100644 --- a/src/game_initialization/configure_engine.cpp +++ b/src/game_initialization/configure_engine.cpp @@ -5,7 +5,6 @@ #include "settings.hpp" #include "tod_manager.hpp" -#include #include #include #include @@ -28,7 +27,7 @@ configure_engine::configure_engine(saved_game& state) : set_use_map_settings(use_map_settings_default()); if(state_.classification().get_tagname() == "scenario") { - BOOST_FOREACH(const config& scenario, + for (const config& scenario : game_config_manager::get()->game_config().child_range(state_.classification().get_tagname())) { if (scenario["allow_new_game"].to_bool(true) || game_config::debug) { @@ -216,7 +215,7 @@ void configure_engine::write_parameters() scenario["experience_modifier"] = params.xp_modifier; scenario["turns"] = params.num_turns; - BOOST_FOREACH(config& side, scenario.child_range("side")) + for (config& side : scenario.child_range("side")) { side["fog"] = params.fog_game; side["shroud"] = params.shroud_game; diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index 6544e38ca0a2..35047fda5d98 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -26,7 +26,6 @@ #include "playcampaign.hpp" #include "tod_manager.hpp" #include "multiplayer_ui.hpp" // For get_color_string -#include #include #include #include @@ -113,7 +112,7 @@ connect_engine::connect_engine(saved_game& state, std::vector original_team_names; std::string team_prefix(std::string(_("Team")) + " "); int side_count = 1; - BOOST_FOREACH(config& side, sides) { + for (config& side : sides) { const std::string side_str = std::to_string(side_count); config::attribute_value& team_name = side["team_name"]; config::attribute_value& user_team_name = @@ -170,8 +169,7 @@ connect_engine::connect_engine(saved_game& state, } // Selected era's factions. - BOOST_FOREACH(const config& era, - level_.child("era").child_range("multiplayer_side")) { + for (const config& era : level_.child("era").child_range("multiplayer_side")) { era_factions_.push_back(&era); } @@ -179,7 +177,7 @@ connect_engine::connect_engine(saved_game& state, game_config::add_color_info(scenario()); // Create side engines. int index = 0; - BOOST_FOREACH(const config &s, sides) { + for (const config &s : sides) { side_engine_ptr new_side_engine(new side_engine(s, *this, index)); side_engines_.push_back(new_side_engine); @@ -244,7 +242,7 @@ void connect_engine::import_user(const config& data, const bool observer, } // Check if user has a side(s) reserved for him. - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (side->reserved_for() == username && side->player_id().empty() && side->controller() != CNTR_COMPUTER) { side->place_user(data); @@ -255,7 +253,7 @@ void connect_engine::import_user(const config& data, const bool observer, // If no sides were assigned for a user, // take a first available side. if (side_taken < 0 && !side_assigned) { - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (side->available_for_user(username) || side->controller() == CNTR_LOCAL) { side->place_user(data); @@ -268,9 +266,9 @@ void connect_engine::import_user(const config& data, const bool observer, // Check if user has taken any sides, which should get control // over any other sides. - BOOST_FOREACH(side_engine_ptr user_side, side_engines_) { + for (side_engine_ptr user_side : side_engines_) { if(user_side->player_id() == username && !user_side->previous_save_id().empty()) { - BOOST_FOREACH(side_engine_ptr side, side_engines_){ + for (side_engine_ptr side : side_engines_){ if(side->player_id().empty() && side->previous_save_id() == user_side->previous_save_id()) { side->place_user(data); } @@ -281,7 +279,7 @@ void connect_engine::import_user(const config& data, const bool observer, bool connect_engine::sides_available() const { - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (side->available_for_user()) { return true; } @@ -296,7 +294,7 @@ void connect_engine::update_level() scenario().clear_children("side"); - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { scenario().add_child("side", side->new_config()); } } @@ -321,7 +319,7 @@ bool connect_engine::can_start_game() const } // First check if all sides are ready to start the game. - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (!side->ready_for_start()) { const int side_num = side->index() + 1; DBG_MP << "not all sides are ready, side " << @@ -339,7 +337,7 @@ bool connect_engine::can_start_game() const * creative in what is used in multiplayer [1] so use a simpler test now. * [1] http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=568029 */ - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (side->controller() != CNTR_EMPTY && side->allow_player()) { return true; } @@ -363,22 +361,24 @@ std::multimap side_engine::get_side_children() { std::multimap children; - BOOST_FOREACH(const std::string& children_to_swap, get_children_to_swap()) - BOOST_FOREACH(const config& child, cfg_.child_range(children_to_swap)) + for (const std::string& children_to_swap : get_children_to_swap()) { + for (const config& child : cfg_.child_range(children_to_swap)) { children.insert(std::pair(children_to_swap, child)); + } + } return children; } void side_engine::set_side_children(std::multimap children) { - BOOST_FOREACH(const std::string& children_to_remove, get_children_to_swap()) - cfg_.clear_children(children_to_remove); - - std::pair child_map; + for (const std::string& children_to_remove : get_children_to_swap()) { + cfg_.clear_children(children_to_remove); + } - BOOST_FOREACH(child_map, children) - cfg_.add_child(child_map.first, child_map.second); + for (std::pair child_map : children) { + cfg_.add_child(child_map.first, child_map.second); + } } @@ -389,12 +389,12 @@ void connect_engine::start_game() // Resolves the "random faction", "random gender" and "random message" // Must be done before shuffle sides, or some cases will cause errors rand_rng::mt_rng rng; // Make an RNG for all the shuffling and random faction operations - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { std::vector avoid_faction_ids; // If we aren't resolving random factions independently at random, calculate which factions should not appear for this side. if (params_.random_faction_mode != mp_game_settings::RANDOM_FACTION_MODE::DEFAULT) { - BOOST_FOREACH(side_engine_ptr side2, side_engines_) { + for (side_engine_ptr side2 : side_engines_) { if (!side2->flg().is_random_faction()) { switch(params_.random_faction_mode.v) { case mp_game_settings::RANDOM_FACTION_MODE::NO_MIRROR: @@ -420,7 +420,7 @@ void connect_engine::start_game() // Only playable sides should be shuffled. std::vector playable_sides; - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (side->allow_player() && side->allow_shuffle()) { playable_sides.push_back(side->index()); } @@ -481,13 +481,12 @@ void connect_engine::start_game_commandline( rand_rng::mt_rng rng; unsigned num = 0; - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { num++; // Set the faction, if commandline option is given. if (cmdline_opts.multiplayer_side) { - BOOST_FOREACH(const mp_option& option, - *cmdline_opts.multiplayer_side) { + for (const mp_option& option : *cmdline_opts.multiplayer_side) { if (option.get<0>() == num) { DBG_MP << "\tsetting side " << option.get<0>() << @@ -500,8 +499,7 @@ void connect_engine::start_game_commandline( // Set the controller, if commandline option is given. if (cmdline_opts.multiplayer_controller) { - BOOST_FOREACH(const mp_option& option, - *cmdline_opts.multiplayer_controller) { + for (const mp_option& option : *cmdline_opts.multiplayer_controller) { if (option.get<0>() == num) { DBG_MP << "\tsetting side " << option.get<0>() << @@ -516,8 +514,7 @@ void connect_engine::start_game_commandline( // then override if commandline option was given. side->set_ai_algorithm("ai_default_rca"); if (cmdline_opts.multiplayer_algorithm) { - BOOST_FOREACH(const mp_option& option, - *cmdline_opts.multiplayer_algorithm) { + for (const mp_option& option : *cmdline_opts.multiplayer_algorithm) { if (option.get<0>() == num) { DBG_MP << "\tsetting side " << option.get<0>() << @@ -542,11 +539,10 @@ void connect_engine::start_game_commandline( scenario()["turns"] = *cmdline_opts.multiplayer_turns; } - BOOST_FOREACH(config &side, scenario().child_range("side")) + for (config &side : scenario().child_range("side")) { if (cmdline_opts.multiplayer_ai_config) { - BOOST_FOREACH(const mp_option& option, - *cmdline_opts.multiplayer_ai_config) { + for (const mp_option& option : *cmdline_opts.multiplayer_ai_config) { if (option.get<0>() == side["side"].to_unsigned()) { DBG_MP << "\tsetting side " << side["side"] << @@ -570,8 +566,7 @@ void connect_engine::start_game_commandline( mp_parameter; if (cmdline_opts.multiplayer_parm) { - BOOST_FOREACH(const mp_parameter& parameter, - *cmdline_opts.multiplayer_parm) { + for (const mp_parameter& parameter : *cmdline_opts.multiplayer_parm) { if (parameter.get<0>() == side["side"].to_unsigned()) { DBG_MP << "\tsetting side " << side["side"] << " " << @@ -662,7 +657,7 @@ std::pair connect_engine::process_network_data(const config& data, // This side is already taken. // Try to reassing the player to a different position. side_taken = 0; - BOOST_FOREACH(side_engine_ptr s, side_engines_) { + for (side_engine_ptr s : side_engines_) { if (s->available_for_user()) { break; } @@ -753,7 +748,7 @@ void connect_engine::process_network_error(network::error& error) int connect_engine::find_user_side_index_by_id(const std::string& id) const { size_t i = 0; - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { if (side->player_id() == id) { break; } @@ -793,7 +788,7 @@ void connect_engine::save_reserved_sides_information() // N.B. This information is needed only for a host player. std::map side_users = utils::map_split(level_.child_or_empty("multiplayer")["side_users"]); - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { const std::string& save_id = side->save_id(); const std::string& player_id = side->player_id(); if (!save_id.empty() && !player_id.empty()) { @@ -808,7 +803,7 @@ void connect_engine::load_previous_sides_users() std::map side_users = utils::map_split(level_.child("multiplayer")["side_users"]); std::set names; - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { const std::string& save_id = side->previous_save_id(); if (side_users.find(save_id) != side_users.end()) { side->set_reserved_for(side_users[save_id]); @@ -822,7 +817,7 @@ void connect_engine::load_previous_sides_users() } } //Do this in an extra loop to make sure we import each user only once. - BOOST_FOREACH(const std::string& name, names) + for (const std::string& name : names) { if (connected_users().find(name) != connected_users().end() || !campaign_info_) { import_user(name, false); @@ -832,7 +827,7 @@ void connect_engine::load_previous_sides_users() void connect_engine::update_side_controller_options() { - BOOST_FOREACH(side_engine_ptr side, side_engines_) { + for (side_engine_ptr side : side_engines_) { side->update_controller_options(); } } @@ -924,7 +919,7 @@ side_engine::side_engine(const config& cfg, connect_engine& parent_engine, // Initialize team and color. unsigned team_name_index = 0; - BOOST_FOREACH(const std::string& name, parent_.team_names_) { + for (const std::string& name : parent_.team_names_) { if (name == cfg["team_name"]) { break; } @@ -1064,7 +1059,7 @@ config side_engine::new_config() const // and gender values for it. config* leader = &res; if (flg_.default_leader_cfg() != nullptr) { - BOOST_FOREACH(config& side_unit, res.child_range("unit")) { + for (config& side_unit : res.child_range("unit")) { if (*flg_.default_leader_cfg() == side_unit) { leader = &side_unit; if (flg_.current_leader() != (*leader)["type"]) { @@ -1095,7 +1090,7 @@ config side_engine::new_config() const if (parent_.params_.use_map_settings && !parent_.params_.saved_game) { config trimmed = cfg_; - BOOST_FOREACH(const std::string& attribute, attributes_to_trim) { + for (const std::string& attribute : attributes_to_trim) { trimmed.remove_attribute(attribute); } @@ -1259,7 +1254,7 @@ void side_engine::update_controller_options() // Connected users. add_controller_option(CNTR_LAST, _("--give--"), "human"); - BOOST_FOREACH(const std::string& user, parent_.connected_users()) { + for (const std::string& user : parent_.connected_users()) { add_controller_option(parent_.default_controller_, user, "human"); } @@ -1269,7 +1264,7 @@ void side_engine::update_controller_options() void side_engine::update_current_controller_index() { int i = 0; - BOOST_FOREACH(const controller_option& option, controller_options_) { + for (const controller_option& option : controller_options_) { if (option.first == controller_) { current_controller_index_ = i; diff --git a/src/game_initialization/create_engine.cpp b/src/game_initialization/create_engine.cpp index 213e6c1b3f70..c3d138d34c9a 100644 --- a/src/game_initialization/create_engine.cpp +++ b/src/game_initialization/create_engine.cpp @@ -35,7 +35,6 @@ #include "serialization/preprocessor.hpp" #include "serialization/parser.hpp" -#include #include #include @@ -215,7 +214,7 @@ void scenario::set_sides() } num_players_ = 0; - BOOST_FOREACH(const config &scenario, data_.child_range("side")) { + for (const config &scenario : data_.child_range("side")) { if (scenario["allow_player"].to_bool(true)) { ++num_players_; } @@ -436,7 +435,7 @@ create_engine::create_engine(CVideo& v, saved_game& state) : state_.mp_settings().saved_game = false; - BOOST_FOREACH (const std::string& str, preferences::modifications(state_.classification().campaign_type == + for (const std::string& str : preferences::modifications(state_.classification().campaign_type == game_classification::CAMPAIGN_TYPE::MULTIPLAYER)) { if (game_config_manager::get()-> game_config().find_child("modification", "id", str)) @@ -522,7 +521,7 @@ void create_engine::prepare_for_era_and_mods() state_.classification().era_define = game_config_manager::get()->game_config().find_child( "era", "id", get_parameters().mp_era)["define"].str(); - BOOST_FOREACH(const std::string& mod_id, get_parameters().active_mods) { + for (const std::string& mod_id : get_parameters().active_mods) { state_.classification().mod_defines.push_back( game_config_manager::get()->game_config().find_child( "modification", "id", mod_id)["define"].str()); @@ -584,7 +583,7 @@ std::string create_engine::select_campaign_difficulty(int set_value) // Verify the existence of difficulties std::vector difficulties; - BOOST_FOREACH(const config &d, current_level().data().child_range("difficulty")) + for (const config &d : current_level().data().child_range("difficulty")) { difficulties.push_back(d["define"]); } @@ -705,7 +704,7 @@ std::vector create_engine::levels_menu_item_names() const { std::vector menu_names; - BOOST_FOREACH(level_ptr level, get_levels_by_type(current_level_type_)) { + for (level_ptr level : get_levels_by_type(current_level_type_)) { menu_names.push_back(IMAGE_PREFIX + level->icon() + IMG_TEXT_SEPARATOR + level->name() + HELP_STRING_SEPARATOR + level->name()); } @@ -718,8 +717,7 @@ std::vector create_engine::extras_menu_item_names( { std::vector names; - BOOST_FOREACH(extras_metadata_ptr extra, - get_const_extras_by_type(extra_type)) { + for (extras_metadata_ptr extra : get_const_extras_by_type(extra_type)) { if (escape_markup) { names.push_back(font::NULL_MARKUP + extra->name); } else { @@ -860,7 +858,7 @@ void create_engine::generator_user_config(CVideo& v) int create_engine::find_level_by_id(const std::string& id) const { int i = 0; - BOOST_FOREACH(user_map_ptr user_map, user_maps_) { + for (user_map_ptr user_map : user_maps_) { if (user_map->id() == id) { return i; } @@ -868,7 +866,7 @@ int create_engine::find_level_by_id(const std::string& id) const } i = 0; - BOOST_FOREACH(random_map_ptr random_map, random_maps_) { + for (random_map_ptr random_map : random_maps_) { if (random_map->id() == id) { return i; } @@ -876,7 +874,7 @@ int create_engine::find_level_by_id(const std::string& id) const } i = 0; - BOOST_FOREACH(scenario_ptr scenario, scenarios_) { + for (scenario_ptr scenario : scenarios_) { if (scenario->id() == id) { return i; } @@ -884,7 +882,7 @@ int create_engine::find_level_by_id(const std::string& id) const } i = 0; - BOOST_FOREACH(scenario_ptr scenario, user_scenarios_) { + for (scenario_ptr scenario : user_scenarios_) { if (scenario->id() == id) { return i; } @@ -892,7 +890,7 @@ int create_engine::find_level_by_id(const std::string& id) const } i = 0; - BOOST_FOREACH(campaign_ptr campaign, campaigns_) { + for (campaign_ptr campaign : campaigns_) { if (campaign->id() == id) { return i; } @@ -900,7 +898,7 @@ int create_engine::find_level_by_id(const std::string& id) const } i = 0; - BOOST_FOREACH(campaign_ptr sp_campaign, sp_campaigns_) { + for (campaign_ptr sp_campaign : sp_campaigns_) { if (sp_campaign->id() == id) { return i; } @@ -914,8 +912,7 @@ int create_engine::find_extra_by_id(const MP_EXTRA extra_type, const std::string& id) const { int i = 0; - BOOST_FOREACH(extras_metadata_ptr extra, - get_const_extras_by_type(extra_type)) { + for (extras_metadata_ptr extra : get_const_extras_by_type(extra_type)) { if (extra->id == id) { return i; } @@ -927,27 +924,27 @@ int create_engine::find_extra_by_id(const MP_EXTRA extra_type, level::TYPE create_engine::find_level_type_by_id(const std::string& id) const { - BOOST_FOREACH(user_map_ptr user_map, user_maps_) { + for (user_map_ptr user_map : user_maps_) { if (user_map->id() == id) { return level::TYPE::USER_MAP; } } - BOOST_FOREACH(random_map_ptr random_map, random_maps_) { + for (random_map_ptr random_map : random_maps_) { if (random_map->id() == id) { return level::TYPE::RANDOM_MAP; } } - BOOST_FOREACH(scenario_ptr scenario, scenarios_) { + for (scenario_ptr scenario : scenarios_) { if (scenario->id() == id) { return level::TYPE::SCENARIO; } } - BOOST_FOREACH(scenario_ptr scenario, user_scenarios_) { + for (scenario_ptr scenario : user_scenarios_) { if (scenario->id() == id) { return level::TYPE::USER_SCENARIO; } } - BOOST_FOREACH(campaign_ptr campaign, campaigns_) { + for (campaign_ptr campaign : campaigns_) { if (campaign->id() == id) { return level::TYPE::CAMPAIGN; } @@ -1057,8 +1054,7 @@ void create_engine::init_all_levels() } // Stand-alone scenarios. - BOOST_FOREACH(const config &data, - game_config_manager::get()->game_config().child_range("multiplayer")) + for (const config &data : game_config_manager::get()->game_config().child_range("multiplayer")) { if (!data["allow_new_game"].to_bool(true)) continue; @@ -1078,8 +1074,7 @@ void create_engine::init_all_levels() } // Campaigns. - BOOST_FOREACH(const config &data, - game_config_manager::get()->game_config().child_range("campaign")) + for (const config &data : game_config_manager::get()->game_config().child_range("campaign")) { const std::string& type = data["type"]; bool mp = state_.classification().campaign_type == game_classification::CAMPAIGN_TYPE::MULTIPLAYER; @@ -1106,7 +1101,7 @@ void create_engine::init_extras(const MP_EXTRA extra_type) std::vector& extras = get_extras_by_type(extra_type); const std::string extra_name = (extra_type == ERA) ? "era" : "modification"; ng::depcheck::component_availabilty default_availabilty = (extra_type == ERA) ? ng::depcheck::component_availabilty::MP : ng::depcheck::component_availabilty::HYBRID; - BOOST_FOREACH(const config &extra, game_config_manager::get()->game_config().child_range(extra_name)) + for (const config &extra : game_config_manager::get()->game_config().child_range(extra_name)) { ng::depcheck::component_availabilty type = extra["type"].to_enum(default_availabilty); bool mp = state_.classification().campaign_type == game_classification::CAMPAIGN_TYPE::MULTIPLAYER; @@ -1189,32 +1184,32 @@ std::vector std::vector levels; switch (type.v) { case level::TYPE::SCENARIO: - BOOST_FOREACH(level_ptr level, scenarios_) { + for (level_ptr level : scenarios_) { levels.push_back(level); } break; case level::TYPE::USER_MAP: - BOOST_FOREACH(level_ptr level, user_maps_) { + for (level_ptr level : user_maps_) { levels.push_back(level); } break; case level::TYPE::USER_SCENARIO: - BOOST_FOREACH(level_ptr level, user_scenarios_) { + for (level_ptr level : user_scenarios_) { levels.push_back(level); } break; case level::TYPE::RANDOM_MAP: - BOOST_FOREACH(level_ptr level, random_maps_) { + for (level_ptr level : random_maps_) { levels.push_back(level); } break; case level::TYPE::CAMPAIGN: - BOOST_FOREACH(level_ptr level, campaigns_) { + for (level_ptr level : campaigns_) { levels.push_back(level); } break; case level::TYPE::SP_CAMPAIGN: - BOOST_FOREACH(level_ptr level, sp_campaigns_) { + for (level_ptr level : sp_campaigns_) { levels.push_back(level); } break; @@ -1228,32 +1223,32 @@ std::vector create_engine::get_levels_by_type(level::T std::vector levels; switch (type.v) { case level::TYPE::SCENARIO: - BOOST_FOREACH(size_t level, scenarios_filtered_) { + for (size_t level : scenarios_filtered_) { levels.push_back(scenarios_[level]); } break; case level::TYPE::USER_MAP: - BOOST_FOREACH(size_t level, user_maps_filtered_) { + for (size_t level : user_maps_filtered_) { levels.push_back(user_maps_[level]); } break; case level::TYPE::USER_SCENARIO: - BOOST_FOREACH(size_t level, user_scenarios_filtered_) { + for (size_t level : user_scenarios_filtered_) { levels.push_back(user_scenarios_[level]); } break; case level::TYPE::RANDOM_MAP: - BOOST_FOREACH(size_t level, random_maps_filtered_) { + for (size_t level : random_maps_filtered_) { levels.push_back(random_maps_[level]); } break; case level::TYPE::CAMPAIGN: - BOOST_FOREACH(size_t level, campaigns_filtered_) { + for (size_t level : campaigns_filtered_) { levels.push_back(campaigns_[level]); } break; case level::TYPE::SP_CAMPAIGN: - BOOST_FOREACH(size_t level, sp_campaigns_filtered_) { + for (size_t level : sp_campaigns_filtered_) { levels.push_back(sp_campaigns_[level]); } break; diff --git a/src/game_initialization/flg_manager.cpp b/src/game_initialization/flg_manager.cpp index 1975cb1af8a2..c0bad0501755 100644 --- a/src/game_initialization/flg_manager.cpp +++ b/src/game_initialization/flg_manager.cpp @@ -21,8 +21,6 @@ #include "wml_separators.hpp" #include "log.hpp" -#include - static lg::log_domain log_mp_connect_engine("mp/connect/engine"); #define DBG_MP LOG_STREAM(debug, log_mp_connect_engine) #define LOG_MP LOG_STREAM(info, log_mp_connect_engine) @@ -80,7 +78,7 @@ flg_manager::flg_manager(const std::vector& era_factions, } } else if (default_leader_type_.empty()) { // Find a unit which can recruit. - BOOST_FOREACH(const config& side_unit, side_.child_range("unit")) { + for (const config& side_unit : side_.child_range("unit")) { if (side_unit["canrecruit"].to_bool()) { default_leader_type_ = side_unit["type"].str(); default_leader_gender_ = side_unit["gender"].str(); @@ -119,7 +117,7 @@ void flg_manager::set_current_faction(const unsigned index) void flg_manager::set_current_faction(const std::string& id) { unsigned index = 0; - BOOST_FOREACH(const config* faction, choosable_factions_) { + for (const config* faction : choosable_factions_) { if ((*faction)["id"] == id) { set_current_faction(index); return; @@ -148,7 +146,7 @@ void flg_manager::set_current_gender(const unsigned index) void flg_manager::reset_leader_combo(gui::combo& combo_leader, const std::string& color) const { std::vector leaders; - BOOST_FOREACH(const std::string& leader, choosable_leaders_) { + for (const std::string& leader : choosable_leaders_) { const unit_type* unit = unit_types.find(leader); if (unit) { leaders.push_back(IMAGE_PREFIX + unit->image() + @@ -175,7 +173,7 @@ void flg_manager::reset_gender_combo(gui::combo& combo_gender, const std::string const unit_type* unit = unit_types.find(current_leader_); std::vector genders; - BOOST_FOREACH(const std::string& gender, choosable_genders_) { + for (const std::string& gender : choosable_genders_) { if (gender == unit_race::s_female || gender == unit_race::s_male) { if (unit) { const unit_type& gender_unit = @@ -236,7 +234,7 @@ void flg_manager::resolve_random(rand_rng::mt_rng & rng, const std::vector nonrandom_sides; std::vector fallback_nonrandom_sides; int num = -1; - BOOST_FOREACH(const config* i, available_factions_) { + for (const config* i : available_factions_) { ++num; if (!(*i)["random_faction"].to_bool()) { const std::string& faction_id = (*i)["id"]; @@ -285,7 +283,7 @@ void flg_manager::resolve_random(rand_rng::mt_rng & rng, const std::vector nonrandom_leaders = utils::split((*current_faction_)["random_leader"]); if (nonrandom_leaders.empty()) { - BOOST_FOREACH(const std::string& leader, available_leaders_) { + for (const std::string& leader : available_leaders_) { if (leader != "random") { nonrandom_leaders.push_back(leader); } @@ -312,7 +310,7 @@ void flg_manager::resolve_random(rand_rng::mt_rng & rng, const std::vector nonrandom_genders; - BOOST_FOREACH(const std::string& gender, available_genders_) { + for (const std::string& gender : available_genders_) { if (gender != "random") { nonrandom_genders.push_back(gender); } @@ -335,7 +333,7 @@ void flg_manager::update_available_factions() const config* custom_faction = nullptr; const bool show_custom_faction = side_["faction"] == "Custom" || !has_no_recruits_ || faction_lock_; - BOOST_FOREACH(const config* faction, era_factions_) { + for (const config* faction : era_factions_) { if ((*faction)["id"] == "Custom" && !show_custom_faction) { // "Custom" faction should not be available if both @@ -378,7 +376,7 @@ void flg_manager::update_available_leaders() if (!is_random_faction()) { if ((*current_faction_)["id"] == "Custom") { // Allow user to choose a leader from any faction. - BOOST_FOREACH(const config* f, available_factions_) { + for (const config* f : available_factions_) { if ((*f)["id"] != "Random") { append_leaders_from_faction(f); } @@ -422,7 +420,7 @@ void flg_manager::update_available_genders() if (saved_game_) { std::string gender; - BOOST_FOREACH(const config& side_unit, side_.child_range("unit")) { + for (const config& side_unit : side_.child_range("unit")) { if (current_leader_ == side_unit["type"] && side_unit["canrecruit"].to_bool()) { @@ -440,7 +438,7 @@ void flg_manager::update_available_genders() available_genders_.push_back("random"); } - BOOST_FOREACH(unit_race::GENDER gender, unit->genders()) { + for (unit_race::GENDER gender : unit->genders()) { std::string gender_str; if (gender == unit_race::FEMALE) { gender_str = unit_race::s_female; @@ -538,13 +536,13 @@ int flg_manager::find_suitable_faction() const } int res = -1, index = 0, best_score = 0; - BOOST_FOREACH(const config *faction, choosable_factions_) + for (const config *faction : choosable_factions_) { int faction_score = 0; std::vector recruit = utils::split((*faction)[search_field]); - BOOST_FOREACH(const std::string &search, find) { - BOOST_FOREACH(const std::string &r, recruit) { + for (const std::string &search : find) { + for (const std::string &r : recruit) { if (r == search) { ++faction_score; break; diff --git a/src/game_initialization/mp_game_utils.cpp b/src/game_initialization/mp_game_utils.cpp index 13ddd8390eb4..8c1344ed7451 100644 --- a/src/game_initialization/mp_game_utils.cpp +++ b/src/game_initialization/mp_game_utils.cpp @@ -26,8 +26,6 @@ #include "savegame.hpp" #include "units/id.hpp" -#include - static lg::log_domain log_engine("engine"); #define LOG_NG LOG_STREAM(info, log_engine) #define ERR_NG LOG_STREAM(err, log_engine) diff --git a/src/game_initialization/mp_options.cpp b/src/game_initialization/mp_options.cpp index b0faed8abd97..0d0ed1e58bf5 100644 --- a/src/game_initialization/mp_options.cpp +++ b/src/game_initialization/mp_options.cpp @@ -23,7 +23,6 @@ #include "gui/widgets/toggle_button.hpp" #include "widgets/slider.hpp" #include "widgets/textbox.hpp" -#include #include static lg::log_domain log_mp_create_options("mp/create/options"); @@ -37,7 +36,7 @@ namespace options void manager::init_info(const config& cfg, const std::string& key) { - BOOST_FOREACH (const config& comp, cfg.child_range(key)) { + for (const config& comp : cfg.child_range(key)) { config entry; entry["id"] = comp["id"]; entry["name"] = comp["name"]; @@ -45,8 +44,7 @@ void manager::init_info(const config& cfg, const std::string& key) if (comp.has_child("options") && comp["allow_new_game"].to_bool(true)) { const config& options = comp.child("options"); - BOOST_FOREACH (const config::any_child& c, - options.all_children_range()) { + for (const config::any_child& c : options.all_children_range()) { entry.add_child(c.key, c.cfg); } @@ -60,20 +58,20 @@ void manager::init_info(const config& cfg, const std::string& key) void manager::init_widgets() { - BOOST_FOREACH(option_display* od, widgets_ordered_) { + for (option_display* od : widgets_ordered_) { delete od; } widgets_.clear(); widgets_ordered_.clear(); - BOOST_FOREACH (const config::any_child& comp, options_info_.all_children_range()) { + for (const config::any_child& comp : options_info_.all_children_range()) { if (comp.cfg.all_children_count() == 0 || !is_active(comp.cfg["id"])) { continue; } widgets_ordered_.push_back(new title_display(video_, comp.cfg["name"])); - BOOST_FOREACH (const config::any_child& c, comp.cfg.all_children_range()) { + for (const config::any_child& c : comp.cfg.all_children_range()) { const std::string id = c.cfg["id"]; if (c.key == "slider") { widgets_ordered_.push_back(new slider_display(video_, c.cfg)); @@ -93,7 +91,7 @@ void manager::init_widgets() void manager::restore_defaults(const std::string &component) { - BOOST_FOREACH (const config::any_child& i, get_component_cfg(component).all_children_range()) { + for (const config::any_child& i : get_component_cfg(component).all_children_range()) { if (!is_valid_option(i.key, i.cfg)) { continue; } @@ -127,10 +125,9 @@ manager::manager(const config &gamecfg, CVideo &video, gui::scrollpane *pane, co init_info(gamecfg, "multiplayer"); init_info(gamecfg, "campaign"); - BOOST_FOREACH (const config::any_child& i, - options_info_.all_children_range()) + for (const config::any_child& i : options_info_.all_children_range()) { - BOOST_FOREACH (const config::any_child& j, i.cfg.all_children_range()) + for (const config::any_child& j : i.cfg.all_children_range()) { if (is_valid_option(j.key, j.cfg)) { config& value = get_value_cfg(j.cfg["id"]); @@ -144,7 +141,7 @@ manager::manager(const config &gamecfg, CVideo &video, gui::scrollpane *pane, co manager::~manager() { - BOOST_FOREACH(option_display* od, widgets_ordered_) + for (option_display* od : widgets_ordered_) { delete od; } @@ -182,7 +179,7 @@ void manager::layout_widgets(int startx, int starty, int w) { int ypos = starty; int border_size = 3; - BOOST_FOREACH(option_display* od, widgets_ordered_) + for (option_display* od : widgets_ordered_) { od->layout(startx, ypos, w, border_size, pane_); ypos += border_size; @@ -241,8 +238,8 @@ const config& manager::get_value_cfg_or_empty(const std::string& id) const { static const config empty; - BOOST_FOREACH (const config::any_child& i, values_.all_children_range()) { - BOOST_FOREACH (const config& j, i.cfg.child_range("option")) { + for (const config::any_child& i : values_.all_children_range()) { + for (const config& j : i.cfg.child_range("option")) { if (j["id"] == id) { return j; } @@ -258,9 +255,8 @@ config::any_child manager::get_option_parent(const std::string& id) const static const std::string empty_key = ""; static config::any_child not_found(&empty_key, &empty); - BOOST_FOREACH (const config::any_child& i, - options_info_.all_children_range()) { - BOOST_FOREACH (const config::any_child& j, i.cfg.all_children_range()) { + for (const config::any_child& i : options_info_.all_children_range()) { + for (const config::any_child& j : i.cfg.all_children_range()) { if (j.cfg["id"] == id) { return i; } @@ -274,9 +270,8 @@ const config& manager::get_option_info_cfg(const std::string& id) const { static const config empty; - BOOST_FOREACH (const config::any_child& i, - options_info_.all_children_range()) { - BOOST_FOREACH (const config::any_child& j, i.cfg.all_children_range()) { + for (const config::any_child& i : options_info_.all_children_range()) { + for (const config::any_child& j : i.cfg.all_children_range()) { if (j.cfg["id"] == id) { return j.cfg; } @@ -327,8 +322,7 @@ config::attribute_value manager::get_default_value(const std::string& id) const void manager::extract_values(const std::string& key, const std::string& id) { - BOOST_FOREACH (const config::any_child& c, - options_info_.find_child(key, "id", id).all_children_range()) + for (const config::any_child& c : options_info_.find_child(key, "id", id).all_children_range()) { if (!is_valid_option(c.key, c.cfg)) { continue; @@ -348,7 +342,7 @@ void manager::update_values() else { extract_values("multiplayer", scenario_); } - BOOST_FOREACH(const std::string& str, modifications_) { + for (const std::string& str : modifications_) { extract_values("modification", str); } } @@ -529,7 +523,7 @@ combo_display::combo_display(CVideo &video, const config &cfg) : values_() { std::vector items; - BOOST_FOREACH(const config& item, cfg.child_range("item")) { + for (const config& item : cfg.child_range("item")) { items.push_back(item["name"]); values_.push_back(item["value"]); } diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index 7f047115acce..12f59e3b31ad 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -50,7 +50,6 @@ #include "game_config_manager.hpp" #include -#include static lg::log_domain log_network("network"); #define LOG_NW LOG_STREAM(info, log_network) @@ -669,7 +668,7 @@ static void enter_lobby_mode(CVideo& video, const config& game_config, while (true) { const config &cfg = game_config.child("lobby_music"); if (cfg) { - BOOST_FOREACH(const config &i, cfg.child_range("music")) { + for (const config &i : cfg.child_range("music")) { sound::play_music_config(i); } sound::commit_music_changes(); diff --git a/src/game_initialization/multiplayer_configure.cpp b/src/game_initialization/multiplayer_configure.cpp index 396e43effd80..0b020082bec1 100644 --- a/src/game_initialization/multiplayer_configure.cpp +++ b/src/game_initialization/multiplayer_configure.cpp @@ -36,7 +36,6 @@ #include "formula/string_utils.hpp" #include -#include static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) diff --git a/src/game_initialization/multiplayer_connect.cpp b/src/game_initialization/multiplayer_connect.cpp index fc86daee5b2a..20e2da2c16b6 100644 --- a/src/game_initialization/multiplayer_connect.cpp +++ b/src/game_initialization/multiplayer_connect.cpp @@ -30,7 +30,6 @@ #include "wml_separators.hpp" #include -#include static lg::log_domain log_mp_connect("mp/connect"); #define DBG_MP LOG_STREAM(debug, log_mp_connect) @@ -42,7 +41,7 @@ std::vector controller_options_names( const std::vector& controller_options) { std::vector names; - BOOST_FOREACH(const ng::controller_option& option, controller_options) { + for (const ng::controller_option& option : controller_options) { names.push_back(option.second); } @@ -298,7 +297,7 @@ void connect::side::add_widgets_to_scrollpane(gui::scrollpane& pane, int pos) void connect::side::update_faction_combo() { std::vector factions; - BOOST_FOREACH(const config* faction, engine_->flg().choosable_factions()) { + for (const config* faction : engine_->flg().choosable_factions()) { const std::string& name = (*faction)["name"]; const std::string& icon = (*faction)["image"]; if (!icon.empty()) { @@ -331,7 +330,7 @@ void connect::side::update_controller_ui() int sel = 0; int i = 0; std::vector ais; - BOOST_FOREACH(const ai::description* desc, parent_->ai_algorithms_){ + for (const ai::description* desc : parent_->ai_algorithms_) { ais.push_back(desc->text); if (desc->id == engine_->ai_algorithm()) { sel = i; @@ -407,7 +406,7 @@ connect::connect(CVideo& v, const std::string& game_name, ai_algorithms_ = ai::configuration::get_available_ais(); // Sides. - BOOST_FOREACH(ng::side_engine_ptr s, engine_.side_engines()) { + for (ng::side_engine_ptr s : engine_.side_engines()) { sides_.push_back(side(*this, s)); } if (sides_.empty() && !game_config::debug) { @@ -417,7 +416,7 @@ connect::connect(CVideo& v, const std::string& game_name, // Add side widgets to scroll pane. int side_pos_y_offset = 0; - BOOST_FOREACH(side& s, sides_) { + for (side& s : sides_) { if (!s.engine()->allow_player() && !game_config::debug) { continue; } @@ -463,7 +462,7 @@ void connect::process_event_impl(const process_event_data & data) { bool changed = false; - BOOST_FOREACH(side& s, sides_) { + for (side& s : sides_) { s.process_event(); if (s.changed()) { changed = true; @@ -573,7 +572,7 @@ void connect::process_network_data(const config& data, set_result(QUIT); } - BOOST_FOREACH(side& s, sides_) { + for (side& s : sides_) { s.update_ui(); } @@ -606,7 +605,7 @@ void connect::update_playerlist_state(bool silent) } else { // Updates the player list std::vector playerlist; - BOOST_FOREACH(const std::string& user, engine_.connected_users()) { + for (const std::string& user : engine_.connected_users()) { playerlist.push_back(user); } set_user_list(playerlist, silent); diff --git a/src/game_initialization/multiplayer_create.cpp b/src/game_initialization/multiplayer_create.cpp index 2a46cfb0da4a..d8e397e6357f 100644 --- a/src/game_initialization/multiplayer_create.cpp +++ b/src/game_initialization/multiplayer_create.cpp @@ -48,7 +48,6 @@ #include "sdl/rect.hpp" #include -#include static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -140,7 +139,7 @@ create::create(CVideo& video, const config& cfg, saved_game& state, std::vector combo_level_names; - BOOST_FOREACH(level_type_info type_info, all_level_types) { + for (level_type_info type_info : all_level_types) { if (!engine_.get_levels_by_type_unfiltered(type_info.first).empty()) { available_level_types_.push_back(type_info.first); combo_level_names.push_back(type_info.second); @@ -159,7 +158,7 @@ create::create(CVideo& video, const config& cfg, saved_game& state, // Set level selection according to the preferences, if possible. size_t type_index = 0; - BOOST_FOREACH(ng::level::TYPE type, available_level_types_) { + for (ng::level::TYPE type : available_level_types_) { if (preferences::level_type() == type.cast()) { break; } @@ -536,7 +535,7 @@ void create::synchronize_selections() levels_menu_.set_items(engine_.levels_menu_item_names()); levels_menu_.move_selection(index); type_index = 0; - BOOST_FOREACH(ng::level::TYPE type, available_level_types_) { + for (ng::level::TYPE type : available_level_types_) { if (level_type_at_index == type) { level_type_combo_.set_selected(type_index); break; diff --git a/src/game_initialization/multiplayer_lobby.cpp b/src/game_initialization/multiplayer_lobby.cpp index b2139eb4b464..d6d6e6a51f3c 100644 --- a/src/game_initialization/multiplayer_lobby.cpp +++ b/src/game_initialization/multiplayer_lobby.cpp @@ -46,7 +46,6 @@ #include #include #include -#include #include static lg::log_domain log_config("config"); @@ -485,8 +484,7 @@ void gamebrowser::populate_game_item_campaign_or_scenario_info(gamebrowser::game if (map_hashes_ && !item.reloaded) { std::string hash = game["hash"]; bool hash_found = false; - BOOST_FOREACH(const config::attribute& i, - map_hashes_.attribute_range()) { + for (const config::attribute& i : map_hashes_.attribute_range()) { if (i.first == game["mp_scenario"] && i.second == hash) { @@ -547,7 +545,7 @@ void gamebrowser::populate_game_item_campaign_or_scenario_info(gamebrowser::game //TODO: use difficulties instead of difficulty_descriptions if //difficulty_descriptions is not available assert(difficulties.size() == difficulty_options.size()); - BOOST_FOREACH(const std::string& difficulty, difficulties) { + for (const std::string& difficulty : difficulties) { if (difficulty == game["difficulty_define"]) { gui2::tlegacy_menu_item menu_item(difficulty_options[index]); item.map_info += " — "; @@ -728,7 +726,7 @@ void gamebrowser::populate_game_item_mod_info(gamebrowser::game_item & item, con item.era_and_mod_info += _("Modifications:"); item.era_and_mod_info += " "; - BOOST_FOREACH (const config& m, game.child_range("modification")) { + for (const config& m : game.child_range("modification")) { const config& mod_cfg = game_config.find_child("modification", "id", m["id"]); if (mod_cfg) { item.era_and_mod_info += mod_cfg["name"].str(); @@ -754,7 +752,7 @@ void gamebrowser::populate_game_item_mod_info(gamebrowser::game_item & item, con // Do this before populating eras and mods, to get reports of missing add-ons in the most sensible order. void gamebrowser::populate_game_item_addons_installed(gamebrowser::game_item & item, const config & game, const std::vector & installed_addons) { - BOOST_FOREACH(const config & addon, game.child_range("addon")) { + for (const config & addon : game.child_range("addon")) { if (addon.has_attribute("id")) { if (std::find(installed_addons.begin(), installed_addons.end(), addon["id"].str()) == installed_addons.end()) { required_addon r; @@ -864,7 +862,7 @@ void gamebrowser::set_game_items(const config& cfg, const config& game_config, c games_.clear(); - BOOST_FOREACH(const config &game, cfg.child("gamelist").child_range("game")) + for (const config &game : cfg.child("gamelist").child_range("game")) { games_.push_back(game_item()); populate_game_item(games_.back(), game, game_config, installed_addons); @@ -926,7 +924,7 @@ bool gamebrowser::game_matches_filter(const game_item& i, const config& cfg) } if(preferences::fi_friends_in_game()) { bool found_friend = false; - BOOST_FOREACH(const config &user, cfg.child_range("user")) { + for (const config &user : cfg.child_range("user")) { if(preferences::is_friend(user["name"]) && user["game_id"] == i.id) { found_friend = true; break; @@ -939,7 +937,7 @@ bool gamebrowser::game_matches_filter(const game_item& i, const config& cfg) if(!preferences::fi_text().empty()) { bool found_match = true; - BOOST_FOREACH(const std::string& search_string, utils::split(preferences::fi_text(), ' ', utils::STRIP_SPACES)) { + for (const std::string& search_string : utils::split(preferences::fi_text(), ' ', utils::STRIP_SPACES)) { if(!boost::contains(i.map_info, search_string, chars_equal_insensitive) && !boost::contains(i.name, search_string, chars_equal_insensitive) && @@ -1200,7 +1198,7 @@ static void handle_addon_requirements_gui(CVideo & v, const std::vector needs_download; - BOOST_FOREACH(const required_addon & a, reqs) { + for (const required_addon & a : reqs) { if (a.outcome == NEED_DOWNLOAD) { err_msg += a.message; err_msg += "\n"; diff --git a/src/game_initialization/multiplayer_ui.cpp b/src/game_initialization/multiplayer_ui.cpp index e8dac37fd745..6f5b78938bdb 100644 --- a/src/game_initialization/multiplayer_ui.cpp +++ b/src/game_initialization/multiplayer_ui.cpp @@ -36,8 +36,6 @@ #include "sdl/utils.hpp" #include "sdl/rect.hpp" -#include - static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -564,7 +562,7 @@ void ui::process_network_data(const config& data, const network::connection /*so if (const config &ms = c.child("members")) { std::stringstream ss; ss << "Room " << c["room"].str() << " members: "; - BOOST_FOREACH(const config& m, ms.child_range("member")) { + for (const config& m : ms.child_range("member")) { ss << m["name"] << " "; } chat_.add_message(time(nullptr), "server", ss.str()); @@ -573,7 +571,7 @@ void ui::process_network_data(const config& data, const network::connection /*so if (const config &rs = c.child("rooms")) { std::stringstream ss; ss << "Rooms: "; - BOOST_FOREACH(const config& r, rs.child_range("room")) { + for (const config& r : rs.child_range("room")) { ss << r["name"].str() << "(" << r["size"].str() << ") "; } chat_.add_message(time(nullptr), "server", ss.str()); @@ -668,7 +666,7 @@ void ui::gamelist_updated(bool silent) { std::list u_list; - BOOST_FOREACH(const config &user, gamelist_.child_range("user")) + for (const config &user : gamelist_.child_range("user")) { user_info u_elem; u_elem.name = user["name"].str(); diff --git a/src/game_initialization/multiplayer_wait.cpp b/src/game_initialization/multiplayer_wait.cpp index 173f1cf6dc6a..7148e058c0e0 100644 --- a/src/game_initialization/multiplayer_wait.cpp +++ b/src/game_initialization/multiplayer_wait.cpp @@ -36,7 +36,6 @@ #include "video.hpp" #include -#include static lg::log_domain log_network("network"); #define DBG_NW LOG_STREAM(debug, log_network) @@ -271,7 +270,7 @@ void wait::join_game(bool observe) //available side. const config *side_choice = nullptr; int side_num = -1, nb_sides = 0; - BOOST_FOREACH(const config &sd, get_scenario().child_range("side")) + for (const config &sd : get_scenario().child_range("side")) { DBG_MP << "*** side " << nb_sides << "***\n" << sd.debug() << "***\n"; @@ -331,7 +330,7 @@ void wait::join_game(bool observe) const std::string color = (*side_choice)["color"].str(); std::vector era_factions; - BOOST_FOREACH(const config &side, possible_sides) { + for (const config &side : possible_sides) { era_factions.push_back(&side); } @@ -347,7 +346,7 @@ void wait::join_game(bool observe) saved_game); std::vector choices; - BOOST_FOREACH(const config *s, flg.choosable_factions()) + for (const config *s : flg.choosable_factions()) { const config &side = *s; const std::string &name = side["name"]; @@ -520,7 +519,7 @@ void wait::generate_menu() std::vector details; std::set playerlist; - BOOST_FOREACH(const config &sd, get_scenario().child_range("side")) + for (const config &sd : get_scenario().child_range("side")) { if (!sd["allow_player"].to_bool(true)) { continue; @@ -535,7 +534,7 @@ void wait::generate_menu() // Hack: if there is a unit which can recruit, use it as a // leader. Necessary to display leader information when loading // saves. - BOOST_FOREACH(const config &side_unit, sd.child_range("unit")) + for (const config &side_unit : sd.child_range("unit")) { if (side_unit["canrecruit"].to_bool()) { leader_type = side_unit["type"].str(); @@ -647,7 +646,7 @@ bool wait::download_level_data() } else if(config& controllers = revc.child("controllers")) { int index = 0; - BOOST_FOREACH(const config& controller, controllers.child_range("controller")) { + for (const config& controller : controllers.child_range("controller")) { if(config& side = get_scenario().child("side", index)) { side["is_local"] = controller["is_local"]; } diff --git a/src/game_initialization/playcampaign.cpp b/src/game_initialization/playcampaign.cpp index dc351a95eb51..6b8c2e39ab10 100644 --- a/src/game_initialization/playcampaign.cpp +++ b/src/game_initialization/playcampaign.cpp @@ -48,8 +48,6 @@ #include "wml_exception.hpp" #include "formula/string_utils.hpp" -#include - #define LOG_G LOG_STREAM(info, lg::general) static lg::log_domain log_engine("engine"); @@ -150,7 +148,7 @@ void campaign_controller::show_carryover_message(playsingle_controller& playcont //We need to write the carryover amount to the team thats why we need non const std::vector& teams = *resources::teams; int persistent_teams = 0; - BOOST_FOREACH(const team &t, teams) { + for (const team &t : teams) { if (t.persistent()){ ++persistent_teams; } @@ -162,7 +160,7 @@ void campaign_controller::show_carryover_message(playsingle_controller& playcont gamemap map = playcontroller.get_map_const(); tod_manager tod = playcontroller.get_tod_manager_const(); int turns_left = std::max(0, tod.number_of_turns() - tod.turn()); - BOOST_FOREACH(team &t, teams) + for (team &t : teams) { if (!t.persistent() || t.lost()) { diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 4962666a17b0..29e619e91957 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -60,7 +60,6 @@ #include "wml_exception.hpp" // for twml_exception #include // for copy, max, min, stable_sort -#include // for auto_any_base, etc #include // for optional #include // for tuple #include // for system @@ -346,7 +345,7 @@ bool game_launcher::init_language() language_def locale; if(cmdline_opts_.language) { std::vector langs = get_languages(); - BOOST_FOREACH(const language_def & def, langs) { + for(const language_def & def : langs) { if(def.localename == *cmdline_opts_.language) { locale = def; break; @@ -742,7 +741,7 @@ void game_launcher::set_tutorial() void game_launcher::mark_completed_campaigns(std::vector &campaigns) { - BOOST_FOREACH(config &campaign, campaigns) { + for (config &campaign : campaigns) { campaign["completed"] = preferences::is_campaign_completed(campaign["id"]); } } diff --git a/src/game_preferences.cpp b/src/game_preferences.cpp index 996b69998796..4b92a65f0f4c 100644 --- a/src/game_preferences.cpp +++ b/src/game_preferences.cpp @@ -30,7 +30,6 @@ #include "units/map.hpp" #include "wml_exception.hpp" -#include #include #ifdef _WIN32 #include @@ -135,11 +134,11 @@ manager::manager() : [/campaign] [/completed_campaigns] */ - BOOST_FOREACH(const std::string &c, utils::split(preferences::get("completed_campaigns"))) { + for (const std::string &c : utils::split(preferences::get("completed_campaigns"))) { completed_campaigns[c]; // create the elements } if (const config &ccc = preferences::get_child("completed_campaigns")) { - BOOST_FOREACH(const config &cc, ccc.child_range("campaign")) { + for (const config &cc : ccc.child_range("campaign")) { std::set &d = completed_campaigns[cc["name"]]; std::vector nd = utils::split(cc["difficulty_levels"]); std::copy(nd.begin(), nd.end(), std::inserter(d, d.begin())); @@ -161,9 +160,9 @@ manager::manager() : message = foobar [/line] */ - BOOST_FOREACH(const config::any_child &h, history.all_children_range()) + for (const config::any_child &h : history.all_children_range()) { - BOOST_FOREACH(const config &l, h.cfg.child_range("line")) { + for (const config &l : h.cfg.child_range("line")) { history_map[h.key].push_back(l["message"]); } } @@ -176,7 +175,7 @@ manager::~manager() { config campaigns; typedef const std::pair > cc_elem; - BOOST_FOREACH(cc_elem &elem, completed_campaigns) { + for (cc_elem &elem : completed_campaigns) { config cmp; cmp["name"] = elem.first; cmp["difficulty_levels"] = utils::join(elem.second); @@ -197,10 +196,10 @@ manager::~manager() */ config history; typedef std::pair > hack; - BOOST_FOREACH(const hack& history_id, history_map) { + for (const hack& history_id : history_map) { config history_id_cfg; // [history_id] - BOOST_FOREACH(const std::string& line, history_id.second) { + for (const std::string& line : history_id.second) { config cfg; // [line] cfg["message"] = line; @@ -240,7 +239,7 @@ admin_authentication_reset::~admin_authentication_reset() static void load_acquaintances() { if(acquaintances.empty()) { - BOOST_FOREACH(const config &acfg, preferences::get_prefs()->child_range("acquaintance")) { + for (const config &acfg : preferences::get_prefs()->child_range("acquaintance")) { acquaintance ac = acquaintance(acfg); acquaintances[ac.get_nick()] = ac; } @@ -408,7 +407,7 @@ const std::vector& server_list() std::vector &game_servers = game_config::server_list; VALIDATE(!game_servers.empty(), _("No server has been defined.")); pref_servers.insert(pref_servers.begin(), game_servers.begin(), game_servers.end()); - BOOST_FOREACH(const config &server, get_prefs()->child_range("server")) { + for(const config &server : get_prefs()->child_range("server")) { game_config::server_info sinf; sinf.name = server["name"].str(); sinf.address = server["address"].str(); @@ -1150,8 +1149,8 @@ void encounter_start_units(const unit_map& units){ } static void encounter_recallable_units(const std::vector& teams){ - BOOST_FOREACH(const team& t, teams) { - BOOST_FOREACH(const unit_const_ptr & u, t.recall_list()) { + for (const team& t : teams) { + for (const unit_const_ptr & u : t.recall_list()) { encountered_units_set.insert(u->type_id()); } } diff --git a/src/game_state.cpp b/src/game_state.cpp index e7a0f2d5acaa..5bfbd37eba76 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -33,7 +33,6 @@ #include "gui/dialogs/loadscreen.hpp" #include -#include #include #include #include @@ -135,7 +134,7 @@ void game_state::place_sides_in_preferred_locations(const config& level) int num_pos = board_.map().num_valid_starting_positions(); int side_num = 1; - BOOST_FOREACH(const config &side, level.child_range("side")) + for(const config &side : level.child_range("side")) { for(int p = 1; p <= num_pos; ++p) { const map_location& pos = board_.map().starting_position(p); @@ -173,7 +172,7 @@ void game_state::init(const config& level, play_controller & pc) } LOG_NG << "initialized time of day regions... " << (SDL_GetTicks() - pc.ticks()) << std::endl; - BOOST_FOREACH(const config &t, level.child_range("time_area")) { + for (const config &t : level.child_range("time_area")) { tod_manager_.add_time_area(board_.map(),t); } @@ -184,7 +183,7 @@ void game_state::init(const config& level, play_controller & pc) std::vector team_builders; int team_num = 0; - BOOST_FOREACH(const config &side, level.child_range("side")) + for (const config &side : level.child_range("side")) { if (first_human_team_ == -1) { const std::string &controller = side["controller"]; @@ -204,7 +203,7 @@ void game_state::init(const config& level, play_controller & pc) tod_manager_.resolve_random(*random_new::generator); - BOOST_FOREACH(team_builder_ptr tb_ptr, team_builders) + for(team_builder_ptr tb_ptr : team_builders) { build_team_stage_two(tb_ptr); } diff --git a/src/generators/cave_map_generator.cpp b/src/generators/cave_map_generator.cpp index cb994599ffe2..fc1aa85d5523 100644 --- a/src/generators/cave_map_generator.cpp +++ b/src/generators/cave_map_generator.cpp @@ -26,7 +26,6 @@ #include "serialization/string_utils.hpp" #include "util.hpp" #include "seed_rng.hpp" -#include static lg::log_domain log_engine("engine"); #define LOG_NG LOG_STREAM(info, log_engine) @@ -140,7 +139,7 @@ void cave_map_generator::cave_map_generator_job::build_chamber(map_location loc, void cave_map_generator::cave_map_generator_job::generate_chambers() { - BOOST_FOREACH(const config &ch, params.cfg_.child_range("chamber")) + for (const config &ch : params.cfg_.child_range("chamber")) { // If there is only a chance of the chamber appearing, deal with that here. if (ch.has_attribute("chance") && int(rng_() % 100) < ch["chance"].to_int()) { @@ -187,7 +186,7 @@ void cave_map_generator::cave_map_generator_job::generate_chambers() chambers_.push_back(new_chamber); - BOOST_FOREACH(const config &p, ch.child_range("passage")) + for(const config &p : ch.child_range("passage")) { const std::string &dst = p["destination"]; @@ -212,7 +211,7 @@ void cave_map_generator::cave_map_generator_job::place_chamber(const chamber& c) if (c.items == nullptr || c.locs.empty()) return; size_t index = 0; - BOOST_FOREACH(const config::any_child &it, c.items->all_children_range()) + for (const config::any_child &it : c.items->all_children_range()) { config cfg = it.cfg; config &filter = cfg.child("filter"); diff --git a/src/generators/default_map_generator_job.cpp b/src/generators/default_map_generator_job.cpp index 9c00e8483b62..f1e3799ea29f 100644 --- a/src/generators/default_map_generator_job.cpp +++ b/src/generators/default_map_generator_job.cpp @@ -33,7 +33,6 @@ #include "formula/string_utils.hpp" #include -#include #include "seed_rng.hpp" static lg::log_domain log_mapgen("mapgen"); #define ERR_NG LOG_STREAM(err, log_mapgen) @@ -793,7 +792,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t std::vector height_conversion; - BOOST_FOREACH(const config &h, cfg.child_range("height")) { + for(const config &h : cfg.child_range("height")) { height_conversion.push_back(terrain_height_mapper(h)); } @@ -928,7 +927,7 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t LOG_NG << (SDL_GetTicks() - ticks) << "\n"; ticks = SDL_GetTicks(); std::vector converters; - BOOST_FOREACH(const config &cv, cfg.child_range("convert")) { + for(const config &cv : cfg.child_range("convert")) { converters.push_back(terrain_converter(cv)); } diff --git a/src/generators/lua_map_generator.cpp b/src/generators/lua_map_generator.cpp index aa66ab9d43dd..e1aae5f58dcd 100644 --- a/src/generators/lua_map_generator.cpp +++ b/src/generators/lua_map_generator.cpp @@ -20,8 +20,6 @@ #include -#include - lua_map_generator::lua_map_generator(const config & cfg) : id_(cfg["id"]) , config_name_(cfg["config_name"]) @@ -32,7 +30,7 @@ lua_map_generator::lua_map_generator(const config & cfg) , generator_data_(cfg) { const char* required[] = {"id", "config_name", "create_map"}; - BOOST_FOREACH(std::string req, required) { + for (std::string req : required) { if (!cfg.has_attribute(req)) { std::string msg = "Error when constructing a lua map generator -- missing a required attribute '"; msg += req + "'\n"; diff --git a/src/gettext_boost.cpp b/src/gettext_boost.cpp index eb87ae15bd9a..8d82b0088614 100644 --- a/src/gettext_boost.cpp +++ b/src/gettext_boost.cpp @@ -19,7 +19,6 @@ #include #include #include -#include // including boost/thread fixes linking of boost locale for msvc on boost 1.60 #include #include @@ -78,7 +77,7 @@ namespace , is_dirty_(true) { const bl::localization_backend_manager& g_mgr = bl::localization_backend_manager::global(); - BOOST_FOREACH(const std::string& name, g_mgr.get_all_backends()) + for(const std::string& name : g_mgr.get_all_backends()) { LOG_G << "Found boost locale backend: '" << name << "'\n"; } diff --git a/src/gui/dialogs/advanced_graphics_options.cpp b/src/gui/dialogs/advanced_graphics_options.cpp index 88315c3ce57d..6410642e0875 100644 --- a/src/gui/dialogs/advanced_graphics_options.cpp +++ b/src/gui/dialogs/advanced_graphics_options.cpp @@ -30,7 +30,6 @@ #include "formula/string_utils.hpp" #include -#include #include "gettext.hpp" @@ -81,7 +80,7 @@ tadvanced_graphics_options::tadvanced_graphics_options() void tadvanced_graphics_options::pre_show(twindow& window) { - BOOST_FOREACH(const std::string & i, scale_cases) { + for(const std::string & i : scale_cases) { setup_scale_case(i, window); } @@ -95,7 +94,7 @@ void tadvanced_graphics_options::pre_show(twindow& window) void tadvanced_graphics_options::post_show(twindow& /*window*/) { if(get_retval() == twindow::OK) { - BOOST_FOREACH(const std::string & i, scale_cases) { + for(const std::string & i : scale_cases) { update_scale_case(i); } image::update_from_preferences(); diff --git a/src/gui/dialogs/editor/set_starting_position.cpp b/src/gui/dialogs/editor/set_starting_position.cpp index b2060d1f385f..44af7965da06 100644 --- a/src/gui/dialogs/editor/set_starting_position.cpp +++ b/src/gui/dialogs/editor/set_starting_position.cpp @@ -16,7 +16,6 @@ #include "gui/dialogs/editor/set_starting_position.hpp" -#include #include "formatter.hpp" #include "formula/string_utils.hpp" #include "gettext.hpp" diff --git a/src/gui/dialogs/lobby/lobby.cpp b/src/gui/dialogs/lobby/lobby.cpp index 2ba3dbc6032a..3930ce192f5e 100644 --- a/src/gui/dialogs/lobby/lobby.cpp +++ b/src/gui/dialogs/lobby/lobby.cpp @@ -48,7 +48,6 @@ #include "mp_ui_alerts.hpp" #include -#include static lg::log_domain log_network("network"); #define DBG_NW LOG_STREAM(debug, log_network) diff --git a/src/gui/dialogs/multiplayer/mp_alerts_options.cpp b/src/gui/dialogs/multiplayer/mp_alerts_options.cpp index af5b97ebf142..5e2b063f61fa 100644 --- a/src/gui/dialogs/multiplayer/mp_alerts_options.cpp +++ b/src/gui/dialogs/multiplayer/mp_alerts_options.cpp @@ -30,7 +30,6 @@ #include "formula/string_utils.hpp" #include -#include #include "gettext.hpp" @@ -111,7 +110,7 @@ static void set_pref_and_button(const std::string & id, bool value, twindow & wi static void revert_to_default_pref_values(twindow & window) { - BOOST_FOREACH(const std::string & i, mp_ui_alerts::items) { + for (const std::string & i : mp_ui_alerts::items) { set_pref_and_button(i+"_sound", mp_ui_alerts::get_def_pref_sound(i), window); set_pref_and_button(i+"_notif", mp_ui_alerts::get_def_pref_notif(i), window); set_pref_and_button(i+"_lobby", mp_ui_alerts::get_def_pref_lobby(i), window); @@ -126,7 +125,7 @@ tmp_alerts_options::tmp_alerts_options() void tmp_alerts_options::pre_show(twindow& window) { - BOOST_FOREACH(const std::string & i, mp_ui_alerts::items) { + for (const std::string & i : mp_ui_alerts::items) { setup_item(i, window); } diff --git a/src/gui/widgets/grid_private.hpp b/src/gui/widgets/grid_private.hpp index 72fabbc9fb8e..0af2d553168c 100644 --- a/src/gui/widgets/grid_private.hpp +++ b/src/gui/widgets/grid_private.hpp @@ -34,8 +34,6 @@ #include "utils/const_clone.hpp" -#include - namespace gui2 { @@ -59,7 +57,7 @@ struct tgrid_implementation const bool must_be_active) { typedef typename utils::tconst_clone::type hack; - BOOST_FOREACH(hack & child, grid.children_) + for(hack & child : grid.children_) { W* widget = child.widget(); @@ -95,7 +93,7 @@ struct tgrid_implementation } typedef typename utils::tconst_clone::type hack; - BOOST_FOREACH(hack & child, grid.children_) + for(hack & child : grid.children_) { widget = child.widget(); diff --git a/src/gui/widgets/list.cpp b/src/gui/widgets/list.cpp index 8cdbdfbcd9bf..4f212ffd471e 100644 --- a/src/gui/widgets/list.cpp +++ b/src/gui/widgets/list.cpp @@ -27,7 +27,6 @@ #include "gui/widgets/window.hpp" #include -#include #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -121,7 +120,7 @@ tlist::add_row(const std::map& data, void tlist::append_rows(const std::vector& items) { - BOOST_FOREACH(const string_map & item, items) + for(const string_map & item : items) { add_row(item); } diff --git a/src/help/help_impl.cpp b/src/help/help_impl.cpp index 7fa458d1c112..d6088787c141 100644 --- a/src/help/help_impl.cpp +++ b/src/help/help_impl.cpp @@ -45,7 +45,6 @@ #include // for assert #include // for sort, find, transform, etc -#include // for auto_any_base, etc #include // for shared_ptr #include // for operator<<, basic_ostream, etc #include // for back_insert_iterator, etc @@ -105,7 +104,7 @@ bool section_is_referenced(const std::string §ion_id, const config &cfg) } } - BOOST_FOREACH(const config §ion, cfg.child_range("section")) + for (const config §ion : cfg.child_range("section")) { const std::vector sections_refd = utils::quoted_split(section["sections"]); @@ -129,7 +128,7 @@ bool topic_is_referenced(const std::string &topic_id, const config &cfg) } } - BOOST_FOREACH(const config §ion, cfg.child_range("section")) + for (const config §ion : cfg.child_range("section")) { const std::vector topics_refd = utils::quoted_split(section["topics"]); @@ -366,7 +365,7 @@ std::vector generate_time_of_day_topics(const bool /*sort_generated*/) return topics; } const std::vector& times = resources::tod_manager->times(); - BOOST_FOREACH(const time_of_day& time, times) + for (const time_of_day& time : times) { const std::string id = "time_of_day_" + time.id; const std::string image = "src='" + time.image + "'"; @@ -394,7 +393,7 @@ std::vector generate_weapon_special_topics(const bool sort_generated) std::map special_description; std::map > special_units; - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { const unit_type &type = i.second; // Only show the weapon special if we find it on a unit that @@ -456,7 +455,7 @@ std::vector generate_ability_topics(const bool sort_generated) // should have a full description, if so, add this units abilities // for display. We do not want to show abilities that the user has // not encountered yet. - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { const unit_type &type = i.second; if (description_type(type) == FULL_DESCRIPTION) { @@ -521,7 +520,7 @@ std::vector generate_era_topics(const bool sort_generated, const std::str topics = generate_faction_topics(era, sort_generated); std::vector faction_links; - BOOST_FOREACH(const topic & t, topics) { + for (const topic & t : topics) { faction_links.push_back(make_link(t.title, t.id)); } @@ -537,7 +536,7 @@ std::vector generate_era_topics(const bool sort_generated, const std::str text << "
    text='" << _("Factions") << "'
    " << "\n"; std::sort(faction_links.begin(), faction_links.end()); - BOOST_FOREACH(const std::string &link, faction_links) { + for (const std::string &link : faction_links) { text << "• " << link << "\n"; } @@ -551,7 +550,7 @@ std::vector generate_era_topics(const bool sort_generated, const std::str std::vector generate_faction_topics(const config & era, const bool sort_generated) { std::vector topics; - BOOST_FOREACH(const config &f, era.child_range("multiplayer_side")) { + for (const config &f : era.child_range("multiplayer_side")) { const std::string& id = f["id"]; if (id == "Random") continue; @@ -568,7 +567,7 @@ std::vector generate_faction_topics(const config & era, const bool sort_g std::set races; std::set alignments; - BOOST_FOREACH(const std::string & u_id, recruit_ids) { + for (const std::string & u_id : recruit_ids) { if (const unit_type * t = unit_types.find(u_id, unit_type::HELP_INDEXED)) { assert(t); const unit_type & type = *t; @@ -602,7 +601,7 @@ std::vector generate_faction_topics(const config & era, const bool sort_g text << "
    text='" << _("Leaders") << "'
    " << "\n"; const std::vector leaders = make_unit_links_list( utils::split(f["leader"]), true ); - BOOST_FOREACH(const std::string &link, leaders) { + for (const std::string &link : leaders) { text << "• " << link << "\n"; } @@ -611,7 +610,7 @@ std::vector generate_faction_topics(const config & era, const bool sort_g text << "
    text='" << _("Recruits") << "'
    " << "\n"; const std::vector recruit_links = make_unit_links_list( recruit_ids, true ); - BOOST_FOREACH(const std::string &link, recruit_links) { + for (const std::string &link : recruit_links) { text << "• " << link << "\n"; } @@ -653,7 +652,7 @@ std::string make_unit_link(const std::string& type_id) std::vector make_unit_links_list(const std::vector& type_id_list, bool ordered) { std::vector links_list; - BOOST_FOREACH(const std::string &type_id, type_id_list) { + for (const std::string &type_id : type_id_list) { std::string unit_link = make_unit_link(type_id); if (!unit_link.empty()) links_list.push_back(unit_link); @@ -670,7 +669,7 @@ void generate_races_sections(const config *help_cfg, section &sec, int level) std::set races; std::set visible_races; - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { const unit_type &type = i.second; UNIT_DESCRIPTION_TYPE desc_type = description_type(type); @@ -707,7 +706,7 @@ void generate_races_sections(const config *help_cfg, section &sec, int level) void generate_era_sections(const config* help_cfg, section & sec, int level) { - BOOST_FOREACH(const config & era, game_cfg->child_range("era")) { + for (const config & era : game_cfg->child_range("era")) { if (era["hide_help"].to_bool()) { continue; } @@ -741,7 +740,7 @@ void generate_terrain_sections(const config* /*help_cfg*/, section& sec, int /*l const t_translation::t_list& t_listi = tdata->list(); - BOOST_FOREACH(const t_translation::t_terrain& t, t_listi) { + for (const t_translation::t_terrain& t : t_listi) { const terrain_type& info = tdata->get_terrain_info(t); @@ -757,7 +756,7 @@ void generate_terrain_sections(const config* /*help_cfg*/, section& sec, int /*l terrain_topic.text = new terrain_topic_generator(info); t_translation::t_list base_terrains = tdata->underlying_union_terrain(t); - BOOST_FOREACH(const t_translation::t_terrain& base, base_terrains) { + for (const t_translation::t_terrain& base : base_terrains) { const terrain_type& base_info = tdata->get_terrain_info(base); @@ -782,7 +781,7 @@ void generate_terrain_sections(const config* /*help_cfg*/, section& sec, int /*l void generate_unit_sections(const config* /*help_cfg*/, section& sec, int level, const bool /*sort_generated*/, const std::string& race) { - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) { + for (const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { const unit_type &type = i.second; if (type.race_id() != race) @@ -792,7 +791,7 @@ void generate_unit_sections(const config* /*help_cfg*/, section& sec, int level, continue; section base_unit; - BOOST_FOREACH(const std::string &variation_id, type.variations()) { + for (const std::string &variation_id : type.variations()) { // TODO: Do we apply encountered stuff to variations? const unit_type &var_type = type.get_variation(variation_id); const std::string topic_name = var_type.type_name() + "\n" + var_type.variation_name(); @@ -821,7 +820,7 @@ std::vector generate_unit_topics(const bool sort_generated, const std::st std::set race_topics; std::set alignments; - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { const unit_type &type = i.second; @@ -857,7 +856,7 @@ std::vector generate_unit_topics(const bool sort_generated, const std::st race_name = r->plural_name(); race_description = r->description(); // if (description.empty()) description = _("No description Available"); - BOOST_FOREACH(const config &additional_topic, r->additional_topics()) + for (const config &additional_topic : r->additional_topics()) { std::string id = additional_topic["id"]; std::string title = additional_topic["title"]; @@ -1300,7 +1299,7 @@ void generate_contents() // opening the help browser in the default manner. config hidden_toplevel; std::stringstream ss; - BOOST_FOREACH(const config §ion, help_config->child_range("section")) + for (const config §ion : help_config->child_range("section")) { const std::string id = section["id"]; if (find_section(toplevel, id) == nullptr) { @@ -1317,7 +1316,7 @@ void generate_contents() } hidden_toplevel["sections"] = ss.str(); ss.str(""); - BOOST_FOREACH(const config &topic, help_config->child_range("topic")) + for (const config &topic : help_config->child_range("topic")) { const std::string id = topic["id"]; if (find_topic(toplevel, id) == nullptr) { diff --git a/src/help/help_topic_generators.cpp b/src/help/help_topic_generators.cpp index 4541252d9fbd..db4b8b343fca 100644 --- a/src/help/help_topic_generators.cpp +++ b/src/help/help_topic_generators.cpp @@ -29,7 +29,6 @@ #include "units/types.hpp" // for unit_type, unit_type_data, etc #include "video.hpp" // fore current_resolution -#include // for auto_any_base, etc #include // for optional #include // for shared_ptr #include // for operator<<, basic_ostream, etc @@ -106,7 +105,7 @@ static std::string print_behavior_description(t_it start, t_it end, const tdata_ if (!first_level) ss << "( "; ss << print_behavior_description(start, *last_change_pos-1, tdata, false, begin_best); // Printed the (parenthesized) leading part from before the change, now print the remaining names in this group. - BOOST_FOREACH(const std::string & s, names) { + for (const std::string & s : names) { ss << ", " << s; } if (!first_level) ss << " )"; @@ -143,7 +142,7 @@ std::string terrain_topic_generator::operator()() const { ss << "\n" << _("Base Terrain: "); bool first = true; - BOOST_FOREACH(const t_translation::t_terrain& underlying_terrain, underlying_mvt_terrains) { + for (const t_translation::t_terrain& underlying_terrain : underlying_mvt_terrains) { const terrain_type& mvt_base = tdata->get_terrain_info(underlying_terrain); if (mvt_base.editor_name().empty()) continue; @@ -200,13 +199,13 @@ std::string terrain_topic_generator::operator()() const { const t_translation::t_list& underlying_mvt_terrains = tdata->underlying_mvt_terrain(type_.number()); ss << "\nDebug Mvt Description String:"; - BOOST_FOREACH(const t_translation::t_terrain & t, underlying_mvt_terrains) { + for (const t_translation::t_terrain & t : underlying_mvt_terrains) { ss << " " << t; } const t_translation::t_list& underlying_def_terrains = tdata->underlying_def_terrain(type_.number()); ss << "\nDebug Def Description String:"; - BOOST_FOREACH(const t_translation::t_terrain & t, underlying_def_terrains) { + for (const t_translation::t_terrain & t : underlying_def_terrains) { ss << " " << t; } @@ -294,7 +293,7 @@ std::string unit_topic_generator::operator()() const { reverse ? type_.advances_from() : type_.advances_to(); bool first = true; - BOOST_FOREACH(const std::string &adv, adv_units) { + for (const std::string &adv : adv_units) { const unit_type *type = unit_types.find(adv, unit_type::HELP_INDEXED); if (!type || type->hide_help()) { continue; @@ -336,7 +335,7 @@ std::string unit_topic_generator::operator()() const { ss << _("Base unit: ") << make_link(parent->type_name(), ".." + unit_prefix + type_.id()) << "\n"; } else { bool first = true; - BOOST_FOREACH(const std::string& base_id, utils::split(type_.get_cfg()["base_ids"])) { + for (const std::string& base_id : utils::split(type_.get_cfg()["base_ids"])) { if (first) { ss << _("Base units: "); first = false; @@ -348,7 +347,7 @@ std::string unit_topic_generator::operator()() const { } bool first = true; - BOOST_FOREACH(const std::string &var_id, parent->variations()) { + for (const std::string &var_id : parent->variations()) { const unit_type &type = parent->get_variation(var_id); if(type.hide_help()) { @@ -393,7 +392,7 @@ std::string unit_topic_generator::operator()() const { std::vector must_have_traits; std::vector random_traits; - BOOST_FOREACH(const config & trait, traits) { + for (const config & trait : traits) { const std::string trait_name = trait["male_name"]; std::string lang_trait_name = translation::gettext(trait_name.c_str()); const std::string ref_id = "traits_"+trait["id"].str(); @@ -555,9 +554,9 @@ std::string unit_topic_generator::operator()() const { movetype movement_type = type_.movement_type(); traits = type_.possible_traits(); if (traits.first != traits.second && type_.num_traits() > 0) { - BOOST_FOREACH(const config & t, traits) { + for (const config & t : traits) { if (t["availability"].str() == "musthave") { - BOOST_FOREACH (const config & effect, t.child_range("effect")) { + for (const config & effect : t.child_range("effect")) { if (!effect.child("filter") // If this is musthave but has a unit filter, it might not always apply, so don't apply it in the help. && movetype::effects.find(effect["apply_to"].str()) != movetype::effects.end()) { movement_type.merge(effect, effect["replace"].to_bool()); diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index d4bb8d8f2a6b..26a2dbf2ac27 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -15,8 +15,6 @@ #include "command_executor.hpp" #include "hotkey_item.hpp" -#include - #include "gui/dialogs/lua_interpreter.hpp" #include "gui/dialogs/message.hpp" #include "gui/dialogs/screenshot_notification.hpp" @@ -597,12 +595,12 @@ void execute_command(const hotkey_command& command, command_executor* executor, void command_executor_default::set_button_state() { display& disp = get_display(); - BOOST_FOREACH(const theme::menu& menu, disp.get_theme().menus()) { + for (const theme::menu& menu : disp.get_theme().menus()) { gui::button* button = disp.find_menu_button(menu.get_id()); if (!button) continue; bool enabled = false; - BOOST_FOREACH(const std::string& command, menu.items()) { + for (const std::string& command : menu.items()) { const hotkey::hotkey_command& command_obj = hotkey::get_hotkey_command(command); bool can_execute = can_execute_command(command_obj); @@ -614,13 +612,13 @@ void command_executor_default::set_button_state() button->enable(enabled); } - BOOST_FOREACH(const theme::action& action, disp.get_theme().actions()) { + for (const theme::action& action : disp.get_theme().actions()) { gui::button* button = disp.find_action_button(action.get_id()); if (!button) continue; bool enabled = false; int i = 0; - BOOST_FOREACH(const std::string& command, action.items()) { + for (const std::string& command : action.items()) { const hotkey::hotkey_command& command_obj = hotkey::get_hotkey_command(command); std::string tooltip = action.tooltip(i); diff --git a/src/hotkey/hotkey_command.cpp b/src/hotkey/hotkey_command.cpp index 4a2b9b66c115..6d1a4f23b93b 100644 --- a/src/hotkey/hotkey_command.cpp +++ b/src/hotkey/hotkey_command.cpp @@ -19,8 +19,6 @@ #include "hotkey_item.hpp" #include "config.hpp" #include "preferences.hpp" - -#include #include "log.hpp" static lg::log_domain log_config("config"); @@ -442,7 +440,7 @@ bool hotkey_command::null() const const hotkey_command& hotkey_command::get_command_by_command(hotkey::HOTKEY_COMMAND command) { - BOOST_FOREACH(hotkey_command& cmd, known_hotkeys) + for(hotkey_command& cmd : known_hotkeys) { if(cmd.id == command) return cmd; @@ -488,7 +486,7 @@ void init_hotkey_commands() { known_hotkeys = known_hotkeys_temp; size_t i = 0; - BOOST_FOREACH(hotkey_command_temp& cmd, hotkey_list_) + for(hotkey_command_temp& cmd : hotkey_list_) { known_hotkeys.push_back( new hotkey_command(cmd.id, cmd.command, t_string(cmd.description, "wesnoth-lib"), cmd.hidden, cmd.scope, t_string(cmd.tooltip, "wesnoth-lib"))); command_map_[cmd.command] = i; diff --git a/src/hotkey/hotkey_item.cpp b/src/hotkey/hotkey_item.cpp index 77312f1ca826..c915f137fe79 100644 --- a/src/hotkey/hotkey_item.cpp +++ b/src/hotkey/hotkey_item.cpp @@ -24,7 +24,6 @@ #include "serialization/unicode.hpp" #include "sdl/utils.hpp" -#include #include #include #include @@ -325,7 +324,7 @@ void hotkey_keyboard::save_helper(config &item) const bool has_hotkey_item(const std::string& command) { - BOOST_FOREACH(hotkey_ptr item, hotkeys_) { + for (hotkey_ptr item : hotkeys_) { if (item->get_command() == command) { return true; } @@ -375,7 +374,7 @@ void add_hotkey(const hotkey_ptr item) void clear_hotkeys(const std::string& command) { - BOOST_FOREACH(hotkey::hotkey_ptr item, hotkeys_) { + for (hotkey::hotkey_ptr item : hotkeys_) { if (item->get_command() == command) { if (item->is_default()) @@ -393,7 +392,7 @@ void clear_hotkeys() const hotkey_ptr get_hotkey(const SDL_Event &event) { - BOOST_FOREACH(hotkey_ptr item, hotkeys_) { + for (hotkey_ptr item : hotkeys_) { if (item->matches(event)) { return item; } @@ -403,7 +402,7 @@ const hotkey_ptr get_hotkey(const SDL_Event &event) void load_hotkeys(const config& cfg, bool set_as_default) { - BOOST_FOREACH(const config &hk, cfg.child_range("hotkey")) { + for (const config &hk : cfg.child_range("hotkey")) { hotkey_ptr item = load_from_config(hk); if (!set_as_default) { @@ -440,7 +439,7 @@ void save_hotkeys(config& cfg) { cfg.clear_children("hotkey"); - BOOST_FOREACH(hotkey_ptr item, hotkeys_) { + for (hotkey_ptr item : hotkeys_) { if ((!item->is_default() && item->active()) || (item->is_default() && item->is_disabled())) { item->save(cfg.add_child("hotkey")); @@ -452,7 +451,7 @@ std::string get_names(std::string id) { // Names are used in places like the hot-key preferences menu std::vector names; - BOOST_FOREACH(const hotkey::hotkey_ptr item, hotkeys_) { + for (const hotkey::hotkey_ptr item : hotkeys_) { if (item->get_command() == id && !item->null() && !item->is_disabled()) { names.push_back(item->get_name()); } diff --git a/src/image.cpp b/src/image.cpp index 975672bdd507..73350eb916fe 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -44,7 +44,6 @@ #include #include -#include #include #include @@ -407,7 +406,7 @@ static bool localized_file_uptodate (const std::string& loc_file) std::string trackpath = filesystem::get_binary_file_location("", "l10n-track"); std::string contents = filesystem::read_file(trackpath); std::vector lines = utils::split(contents, '\n'); - BOOST_FOREACH(const std::string &line, lines) { + for (const std::string &line : lines) { size_t p1 = line.find(fsep); if (p1 == std::string::npos) continue; @@ -454,7 +453,7 @@ static std::string get_localized_path (const std::string& file, const std::strin // add en_US with lowest priority, since the message above will // not have it when translated. langs.push_back("en_US"); - BOOST_FOREACH(const std::string &lang, langs) { + for (const std::string &lang : langs) { std::string loc_file = dir + "/" + "l10n" + "/" + lang + "/" + loc_base; if (filesystem::file_exists(loc_file) && localized_file_uptodate(loc_file)) { return loc_file; diff --git a/src/image_modifications.cpp b/src/image_modifications.cpp index f68aa25dfbbb..300123027d9c 100644 --- a/src/image_modifications.cpp +++ b/src/image_modifications.cpp @@ -22,8 +22,6 @@ #include "sdl/alpha.hpp" #include "serialization/string_utils.hpp" -#include - #include #define GETTEXT_DOMAIN "wesnoth-lib" @@ -60,7 +58,7 @@ void modification_queue::pop() size_t modification_queue::size() const { size_t count = 0; - BOOST_FOREACH ( const map_type::value_type & pair, priorities_ ) + for (const map_type::value_type & pair : priorities_) count += pair.second.size(); return count; } @@ -138,8 +136,7 @@ modification_queue modification::decode(const std::string& encoded_mods) { modification_queue mods; - BOOST_FOREACH(const std::string& encoded_mod, - utils::parenthetical_split(encoded_mods, '~')) { + for(const std::string& encoded_mod : utils::parenthetical_split(encoded_mods, '~')) { modification* mod = decode_modification(encoded_mod); if(mod) { diff --git a/src/language.cpp b/src/language.cpp index 61bbbd0a86cd..1c7faf0cbbe0 100644 --- a/src/language.cpp +++ b/src/language.cpp @@ -25,7 +25,6 @@ #include #include #include -#include #ifdef _WIN32 #include @@ -106,7 +105,7 @@ bool load_language_list() known_languages.push_back( language_def("", t_string(N_("System default language"), "wesnoth"), "ltr", "", "A")); - BOOST_FOREACH(const config &lang, cfg.child_range("locale")) + for (const config &lang : cfg.child_range("locale")) { known_languages.push_back( language_def(lang["locale"], lang["name"], lang["dir"], @@ -236,9 +235,9 @@ bool load_strings(bool complain) std::cerr << "No [language] block found\n"; return false; } - BOOST_FOREACH(const config &lang, languages_) { + for (const config &lang : languages_) { DBG_G << "[language]\n"; - BOOST_FOREACH(const config::attribute &j, lang.attribute_range()) { + for (const config::attribute &j : lang.attribute_range()) { DBG_G << j.first << "=\"" << j.second << "\"\n"; strings_[j.first] = j.second; } @@ -293,7 +292,7 @@ const language_def& get_locale() void init_textdomains(const config& cfg) { - BOOST_FOREACH(const config &t, cfg.child_range("textdomain")) + for (const config &t : cfg.child_range("textdomain")) { const std::string &name = t["name"]; const std::string &path = t["path"]; @@ -317,7 +316,7 @@ void init_textdomains(const config& cfg) bool init_strings(const config& cfg) { languages_.clear(); - BOOST_FOREACH(const config &l, cfg.child_range("language")) { + for (const config &l : cfg.child_range("language")) { languages_.push_back(l); } return load_strings(true); diff --git a/src/leader_scroll_dialog.cpp b/src/leader_scroll_dialog.cpp index 7d3505f34ea0..8c05a7d93e83 100644 --- a/src/leader_scroll_dialog.cpp +++ b/src/leader_scroll_dialog.cpp @@ -28,9 +28,6 @@ #include "resources.hpp" #include "units/unit.hpp" -// -//#include - /** * @namespace about * Display credits %about all contributors. diff --git a/src/log.cpp b/src/log.cpp index b426915d03a0..da0453ed5064 100644 --- a/src/log.cpp +++ b/src/log.cpp @@ -26,7 +26,6 @@ #include "log.hpp" -#include #include #include @@ -121,11 +120,11 @@ bool set_log_domain_severity(std::string const &name, int severity) { std::string::size_type s = name.size(); if (name == "all") { - BOOST_FOREACH(logd &l, *domains) { + for(logd &l : *domains) { l.second = severity; } } else if (s > 2 && name.compare(s - 2, 2, "/*") == 0) { - BOOST_FOREACH(logd &l, *domains) { + for(logd &l : *domains) { if (l.first.compare(0, s - 1, name, 0, s - 1) == 0) l.second = severity; } @@ -144,7 +143,7 @@ bool set_log_domain_severity(std::string const &name, const logger &lg) { std::string list_logdomains(const std::string& filter) { std::ostringstream res; - BOOST_FOREACH(logd &l, *domains) { + for(logd &l : *domains) { if(l.first.find(filter) != std::string::npos) res << l.first << "\n"; } diff --git a/src/log_windows.cpp b/src/log_windows.cpp index 8f5d75937b6f..f603d095b6d2 100644 --- a/src/log_windows.cpp +++ b/src/log_windows.cpp @@ -26,7 +26,6 @@ #include #include -#include #include #include diff --git a/src/map/label.cpp b/src/map/label.cpp index 4225ba7284eb..520d25a7c0ff 100644 --- a/src/map/label.cpp +++ b/src/map/label.cpp @@ -23,8 +23,6 @@ #include "tooltips.hpp" #include "formula/string_utils.hpp" -#include - //Our definition of map labels being obscured is if the tile is obscured, //or the tile below is obscured. This is because in the case where the tile //itself is visible, but the tile below is obscured, the bottom half of the @@ -87,7 +85,7 @@ void map_labels::read(const config &cfg) { clear_all(); - BOOST_FOREACH(const config &i, cfg.child_range("label")) + for (const config &i : cfg.child_range("label")) { const map_location loc(i, resources::gamedata); terrain_label *label = new terrain_label(*this, i); @@ -247,7 +245,7 @@ void map_labels::clear_map(label_map &m, bool force) void map_labels::clear_all() { - BOOST_FOREACH(team_label_map::value_type &m, labels_) + for (team_label_map::value_type &m : labels_) { clear_map(m.second, true); } @@ -256,9 +254,9 @@ void map_labels::clear_all() void map_labels::recalculate_labels() { - BOOST_FOREACH(team_label_map::value_type &m, labels_) + for (team_label_map::value_type &m : labels_) { - BOOST_FOREACH(label_map::value_type &l, m.second) + for (label_map::value_type &l : m.second) { l.second->recalculate(); } @@ -286,9 +284,9 @@ bool map_labels::visible_global_label(const map_location& loc) const void map_labels::recalculate_shroud() { - BOOST_FOREACH(team_label_map::value_type &m, labels_) + for (team_label_map::value_type &m : labels_) { - BOOST_FOREACH(label_map::value_type &l, m.second) + for (label_map::value_type &l : m.second) { l.second->calculate_shroud(); } @@ -304,8 +302,8 @@ const std::vector& map_labels::all_categories() const { categories.push_back("side:" + std::to_string(i)); } std::set unique_cats; - BOOST_FOREACH(const team_label_map::value_type& m, labels_) { - BOOST_FOREACH(const label_map::value_type& l, m.second) { + for (const team_label_map::value_type& m : labels_) { + for (const label_map::value_type& l : m.second) { if(l.second->category().empty()) continue; unique_cats.insert("cat:" + l.second->category()); } diff --git a/src/map/map.cpp b/src/map/map.cpp index 8ea4fc8967e6..0508e0ebce9a 100644 --- a/src/map/map.cpp +++ b/src/map/map.cpp @@ -36,7 +36,6 @@ #include #include -#include static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -349,7 +348,7 @@ void gamemap::overlay(const gamemap& m, const config& rules_cfg, int xpos, int y // See if there is a matching rule const overlay_rule* rule = nullptr; - BOOST_FOREACH(const overlay_rule& current_rule, rules) + for(const overlay_rule& current_rule : rules) { if(!current_rule.old_.empty() && !t_translation::terrain_matches(current, current_rule.old_)) { continue; diff --git a/src/menu_events.cpp b/src/menu_events.cpp index dde1a593efe2..4c6cc021e550 100644 --- a/src/menu_events.cpp +++ b/src/menu_events.cpp @@ -81,7 +81,6 @@ #include "whiteboard/manager.hpp" #include "widgets/combo.hpp" -#include #include static lg::log_domain log_engine("engine"); @@ -622,7 +621,7 @@ void menu_handler::recall(int side_num, const map_location &last_hex) DBG_WB <<"menu_handler::recall: Contents of wb-modified recall list:\n"; - BOOST_FOREACH(const unit_const_ptr & unit, *recall_list_team) + for(const unit_const_ptr & unit : *recall_list_team) { DBG_WB << unit->name() << " [" << unit->id() <<"]\n"; } @@ -1418,7 +1417,7 @@ class map_command_handler std::vector get_commands_list() const { std::vector res; - BOOST_FOREACH(typename command_map::value_type i, command_map_) { + for(typename command_map::value_type i : command_map_) { res.push_back(i.first); } return res; @@ -1509,7 +1508,7 @@ class map_command_handler } std::stringstream ss; bool show_unavail = show_unavailable_ || get_arg(1) == "all"; - BOOST_FOREACH(typename command_map::value_type i, command_map_) { + for(typename command_map::value_type i : command_map_) { if (show_unavail || is_enabled(i.second)) { ss << i.first; //if (!i.second.usage.empty()) { @@ -1594,7 +1593,7 @@ class map_command_handler { std::vector aliases; typedef command_alias_map::value_type p; - BOOST_FOREACH(p i, command_alias_map_) { + for(p i : command_alias_map_) { if (i.second == cmd) { aliases.push_back(i.first); } @@ -2008,7 +2007,7 @@ class console_handler : public map_command_handler, private cha if (const config &alias_list = preferences::get_alias()) { - BOOST_FOREACH(const config::attribute &a, alias_list.attribute_range()) { + for(const config::attribute &a : alias_list.attribute_range()) { register_alias(a.second, a.first); } } @@ -2696,7 +2695,7 @@ void console_handler::do_layers() { tile->rebuild_cache(tod_id, &tile_logs); int order = 1; - BOOST_FOREACH(const terrain_builder::tile::log_details det, tile_logs) { + for(const terrain_builder::tile::log_details det : tile_logs) { const terrain_builder::tile::rule_image_rand& ri = *det.first; const terrain_builder::rule_image_variant& variant = *det.second; @@ -2800,7 +2799,7 @@ void console_handler::do_next_level() void console_handler::do_choose_level() { std::vector options; int next = 0, nb = 0; - BOOST_FOREACH(const config &sc, menu_handler_.game_config_.child_range("scenario")) + for(const config &sc : menu_handler_.game_config_.child_range("scenario")) { const std::string &id = sc["id"]; options.push_back(id); @@ -2811,7 +2810,7 @@ void console_handler::do_choose_level() { // find scenarios of multiplayer campaigns // (assumes that scenarios are ordered properly in the game_config) std::string scenario = menu_handler_.pc_.get_mp_settings().mp_scenario; - BOOST_FOREACH(const config &mp, menu_handler_.game_config_.child_range("multiplayer")) + for(const config &mp : menu_handler_.game_config_.child_range("multiplayer")) { if (mp["id"] == scenario) { @@ -2980,7 +2979,7 @@ void console_handler::do_unit() { } void console_handler::do_discover() { - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &i, unit_types.types()) { + for(const unit_type_data::unit_type_map::value_type &i : unit_types.types()) { preferences::encountered_units().insert(i.second.id()); } } diff --git a/src/minimap.cpp b/src/minimap.cpp index 9289753fc41c..ea387c298d0c 100644 --- a/src/minimap.cpp +++ b/src/minimap.cpp @@ -31,8 +31,6 @@ #include "game_display.hpp" -#include - #include "preferences.hpp" static lg::log_domain log_display("display"); @@ -193,7 +191,7 @@ surface getMinimap(int w, int h, const gamemap &map, const team *vw, const std:: bool first = true; const t_translation::t_list& underlying_terrains = tdata.underlying_union_terrain(terrain); - BOOST_FOREACH(const t_translation::t_terrain& underlying_terrain, underlying_terrains) { + for(const t_translation::t_terrain& underlying_terrain : underlying_terrains) { const std::string& terrain_id = tdata.get_terrain_info(underlying_terrain).id(); std::map::const_iterator it = game_config::team_rgb_range.find(terrain_id); @@ -355,7 +353,7 @@ SDL_Rect draw_minimap(CVideo &video, const SDL_Rect &area, const gamemap &map, c bool first = true; const t_translation::t_list& underlying_terrains = tdata.underlying_union_terrain(terrain); - BOOST_FOREACH(const t_translation::t_terrain& underlying_terrain, underlying_terrains) { + for(const t_translation::t_terrain& underlying_terrain : underlying_terrains) { const std::string& terrain_id = tdata.get_terrain_info(underlying_terrain).id(); std::map::const_iterator it = game_config::team_rgb_range.find(terrain_id); diff --git a/src/mouse_events.cpp b/src/mouse_events.cpp index 675d65e48f90..b81fe4d4c0c1 100644 --- a/src/mouse_events.cpp +++ b/src/mouse_events.cpp @@ -54,7 +54,6 @@ #include "whiteboard/typedefs.hpp" // for whiteboard_lock #include "wml_separators.hpp" // for COLUMN_SEPARATOR, etc -#include // for auto_any_base, etc #include // for intrusive_ptr #include // for shared_ptr #include // for assert @@ -1068,7 +1067,7 @@ std::set mouse_handler::get_adj_enemies(const map_location& loc, i map_location adj[6]; get_adjacent_tiles(loc, adj); - BOOST_FOREACH(const map_location &aloc, adj) { + for(const map_location &aloc : adj) { unit_map::const_iterator i = find_unit(aloc); if (i && uteam.is_enemy(i->side())) res.insert(aloc); @@ -1095,7 +1094,7 @@ void mouse_handler::show_attack_options(const unit_map::const_iterator &u) // Check each adjacent hex. map_location adj[6]; get_adjacent_tiles(u->get_location(), adj); - BOOST_FOREACH(const map_location &loc, adj) + for(const map_location &loc : adj) { // No attack option shown if no visible unit present. // (Visible to current team, not necessarily the unit's team.) diff --git a/src/movetype.cpp b/src/movetype.cpp index 5ea31a580e29..89e7c381c8a1 100644 --- a/src/movetype.cpp +++ b/src/movetype.cpp @@ -28,7 +28,6 @@ #include "units/types.hpp" // for attack_type #include -#include #include @@ -171,12 +170,12 @@ bool movetype::terrain_info::data::config_has_changes(const config & new_values, bool overwrite) const { if ( overwrite ) { - BOOST_FOREACH( const config::attribute & a, new_values.attribute_range() ) + for (const config::attribute & a : new_values.attribute_range()) if ( a.second != cfg_[a.first] ) return true; } else { - BOOST_FOREACH( const config::attribute & a, new_values.attribute_range() ) + for (const config::attribute & a : new_values.attribute_range()) if ( a.second.to_int() != 0 ) return true; } @@ -202,7 +201,7 @@ void movetype::terrain_info::data::merge(const config & new_values, bool overwri // change "merge_attributes" to "merge_with".) cfg_.merge_attributes(new_values); else { - BOOST_FOREACH( const config::attribute & a, new_values.attribute_range() ) { + for (const config::attribute & a : new_values.attribute_range()) { config::attribute_value & dest = cfg_[a.first]; int old = dest.to_int(params_.max_value); @@ -632,8 +631,9 @@ utils::string_map movetype::resistances::damage_table() const { utils::string_map result; - BOOST_FOREACH( const config::attribute & attrb, cfg_.attribute_range() ) + for (const config::attribute & attrb : cfg_.attribute_range()) { result[attrb.first] = attrb.second; + } return result; } @@ -669,7 +669,7 @@ void movetype::resistances::merge(const config & new_data, bool overwrite) // change "merge_attributes" to "merge_with".) cfg_.merge_attributes(new_data); else - BOOST_FOREACH( const config::attribute & a, new_data.attribute_range() ) { + for (const config::attribute & a : new_data.attribute_range()) { config::attribute_value & dest = cfg_[a.first]; dest = std::max(0, dest.to_int(100) + a.second.to_int(0)); } @@ -740,9 +740,10 @@ movetype::movetype(const movetype & that) : * Checks if we have a defense cap (nontrivial min value) for any of the given terrain types. */ bool movetype::has_terrain_defense_caps(const std::set & ts) const { - BOOST_FOREACH(const t_translation::t_terrain & t, ts) + for (const t_translation::t_terrain & t : ts) { if (defense_.capped(t)) return true; + } return false; } @@ -752,20 +753,25 @@ bool movetype::has_terrain_defense_caps(const std::set */ void movetype::merge(const config & new_cfg, bool overwrite) { - BOOST_FOREACH( const config & child, new_cfg.child_range("movement_costs") ) + for (const config & child : new_cfg.child_range("movement_costs")) { movement_.merge(child, overwrite); + } - BOOST_FOREACH( const config & child, new_cfg.child_range("vision_costs") ) + for (const config & child : new_cfg.child_range("vision_costs")) { vision_.merge(child, overwrite); + } - BOOST_FOREACH( const config & child, new_cfg.child_range("jamming_costs") ) + for (const config & child : new_cfg.child_range("jamming_costs")) { jamming_.merge(child, overwrite); + } - BOOST_FOREACH( const config & child, new_cfg.child_range("defense") ) + for (const config & child : new_cfg.child_range("defense")) { defense_.merge(child, overwrite); + } - BOOST_FOREACH( const config & child, new_cfg.child_range("resistance") ) + for (const config & child : new_cfg.child_range("resistance")) { resist_.merge(child, overwrite); + } // "flies" is used when WML defines a movetype. // "flying" is used when WML defines a unit. diff --git a/src/mp_game_settings.cpp b/src/mp_game_settings.cpp index 13b18b134af9..63932a45d7ec 100644 --- a/src/mp_game_settings.cpp +++ b/src/mp_game_settings.cpp @@ -22,8 +22,6 @@ #include "mp_game_settings.hpp" #include "formula/string_utils.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) #define WRN_NG LOG_STREAM(warn, log_engine) @@ -95,7 +93,7 @@ mp_game_settings::mp_game_settings(const config& cfg) , options(cfg.child_or_empty("options")) , addons() { - BOOST_FOREACH(const config & a, cfg.child_range("addon")) { + for (const config & a : cfg.child_range("addon")) { if (!a["id"].empty()) { addons.insert(std::make_pair(a["id"].str(), addon_version_info(a))); } @@ -135,7 +133,7 @@ config mp_game_settings::to_config() const cfg.add_child("options", options); typedef std::map::value_type ttt; - BOOST_FOREACH(const ttt & p, addons) { + for (const ttt & p : addons) { config & c = cfg.add_child("addon"); p.second.write(c); c["id"] = p.first; diff --git a/src/pathfind/pathfind.cpp b/src/pathfind/pathfind.cpp index 378e2fd4c700..166dd3a9cbce 100644 --- a/src/pathfind/pathfind.cpp +++ b/src/pathfind/pathfind.cpp @@ -34,8 +34,6 @@ #include "units/map.hpp" #include "wml_exception.hpp" -#include - #include #include #include @@ -78,7 +76,7 @@ map_location find_vacant_tile(const map_location& loc, VACANT_TILE_TYPE vacancy, std::set tiles_checking; tiles_checking.swap(pending_tiles_to_check); //Iterate over all the hexes we need to check - BOOST_FOREACH(const map_location &loc, tiles_checking) + for (const map_location &loc : tiles_checking) { // Skip shrouded locations. if ( do_shroud && shroud_check->shrouded(loc) ) @@ -98,7 +96,7 @@ map_location find_vacant_tile(const map_location& loc, VACANT_TILE_TYPE vacancy, if (units.find(loc) == units.end() && !pass_check_and_unreachable) return loc; map_location adjs[6]; get_adjacent_tiles(loc,adjs); - BOOST_FOREACH(const map_location &loc, adjs) + for (const map_location &loc : adjs) { if (!map.on_board(loc)) continue; // Add the tile to be checked if it hasn't already been and diff --git a/src/pathfind/teleport.cpp b/src/pathfind/teleport.cpp index e788e5a7d7ed..4b893f427e8d 100644 --- a/src/pathfind/teleport.cpp +++ b/src/pathfind/teleport.cpp @@ -25,8 +25,6 @@ #include "units/filter.hpp" #include "units/map.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_PF LOG_STREAM(err, log_engine) @@ -167,18 +165,20 @@ teleport_map::teleport_map( , targets_() { - BOOST_FOREACH(const teleport_group& group, groups) { + for (const teleport_group& group : groups) { teleport_pair locations; group.get_teleport_pair(locations, u, ignore_units); if (!see_all && !group.always_visible() && viewing_team.is_enemy(u.side())) { teleport_pair filter_locs; - BOOST_FOREACH(const map_location &loc, locations.first) + for (const map_location &loc : locations.first) { if(!viewing_team.fogged(loc)) filter_locs.first.insert(loc); - BOOST_FOREACH(const map_location &loc, locations.second) + } + for (const map_location &loc : locations.second) { if(!viewing_team.fogged(loc)) filter_locs.second.insert(loc); + } locations.first.swap(filter_locs.first); locations.second.swap(filter_locs.second); } @@ -237,7 +237,7 @@ const teleport_map get_teleport_locations(const unit &u, std::vector groups; if (u.get_ability_bool("teleport")) { - BOOST_FOREACH (const unit_ability & teleport, u.get_abilities("teleport")) { + for (const unit_ability & teleport : u.get_abilities("teleport")) { const int tunnel_count = (teleport.first)->child_count("tunnel"); for(int i = 0; i < tunnel_count; ++i) { config teleport_group_cfg = (teleport.first)->child("tunnel", i); diff --git a/src/pathutils.cpp b/src/pathutils.cpp index 7f1971b93cf1..dde5450cafbf 100644 --- a/src/pathutils.cpp +++ b/src/pathutils.cpp @@ -23,8 +23,6 @@ #include "map/map.hpp" -#include - /** * Function that will add to @a result all locations exactly @a radius tiles @@ -109,7 +107,7 @@ namespace { // Helpers for get_tiles_radius() without a radius filter. // Perform this conversion once. const int radius_i = static_cast(radius); - BOOST_FOREACH (const map_location &loc, locs) + for (const map_location &loc : locs) if ( loc != map_location::null_location() ) { // Calculate the circle of hexes around this one. @@ -160,7 +158,7 @@ namespace { // Helpers for get_tiles_radius() without a radius filter. // Note: This hint will get incremented later, which is the only // reason we require result to be initially non-empty. - BOOST_FOREACH (const column_ranges::value_type & column, collected_tiles) + for (const column_ranges::value_type & column : collected_tiles) { // For this loop, the order within the set is crucial; we need // rows.first to be non-decreasing with each iteration. @@ -168,7 +166,7 @@ namespace { // Helpers for get_tiles_radius() without a radius filter. // have been processed and either added to result or skipped. // There is no going back (nor a need to). int next_row = row_begin; - BOOST_FOREACH (const row_range &rows, column.second) + for (const row_range &rows : column.second) { // Skipping some rows? if ( next_row < rows.first ) diff --git a/src/persist_manager.cpp b/src/persist_manager.cpp index 126f94d4d1a3..af30fd594b02 100644 --- a/src/persist_manager.cpp +++ b/src/persist_manager.cpp @@ -15,8 +15,6 @@ #include "persist_context.hpp" #include "persist_manager.hpp" -#include - persist_manager::persist_manager() : in_transaction_(false) , contexts_() @@ -46,7 +44,7 @@ persist_context &persist_manager::get_context(const std::string &ns) bool persist_manager::start_transaction() { if (in_transaction_) return false; bool result = true; - BOOST_FOREACH(context_map::reference ctx, contexts_){ + for (context_map::reference ctx : contexts_) { result &= ctx.second->start_transaction(); } in_transaction_ = true; @@ -56,7 +54,7 @@ bool persist_manager::start_transaction() { bool persist_manager::end_transaction() { if (!in_transaction_) return false; bool result = true; - BOOST_FOREACH(context_map::reference ctx, contexts_){ + for (context_map::reference ctx : contexts_) { result &= ctx.second->end_transaction(); } in_transaction_ = !result; @@ -66,7 +64,7 @@ bool persist_manager::end_transaction() { bool persist_manager::cancel_transaction() { if (!in_transaction_) return false; bool result = true; - BOOST_FOREACH(context_map::reference ctx, contexts_){ + for (context_map::reference ctx : contexts_) { result &= ctx.second->cancel_transaction(); } in_transaction_ = false; diff --git a/src/play_controller.cpp b/src/play_controller.cpp index c7496ebef4b5..ba583c2e83c1 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -64,7 +64,6 @@ #include "whiteboard/manager.hpp" #include "wml_exception.hpp" -#include #include static lg::log_domain log_aitesting("aitesting"); @@ -111,12 +110,12 @@ static void copy_persistent(const config& src, config& dst) ("lua") .convert_to_container(); - BOOST_FOREACH(const std::string& attr, attrs) + for (const std::string& attr : attrs) { dst[attr] = src[attr]; } - BOOST_FOREACH(const std::string& tag, tags) + for (const std::string& tag : tags) { dst.append_children(src, tag); } @@ -374,7 +373,7 @@ void play_controller::fire_prestart() // Fire these right before prestart events, to catch only the units sides // have started with. - BOOST_FOREACH(const unit& u, gamestate().board_.units()) { + for (const unit& u : gamestate().board_.units()) { pump().fire("unit placed", map_location(u.get_location())); } @@ -392,7 +391,7 @@ void play_controller::fire_start() check_objectives(); // prestart and start events may modify the initial gold amount, // reflect any changes. - BOOST_FOREACH(team& tm, gamestate().board_.teams_) + for (team& tm : gamestate().board_.teams_) { tm.set_start_gold(tm.gold()); } @@ -580,7 +579,7 @@ bool play_controller::enemies_visible() const return true; // See if any enemies are visible - BOOST_FOREACH(const unit& u, gamestate().board_.units()) { + for (const unit& u : gamestate().board_.units()) { if (current_team().is_enemy(u.side()) && !gui_->fogged(u.get_location())) { return true; } @@ -630,7 +629,7 @@ void play_controller::tab() switch(mode) { case gui::TEXTBOX_SEARCH: { - BOOST_FOREACH(const unit& u, gamestate().board_.units()){ + for (const unit& u : gamestate().board_.units()){ const map_location& loc = u.get_location(); if(!gui_->fogged(loc) && !(gamestate().board_.teams()[gui_->viewing_team()].is_enemy(u.side()) && u.invisible(loc))) @@ -647,18 +646,18 @@ void play_controller::tab() } case gui::TEXTBOX_MESSAGE: { - BOOST_FOREACH(const team& t, gamestate().board_.teams()) { + for (const team& t : gamestate().board_.teams()) { if(!t.is_empty()) dictionary.insert(t.current_player()); } // Add observers - BOOST_FOREACH(const std::string& o, gui_->observers()){ + for (const std::string& o : gui_->observers()){ dictionary.insert(o); } // Add nicks who whispered you - BOOST_FOREACH(const std::string& w, gui_->get_chat_manager().whisperers()){ + for (const std::string& w : gui_->get_chat_manager().whisperers()){ dictionary.insert(w); } @@ -972,7 +971,7 @@ void play_controller::check_victory() if (gui_->video().non_interactive()) { LOG_AIT << "winner: "; - BOOST_FOREACH(unsigned l, not_defeated) { + for (unsigned l : not_defeated) { std::string ai = ai::manager::get_active_ai_identifier_for_side(l); if (ai.empty()) ai = "default ai"; LOG_AIT << l << " (using " << ai << ") "; @@ -1113,7 +1112,7 @@ void play_controller::start_game() sync.do_final_checkup(); gui_->recalculate_minimap(); // Initialize countdown clock. - BOOST_FOREACH(const team& t, gamestate().board_.teams()) + for (const team& t : gamestate().board_.teams()) { if (saved_game_.mp_settings().mp_countdown) { t.set_countdown_time(1000 * saved_game_.mp_settings().mp_countdown_init_time); @@ -1138,7 +1137,7 @@ bool play_controller::can_use_synced_wml_menu() const std::set play_controller::all_players() const { std::set res = gui_->observers(); - BOOST_FOREACH(const team& t, get_teams_const()) + for (const team& t : get_teams_const()) { if (t.is_human()) { res.insert(t.current_player()); diff --git a/src/playmp_controller.cpp b/src/playmp_controller.cpp index 752b88c90c88..face0db56ab1 100644 --- a/src/playmp_controller.cpp +++ b/src/playmp_controller.cpp @@ -37,8 +37,6 @@ #include "synced_context.hpp" #include "replay_helper.hpp" -#include - static lg::log_domain log_engine("engine"); #define LOG_NG LOG_STREAM(info, log_engine) diff --git a/src/playsingle_controller.cpp b/src/playsingle_controller.cpp index 3ea805b7cedc..0845f4d56849 100644 --- a/src/playsingle_controller.cpp +++ b/src/playsingle_controller.cpp @@ -57,8 +57,6 @@ #include "whiteboard/manager.hpp" #include "hotkey/hotkey_item.hpp" -#include - static lg::log_domain log_aitesting("aitesting"); #define LOG_AIT LOG_STREAM(info, log_aitesting) //If necessary, this define can be replaced with `#define LOG_AIT std::cout` to restore previous behavior @@ -216,7 +214,7 @@ LEVEL_RESULT playsingle_controller::play_scenario(const config& level) LOG_NG << "in playsingle_controller::play_scenario()...\n"; // Start music. - BOOST_FOREACH(const config &m, level.child_range("music")) { + for(const config &m : level.child_range("music")) { sound::play_music_config(m); } sound::commit_music_changes(); @@ -228,7 +226,7 @@ LEVEL_RESULT playsingle_controller::play_scenario(const config& level) // Read sound sources assert(soundsources_manager_ != nullptr); - BOOST_FOREACH(const config &s, level.child_range("sound_source")) { + for (const config &s : level.child_range("sound_source")) { try { soundsource::sourcespec spec(s); soundsources_manager_->add(spec); diff --git a/src/playturn.cpp b/src/playturn.cpp index 25ae9b9a0977..bd7dacb33599 100644 --- a/src/playturn.cpp +++ b/src/playturn.cpp @@ -41,7 +41,6 @@ #include "whiteboard/manager.hpp" // for manager #include "widgets/button.hpp" // for button -#include // for auto_any_base, etc #include // for shared_ptr #include // for assert #include // for atoi @@ -257,7 +256,7 @@ turn_info::PROCESS_DATA_RESULT turn_info::process_network_data(const config& cfg first_observer_option_idx = options.size(); //get all observers in as options to transfer control - BOOST_FOREACH(const std::string &ob, resources::screen->observers()) + for (const std::string &ob : resources::screen->observers()) { t_vars["player"] = ob; options.push_back(vgettext("Replace with $player", t_vars)); @@ -267,7 +266,7 @@ turn_info::PROCESS_DATA_RESULT turn_info::process_network_data(const config& cfg const team &tm = resources::gameboard->teams()[index]; //get all allies in as options to transfer control - BOOST_FOREACH(const team &t, resources::gameboard->teams()) + for (const team &t : resources::gameboard->teams()) { if (!t.is_enemy(side_drop) && !t.is_local_human() && !t.is_local_ai() && !t.is_network_ai() && !t.is_empty() && t.current_player() != tm.current_player()) diff --git a/src/preferences_display.cpp b/src/preferences_display.cpp index 065a8e270032..f40dee5f8999 100644 --- a/src/preferences_display.cpp +++ b/src/preferences_display.cpp @@ -36,7 +36,6 @@ #include "gui/widgets/window.hpp" #include "log.hpp" -#include #include namespace preferences { diff --git a/src/quit_confirmation.cpp b/src/quit_confirmation.cpp index 81ad34f2dccf..10fa4104e160 100644 --- a/src/quit_confirmation.cpp +++ b/src/quit_confirmation.cpp @@ -19,7 +19,7 @@ #include "gui/dialogs/message.hpp" #include "gui/widgets/window.hpp" #include "resources.hpp" -#include +#include std::vector quit_confirmation::blockers_ = std::vector(); bool quit_confirmation::open_ = false; @@ -28,7 +28,7 @@ bool quit_confirmation::quit() { if(!open_) { open_ = true; - BOOST_REVERSE_FOREACH(quit_confirmation* blocker, blockers_) + for(quit_confirmation* blocker : boost::adaptors::reverse(blockers_)) { if(!blocker->prompt_()) { open_ = false; diff --git a/src/recall_list_manager.cpp b/src/recall_list_manager.cpp index 321cc53c5114..d45b3d18fa0c 100644 --- a/src/recall_list_manager.cpp +++ b/src/recall_list_manager.cpp @@ -21,7 +21,6 @@ #include #include -#include static bool find_if_matches_helper(const unit_ptr & ptr, const std::string & unit_id) { diff --git a/src/replay.cpp b/src/replay.cpp index d5aa937b7a23..caa417b48585 100644 --- a/src/replay.cpp +++ b/src/replay.cpp @@ -41,7 +41,6 @@ #include "whiteboard/manager.hpp" #include "replay_recorder_base.hpp" -#include #include #include #include @@ -71,7 +70,7 @@ static void verify(const unit_map& units, const config& cfg) { << nunits << " according to data source. " << units.size() << " locally\n"; std::set locs; - BOOST_FOREACH(const config &u, cfg.child_range("unit")) + for (const config &u : cfg.child_range("unit")) { const map_location loc(u); locs.insert(loc); @@ -92,7 +91,7 @@ static void verify(const unit_map& units, const config& cfg) { errbuf.clear(); } - BOOST_FOREACH(const config &un, cfg.child_range("unit")) + for (const config &un : cfg.child_range("unit")) { const map_location loc(un); const unit_map::const_iterator u = units.find(loc); @@ -411,7 +410,7 @@ config replay::get_data_range(int cmd_start, int cmd_end, DATA_TYPE data_type) void replay::redo(const config& cfg) { assert(base_->get_pos() == ncommands()); - BOOST_FOREACH(const config &cmd, cfg.child_range("command")) + for (const config &cmd : cfg.child_range("command")) { base_->add_child() = cmd; } @@ -627,7 +626,7 @@ bool replay::empty() void replay::add_config(const config& cfg, MARK_SENT mark) { - BOOST_FOREACH(const config &cmd, cfg.child_range("command")) + for (const config &cmd : cfg.child_range("command")) { config &cfg = base_->insert_command(base_->size()); cfg = cmd; diff --git a/src/replay_controller.cpp b/src/replay_controller.cpp index abe9545843b3..3eafef3e4fab 100644 --- a/src/replay_controller.cpp +++ b/src/replay_controller.cpp @@ -23,7 +23,6 @@ #include "config_assign.hpp" #include "playsingle_controller.hpp" -#include #include static lg::log_domain log_engine("engine"); diff --git a/src/replay_recorder_base.cpp b/src/replay_recorder_base.cpp index a8c40db8c17a..84db844afe8f 100644 --- a/src/replay_recorder_base.cpp +++ b/src/replay_recorder_base.cpp @@ -2,8 +2,6 @@ #include "replay_recorder_base.hpp" #include "serialization/binary_or_text.hpp" -#include - replay_recorder_base::replay_recorder_base(void) : upload_log_() , commands_() @@ -89,7 +87,7 @@ void replay_recorder_base::append_config(const config& data) { upload_log_ = upload_log; } - BOOST_FOREACH(const config& command, data.child_range("command")) + for(const config& command : data.child_range("command")) { commands_.push_back(new config(command)); } @@ -101,7 +99,7 @@ void replay_recorder_base::append_config(config& data) { upload_log_.swap(upload_log); } - BOOST_FOREACH(config& command, data.child_range("command")) + for(config& command : data.child_range("command")) { config* new_config = new config(); new_config->swap(command); diff --git a/src/reports.cpp b/src/reports.cpp index 9a63cb80a9cc..04d811151020 100644 --- a/src/reports.cpp +++ b/src/reports.cpp @@ -34,7 +34,6 @@ #include "units/helper.hpp" #include "whiteboard/manager.hpp" -#include #include #include @@ -261,7 +260,7 @@ REPORT_GENERATOR(unit_amla, rc) if (!u) return config(); config res; typedef std::pair pair_string; - BOOST_FOREACH(const pair_string &ps, u->amla_icons()) { + for (const pair_string &ps : u->amla_icons()) { add_image(res, ps.first, ps.second); } return res; @@ -420,7 +419,7 @@ static config unit_hp(reports::context& rc, const unit* u) bool att_def_diff = false; map_location displayed_unit_hex = rc.screen().displayed_unit_hex(); - BOOST_FOREACH(const utils::string_map::value_type &resist, u->get_base_resistances()) + for (const utils::string_map::value_type &resist : u->get_base_resistances()) { std::ostringstream line; line << translation::gettext(resist.first.c_str()) << ": "; @@ -446,7 +445,7 @@ static config unit_hp(reports::context& rc, const unit* u) if (att_def_diff) tooltip << _("(Att / Def)"); tooltip << '\n'; - BOOST_FOREACH(const std::string &line, resistances_table) { + for (const std::string &line : resistances_table) { tooltip << line; } return text_report(str.str(), tooltip.str()); @@ -489,7 +488,7 @@ static config unit_advancement_options(const unit* u) if (!u) return config(); config res; typedef std::pair pair_string; - BOOST_FOREACH(const pair_string &ps, u->advancement_icons()) { + for (const pair_string &ps : u->advancement_icons()) { add_image(res, ps.first, ps.second); } return res; @@ -527,7 +526,7 @@ static config unit_defense(reports::context & rc, const unit* u, const map_locat if (underlyings.size() != 1 || underlyings.front() != terrain) { bool revert = false; - BOOST_FOREACH(const t_translation::t_terrain &t, underlyings) + for (const t_translation::t_terrain &t : underlyings) { if (t == t_translation::MINUS) { revert = true; @@ -757,7 +756,7 @@ static int attack_info(reports::context & rc, const attack_type &at, config &res std::set seen_types; const team &unit_team = rc.teams()[u.side() - 1]; const team &viewing_team = rc.teams()[rc.screen().viewing_team()]; - BOOST_FOREACH(const unit &enemy, rc.units()) + for (const unit &enemy : rc.units()) { if (enemy.incapacitated()) //we can't attack statues so don't display them in this tooltip continue; @@ -775,7 +774,7 @@ static int attack_info(reports::context & rc, const attack_type &at, config &res } typedef std::pair > resist_units; - BOOST_FOREACH(const resist_units &resist, resistances) { + for (const resist_units &resist : resistances) { int damage = round_damage(specials_damage, damage_multiplier * resist.first, damage_divisor); tooltip << "" << damage << " " << "(" << utils::signed_percent(resist.first-100) << ") : " @@ -872,7 +871,7 @@ static config unit_weapons(reports::context & rc, const unit *attacker, const ma } } - BOOST_FOREACH(const battle_context& weapon, weapons) { + for (const battle_context& weapon : weapons) { // Predict the battle outcome. combatant attacker_combatant(weapon.get_attacker_stats()); @@ -992,7 +991,7 @@ static config unit_weapons(reports::context & rc, const unit *u) //add_text(res, /*span_color(font::weapon_details_color) // +*/ attack_headline /*+ "\n"*/ + '\n', ""); - BOOST_FOREACH(const attack_type &at, u->attacks()) + for (const attack_type &at : u->attacks()) { attack_info(rc, at, res, *u, displayed_unit_hex); } @@ -1082,7 +1081,7 @@ REPORT_GENERATOR(tod_stats, rc) int current = rc.tod().get_current_time(hex); int i = 0; - BOOST_FOREACH(const time_of_day& tod, schedule) { + for (const time_of_day& tod : schedule) { if (i == current) tooltip << ""; tooltip << tod.name << "\n"; if (i == current) tooltip << ""; @@ -1198,7 +1197,7 @@ static config unit_box_at(reports::context & rc, const map_location& mouseover_h std::string bg_terrain_image; - BOOST_FOREACH(const t_translation::t_terrain& underlying_terrain, underlying_terrains) { + for (const t_translation::t_terrain& underlying_terrain : underlying_terrains) { const std::string& terrain_id = map.get_terrain_info(underlying_terrain).id(); bg_terrain_image = "~BLIT(unit_env/terrain/terrain-" + terrain_id + ".png)" + bg_terrain_image; } @@ -1265,7 +1264,7 @@ REPORT_GENERATOR(villages, rc) str << td.villages << '/'; if (viewing_team.uses_shroud()) { int unshrouded_villages = 0; - BOOST_FOREACH(const map_location &loc, rc.map().villages()) { + for (const map_location &loc : rc.map().villages()) { if (!viewing_team.shrouded(loc)) ++unshrouded_villages; } @@ -1370,7 +1369,7 @@ REPORT_GENERATOR(terrain_info, rc) // } const t_translation::t_list& underlying_terrains = map.underlying_union_terrain(terrain); - BOOST_FOREACH(const t_translation::t_terrain& underlying_terrain, underlying_terrains) { + for (const t_translation::t_terrain& underlying_terrain : underlying_terrains) { if (underlying_terrain == t_translation::OFF_MAP_USER) continue; @@ -1495,7 +1494,7 @@ REPORT_GENERATOR(observers, rc) std::ostringstream str; str << _("Observers:") << '\n'; - BOOST_FOREACH(const std::string &obs, observers) { + for (const std::string &obs : observers) { str << obs << '\n'; } return image_report(game_config::images::observer, str.str()); @@ -1583,10 +1582,10 @@ config reports::generate_report(const std::string &name, reports::context & rc, const std::set &reports::report_list() { if (!all_reports_.empty()) return all_reports_; - BOOST_FOREACH(const static_report_generators::value_type &v, static_generators) { + for (const static_report_generators::value_type &v : static_generators) { all_reports_.insert(v.first); } - BOOST_FOREACH(const dynamic_report_generators::value_type &v, dynamic_generators_) { + for (const dynamic_report_generators::value_type &v : dynamic_generators_) { all_reports_.insert(v.first); } return all_reports_; diff --git a/src/save_index.cpp b/src/save_index.cpp index e45d0d193453..da3e9c29a87e 100644 --- a/src/save_index.cpp +++ b/src/save_index.cpp @@ -29,7 +29,6 @@ #include "filesystem.hpp" #include "config.hpp" -#include static lg::log_domain log_engine("engine"); #define LOG_SAVE LOG_STREAM(info, log_engine) @@ -233,7 +232,7 @@ bool save_info_less_time::operator() (const save_info& a, const save_info& b) co } static std::istream* find_save_file(const std::string &name, const std::string &alt_name, const std::vector &suffixes) { - BOOST_FOREACH(const std::string &suf, suffixes) { + for (const std::string &suf : suffixes) { std::istream *file_stream = filesystem::istream_file(filesystem::get_saves_dir() + "/" + name + suf); if (file_stream->fail()) { delete file_stream; @@ -376,7 +375,7 @@ void extract_summary_from_config(config& cfg_save, config& cfg_summary) std::string leader_image; std::string leader_image_tc_modifier; - //BOOST_FOREACH(const config &p, cfg_save.child_range("player")) + //for (const config &p : cfg_save.child_range("player")) //{ // if (p["canrecruit"].to_bool(false))) { // leader = p["save_id"]; @@ -389,7 +388,7 @@ void extract_summary_from_config(config& cfg_save, config& cfg_summary) //{ if (const config &snapshot = *(has_snapshot ? &cfg_snapshot : &cfg_replay_start)) { - BOOST_FOREACH(const config &side, snapshot.child_range("side")) + for (const config &side : snapshot.child_range("side")) { if (side["controller"] != team::CONTROLLER::enum_to_string(team::CONTROLLER::HUMAN)) { continue; @@ -407,7 +406,7 @@ void extract_summary_from_config(config& cfg_save, config& cfg_summary) break; } - BOOST_FOREACH(const config &u, side.child_range("unit")) + for (const config &u : side.child_range("unit")) { if (u["canrecruit"].to_bool()) { leader = u["id"].str(); diff --git a/src/saved_game.cpp b/src/saved_game.cpp index 3d7c8f513377..be45b661aae1 100644 --- a/src/saved_game.cpp +++ b/src/saved_game.cpp @@ -63,7 +63,6 @@ #include #include -#include #include static lg::log_domain log_engine("engine"); @@ -173,7 +172,7 @@ void saved_game::set_defaults() "carryover_percentage", "carryover_add", }; - BOOST_FOREACH(config& side, starting_pos_.child_range("side")) + for(config& side : starting_pos_.child_range("side")) { // Set save_id default value directly after loading to its default to prevent different default behaviour in mp_connect code and sp code. if(side["save_id"].empty()) @@ -190,7 +189,7 @@ void saved_game::set_defaults() side["current_player"] = config::attribute_value(); } // Set some team specific values to their defaults specified in scenario - BOOST_FOREACH(const std::string& att_name, team_defaults) + for(const std::string& att_name : team_defaults) { const config::attribute_value* scenario_value = starting_pos_.get(att_name); config::attribute_value& team_value = side[att_name]; @@ -292,7 +291,7 @@ void saved_game::load_mod(const std::string& type, const std::string& id) } // Copy events - BOOST_FOREACH(const config& modevent, cfg.child_range("event")) + for(const config& modevent : cfg.child_range("event")) { if(modevent["enable_if"].empty() || variable_to_bool(carryover_.child_or_empty("variables"), modevent["enable_if"])) { @@ -300,12 +299,12 @@ void saved_game::load_mod(const std::string& type, const std::string& id) } } // Copy lua - BOOST_FOREACH(const config& modlua, cfg.child_range("lua")) + for(const config& modlua : cfg.child_range("lua")) { this->starting_pos_.add_child("lua", modlua); } // Copy load_resource - BOOST_FOREACH(const config& load_resource, cfg.child_range("load_resource")) + for(const config& load_resource : cfg.child_range("load_resource")) { this->starting_pos_.add_child("load_resource", load_resource); } @@ -336,12 +335,12 @@ void saved_game::expand_mp_events() // In the first iteration mod contains no [resource]s in all other iterations, mods contains only [resource]s do { - BOOST_FOREACH(modevents_entry& mod, mods) + for(modevents_entry& mod : mods) { load_mod(mod.type, mod.id); } mods.clear(); - BOOST_FOREACH(const config& cfg, starting_pos_.child_range("load_resource")) + for(const config& cfg : starting_pos_.child_range("load_resource")) { if(loaded_resources.find(cfg["id"].str()) == loaded_resources.end()) { mods.push_back(modevents_entry("resource", cfg["id"].str())); @@ -368,11 +367,11 @@ void saved_game::expand_mp_options() mods.push_back(modevents_entry("campaign", classification().campaign)); config& variables = carryover_.child_or_add("variables"); - BOOST_FOREACH(modevents_entry& mod, mods) + for(modevents_entry& mod : mods) { if(const config& cfg = this->mp_settings().options.find_child(mod.type, "id", mod.id)) { - BOOST_FOREACH(const config& option, cfg.child_range("option")) + for(const config& option : cfg.child_range("option")) { variables[option["id"]] = option["value"]; } @@ -399,7 +398,7 @@ void saved_game::expand_random_scenario() config scenario_new = random_generate_scenario(starting_pos_["scenario_generation"], starting_pos_.child("generator")); //Preserve "story" form the scenario toplevel. - BOOST_FOREACH(config& story, starting_pos_.child_range("story")) + for(config& story : starting_pos_.child_range("story")) { scenario_new.add_child("story", story); } @@ -434,7 +433,7 @@ void saved_game::expand_carryover() carryover_info sides(carryover_); sides.transfer_to(get_starting_pos()); - BOOST_FOREACH(config& side_cfg, get_starting_pos().child_range("side")) + for(config& side_cfg : get_starting_pos().child_range("side")) { sides.transfer_all_to(side_cfg); } @@ -567,13 +566,13 @@ void saved_game::update_label() void saved_game::cancel_orders() { - BOOST_FOREACH(config &side, this->starting_pos_.child_range("side")) + for(config &side : this->starting_pos_.child_range("side")) { // for humans "goto_x/y" is used for multi-turn-moves // for the ai "goto_x/y" is a way for wml to order the ai to move a unit to a certain place. // we want to cancel human order but not to break wml. if (side["controller"] != "human" && side["controller"] != "network") continue; - BOOST_FOREACH(config &unit, side.child_range("unit")) + for(config &unit : side.child_range("unit")) { unit["goto_x"] = -999; unit["goto_y"] = -999; @@ -583,7 +582,7 @@ void saved_game::cancel_orders() void saved_game::unify_controllers() { - BOOST_FOREACH(config &side, this->starting_pos_.child_range("side")) + for(config &side : this->starting_pos_.child_range("side")) { if (side["controller"] == "network") side["controller"] = "human"; @@ -640,7 +639,7 @@ void saved_game::set_data(config& cfg) } replay_data_ = replay_recorder_base(); //Serversided replays can contain multiple [replay] - BOOST_FOREACH(config& replay, cfg.child_range("replay")) + for(config& replay : cfg.child_range("replay")) { replay_data_.append_config(replay); } diff --git a/src/savegame.cpp b/src/savegame.cpp index a482f92d8f3d..1edf5691a19b 100644 --- a/src/savegame.cpp +++ b/src/savegame.cpp @@ -48,8 +48,6 @@ #include "units/id.hpp" #include "version.hpp" -#include - static lg::log_domain log_engine("engine"); #define LOG_SAVE LOG_STREAM(info, log_engine) #define ERR_SAVE LOG_STREAM(err, log_engine) @@ -128,7 +126,7 @@ void loadgame::show_difficulty_dialog() std::string campaign_id = summary_["campaign"]; - BOOST_FOREACH(const config &campaign, game_config_.child_range("campaign")) + for(const config &campaign : game_config_.child_range("campaign")) { if(campaign["id"] != campaign_id) { continue; @@ -674,7 +672,7 @@ static void convert_old_saves_1_11_0(config& cfg) //copy rng and menu items from toplevel to new carryover_sides carryover["random_seed"] = cfg["random_seed"]; carryover["random_calls"] = cfg["random_calls"]; - BOOST_FOREACH(const config& menu_item, cfg.child_range("menu_item")){ + for(const config& menu_item : cfg.child_range("menu_item")) { carryover.add_child("menu_item", menu_item); } carryover["difficulty"] = cfg["difficulty"]; @@ -686,28 +684,28 @@ static void convert_old_saves_1_11_0(config& cfg) //copy sides from either snapshot or replay_start to new carryover_sides if(!snapshot.empty()){ - BOOST_FOREACH(const config& side, snapshot.child_range("side")){ + for(const config& side : snapshot.child_range("side")) { carryover.add_child("side", side); } //for compatibility with old savegames that use player instead of side - BOOST_FOREACH(const config& side, snapshot.child_range("player")){ + for(const config& side : snapshot.child_range("player")) { carryover.add_child("side", side); } //save the sides from replay_start in carryover_sides_start - BOOST_FOREACH(const config& side, replay_start.child_range("side")){ + for(const config& side : replay_start.child_range("side")) { carryover_start.add_child("side", side); } //for compatibility with old savegames that use player instead of side - BOOST_FOREACH(const config& side, replay_start.child_range("player")){ + for(const config& side : replay_start.child_range("player")) { carryover_start.add_child("side", side); } } else if (!replay_start.empty()){ - BOOST_FOREACH(const config& side, replay_start.child_range("side")){ + for(const config& side : replay_start.child_range("side")) { carryover.add_child("side", side); carryover_start.add_child("side", side); } //for compatibility with old savegames that use player instead of side - BOOST_FOREACH(const config& side, replay_start.child_range("player")){ + for(const config& side : replay_start.child_range("player")) { carryover.add_child("side", side); carryover_start.add_child("side", side); } @@ -812,13 +810,13 @@ static void convert_old_saves_1_13_1(config& cfg) //This currently only fixes start-of-scenario saves. if(config& carryover_sides_start = cfg.child("carryover_sides_start")) { - BOOST_FOREACH(config& side, carryover_sides_start.child_range("side")) + for(config& side : carryover_sides_start.child_range("side")) { - BOOST_FOREACH(config& unit, side.child_range("unit")) + for(config& unit : side.child_range("unit")) { if(config& modifications = unit.child("modifications")) { - BOOST_FOREACH(config& advancement, modifications.child_range("advance")) + for(config& advancement : modifications.child_range("advance")) { modifications.add_child("advancement", advancement); } @@ -827,10 +825,10 @@ static void convert_old_saves_1_13_1(config& cfg) } } } - BOOST_FOREACH(config& snapshot, cfg.child_range("snapshot")) { + for(config& snapshot : cfg.child_range("snapshot")) { if (snapshot.has_attribute("used_items")) { config used_items; - BOOST_FOREACH(const std::string& item, utils::split(snapshot["used_items"])) { + for(const std::string& item : utils::split(snapshot["used_items"])) { used_items[item] = true; } snapshot.remove_attribute("used_items"); diff --git a/src/scripting/application_lua_kernel.cpp b/src/scripting/application_lua_kernel.cpp index 2d70423db1be..7f0d15df7fb4 100644 --- a/src/scripting/application_lua_kernel.cpp +++ b/src/scripting/application_lua_kernel.cpp @@ -49,7 +49,6 @@ #include #include -#include #include #include #include @@ -271,7 +270,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( // Now we have to create the context object. It is arranged as a table of boost functions. boost::shared_ptr this_context_backend = boost::make_shared (lua_context_backend()); lua_newtable(T_); // this will be the context table - BOOST_FOREACH( const std::string & key, ctxt.callbacks_ | boost::adaptors::map_keys ) { + for (const std::string & key : ctxt.callbacks_ | boost::adaptors::map_keys ) { lua_pushstring(T_, key.c_str()); lua_cpp::push_function(T_, boost::bind(&impl_context_backend, _1, this_context_backend, key)); lua_settable(T_, -3); @@ -282,7 +281,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( lua_pushstring(T_, "name"); lua_pushstring(T_, ctxt.name_.c_str()); lua_settable(T_, -3); - BOOST_FOREACH( const plugins_context::accessor_list::value_type & v, ctxt.accessors_) { + for (const plugins_context::accessor_list::value_type & v : ctxt.accessors_) { const std::string & key = v.first; const plugins_context::accessor_function & func = v.second; lua_pushstring(T_, key.c_str()); @@ -323,7 +322,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( application_lua_kernel::request_list results; - BOOST_FOREACH( const plugins_manager::event & req, this_context_backend->requests) { + for (const plugins_manager::event & req : this_context_backend->requests) { results.push_back(boost::bind(ctxt.callbacks_.find(req.name)->second, req.data)); //results.push_back(std::make_pair(ctxt.callbacks_.find(req.name)->second, req.data)); } diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 0fa465644568..327a49b49d03 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -108,7 +108,6 @@ #include "wml_exception.hpp" #include // for bind_t, bind -#include // for auto_any_base, etc #include // for intrusive_ptr #include #include // boost::copy @@ -166,7 +165,7 @@ struct map_locker void game_lua_kernel::extract_preload_scripts(config const &game_config) { game_lua_kernel::preload_scripts.clear(); - BOOST_FOREACH(config const &cfg, game_config.child_range("lua")) { + for (config const &cfg : game_config.child_range("lua")) { game_lua_kernel::preload_scripts.push_back(cfg); } game_lua_kernel::preload_config = game_config.child("game_config"); @@ -537,7 +536,7 @@ static int impl_unit_attacks_get(lua_State *L) const std::vector& attacks = u ? u->attacks() : ut->attacks(); if(!lua_isnumber(L,2)) { std::string attack_id = luaL_checkstring(L, 2); - BOOST_FOREACH(const attack_type& at, attacks) { + for (const attack_type& at : attacks) { if(at.id() == attack_id) { attack = &at; break; @@ -614,7 +613,7 @@ static int impl_unit_attack_get(lua_State *L) lua_rawgeti(L, 1, 2); std::string attack_id = luaL_checkstring(L, -1); char const *m = luaL_checkstring(L, 2); - BOOST_FOREACH(const attack_type& attack, u->attacks()) + for (const attack_type& attack : u->attacks()) { if(attack.id() == attack_id) { @@ -661,7 +660,7 @@ static int impl_unit_attack_set(lua_State *L) lua_rawgeti(L, 1, 2); std::string attack_id = luaL_checkstring(L, -1); char const *m = luaL_checkstring(L, 2); - BOOST_FOREACH(attack_type& attack, u->attacks()) + for (attack_type& attack : u->attacks()) { if(attack.id() == attack_id) { @@ -765,7 +764,7 @@ int game_lua_kernel::intf_get_unit(lua_State *L) map_location loc; if(lua_isstring(L, 1) && !lua_isnumber(L, 1)) { std::string id = luaL_checkstring(L, 1); - BOOST_FOREACH(const unit& u, units()) { + for(const unit& u : units()) { if(u.id() == id) { new(lua_newuserdata(L, sizeof(lua_unit))) lua_unit(u.underlying_id()); lua_pushlightuserdata(L, getunitKey); @@ -837,7 +836,7 @@ int game_lua_kernel::intf_get_units(lua_State *L) // note that if filter is null, this yields a null filter matching everything (and doing no work) filter_context & fc = game_state_; - BOOST_FOREACH ( const unit * ui, unit_filter(filter, &fc).all_matches_on_map()) { + for (const unit * ui : unit_filter(filter, &fc).all_matches_on_map()) { new(lua_newuserdata(L, sizeof(lua_unit))) lua_unit(ui->underlying_id()); lua_pushvalue(L, 1); lua_setmetatable(L, 3); @@ -923,9 +922,9 @@ int game_lua_kernel::intf_get_recall_units(lua_State *L) int i = 1, s = 1; filter_context & fc = game_state_; const unit_filter ufilt(filter, &fc); - BOOST_FOREACH(team &t, teams()) + for (team &t : teams()) { - BOOST_FOREACH(unit_ptr & u, t.recall_list()) + for (unit_ptr & u : t.recall_list()) { if (!filter.null()) { scoped_recall_unit auto_store("this_unit", @@ -1111,7 +1110,7 @@ int game_lua_kernel::intf_set_menu_item(lua_State *L) int game_lua_kernel::intf_clear_menu_item(lua_State *L) { std::string ids(luaL_checkstring(L, 1)); - BOOST_FOREACH(const std::string& id, utils::split(ids, ',', utils::STRIP_SPACES)) { + for(const std::string& id : utils::split(ids, ',', utils::STRIP_SPACES)) { if(id.empty()) { WRN_LUA << "[clear_menu_item] has been given an empty id=, ignoring" << std::endl; continue; @@ -1158,12 +1157,12 @@ int game_lua_kernel::intf_shroud_op(lua_State *L, bool place_shroud) const terrain_filter filter(cfg, &game_state_); filter.get_locations(locs, true); - BOOST_FOREACH(const int &side_num, sides) + for (const int &side_num : sides) { index = side_num - 1; team &t = teams()[index]; - BOOST_FOREACH(map_location const &loc, locs) + for (map_location const &loc : locs) { if (place_shroud) { t.place_shroud(loc); @@ -2119,11 +2118,11 @@ int game_lua_kernel::intf_find_cost_map(lua_State *L) pathfind::full_cost_map cost_map( ignore_units, !ignore_teleport, viewing_team, see_all, ignore_units); - BOOST_FOREACH(const unit* const u, real_units) + for (const unit* const u : real_units) { cost_map.add_unit(*u, use_max_moves); } - BOOST_FOREACH(const unit_type_vector::value_type& fu, fake_units) + for (const unit_type_vector::value_type& fu : fake_units) { const unit_type* ut = unit_types.find(fu.get<2>()); cost_map.add_unit(fu.get<0>(), ut, fu.get<1>()); @@ -2133,7 +2132,7 @@ int game_lua_kernel::intf_find_cost_map(lua_State *L) { if (game_display_) { game_display_->labels().clear_all(); - BOOST_FOREACH(const map_location& loc, location_set) + for (const map_location& loc : location_set) { std::stringstream s; s << cost_map.get_pair_at(loc.x, loc.y).first; @@ -2147,7 +2146,7 @@ int game_lua_kernel::intf_find_cost_map(lua_State *L) // create return value lua_createtable(L, location_set.size(), 0); int counter = 1; - BOOST_FOREACH(const map_location& loc, location_set) + for (const map_location& loc : location_set) { lua_createtable(L, 4, 0); @@ -2182,7 +2181,7 @@ int game_lua_kernel::intf_heal_unit(lua_State *L) std::vector healers; if (!healers_filter.null()) { const unit_filter ufilt(healers_filter, &game_state_); - BOOST_FOREACH(unit& u, *units) { + for (unit& u : *units) { if ( ufilt(u) && u.has_ability_type("heals") ) { healers.push_back(&u); } @@ -3096,7 +3095,7 @@ int game_lua_kernel::intf_get_locations(lua_State *L) lua_createtable(L, res.size(), 0); int i = 1; - BOOST_FOREACH(map_location const &loc, res) + for (map_location const &loc : res) { lua_createtable(L, 2, 0); lua_pushinteger(L, loc.x + 1); @@ -3191,7 +3190,7 @@ int game_lua_kernel::intf_modify_ai_wml(lua_State *L) side_filter ssf(cfg, &game_state_); std::vector sides = ssf.get_teams(); - BOOST_FOREACH(const int &side_num, sides) + for (const int &side_num : sides) { ai::manager::modify_active_ai_for_side(side_num,cfg.get_parsed_config()); } @@ -3218,7 +3217,7 @@ int game_lua_kernel::intf_modify_side(lua_State *L) std::vector sides = get_sides_vector(cfg); size_t team_index; - BOOST_FOREACH(const int &side_num, sides) + for(const int &side_num : sides) { team_index = side_num - 1; @@ -3378,7 +3377,7 @@ int game_lua_kernel::intf_get_sides(lua_State* L) lua_settop(L, 0); lua_createtable(L, sides.size(), 0); unsigned index = 1; - BOOST_FOREACH(int side, sides) { + for(int side : sides) { luaW_pushteam(L, teams()[side - 1]); lua_rawseti(L, -2, index); ++index; @@ -3394,7 +3393,7 @@ int game_lua_kernel::intf_get_sides(lua_State* L) static int intf_get_traits(lua_State* L) { lua_newtable(L); - BOOST_FOREACH(const config& trait, unit_types.traits()) { + for(const config& trait : unit_types.traits()) { const std::string& id = trait["id"]; //It seems the engine does nowhere check the id field for emptyness or duplicates //(also not later on). @@ -3635,13 +3634,13 @@ int game_lua_kernel::intf_kill(lua_State *L) //Find all the dead units first, because firing events ruins unit_map iteration std::vector dead_men_walking; const unit_filter ufilt(cfg, &game_state_); - BOOST_FOREACH(unit & u, units()){ + for (unit & u : units()){ if ( ufilt(u) ) { dead_men_walking.push_back(&u); } } - BOOST_FOREACH(unit * un, dead_men_walking) { + for(unit * un : dead_men_walking) { map_location loc(un->get_location()); bool fire_event = false; game_events::entity_location death_loc(*un); @@ -3761,7 +3760,7 @@ int game_lua_kernel::intf_redraw(lua_State *L) if (clear_shroud) { side_filter filter(cfg, &game_state_); - BOOST_FOREACH(const int side, filter.get_teams()){ + for (const int side : filter.get_teams()){ actions::clear_shroud(side); } screen.recalculate_minimap(); @@ -4045,7 +4044,7 @@ int game_lua_kernel::intf_scroll(lua_State * L) if (game_display_) { const std::vector side_list = get_sides_vector(cfg); bool side_match = false; - BOOST_FOREACH(int side, side_list) { + for (int side : side_list) { if(teams()[side-1].is_local_human()) { side_match = true; break; @@ -4546,7 +4545,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle set_wml_action(handler.first, handler.second); } luaW_getglobal(L, "wesnoth", "effects"); - BOOST_FOREACH(const std::string& effect, unit::builtin_effects) { + for(const std::string& effect : unit::builtin_effects) { lua_pushstring(L, effect.c_str()); push_builtin_effect(); lua_rawset(L, -3); @@ -4583,7 +4582,7 @@ void game_lua_kernel::initialize(const config& level) lua_settop(L, 0); lua_getglobal(L, "wesnoth"); lua_newtable(L); - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &ut, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &ut : unit_types.types()) { luaW_pushunittype(L, ut.first); lua_setfield(L, -2, ut.first.c_str()); @@ -4603,10 +4602,10 @@ void game_lua_kernel::initialize(const config& level) cmd_log_ << "Running preload scripts...\n"; game_config::load_config(game_lua_kernel::preload_config); - BOOST_FOREACH(const config &cfg, game_lua_kernel::preload_scripts) { + for (const config &cfg : game_lua_kernel::preload_scripts) { run(cfg["code"].str().c_str()); } - BOOST_FOREACH(const config &cfg, level_lua_.child_range("lua")) { + for (const config &cfg : level_lua_.child_range("lua")) { run(cfg["code"].str().c_str()); } @@ -4633,7 +4632,7 @@ int game_lua_kernel::return_unit_method(lua_State *L, char const *m) { {"select", &dispatch<&game_lua_kernel::intf_select_unit>}, }; - BOOST_FOREACH(const luaL_Reg& r, methods) { + for (const luaL_Reg& r : methods) { if (strcmp(m, r.name) == 0) { lua_pushcfunction(L, r.func); return 1; @@ -4663,7 +4662,7 @@ static char const *handled_file_tags[] = { static bool is_handled_file_tag(const std::string &s) { - BOOST_FOREACH(char const *t, handled_file_tags) { + for (char const *t : handled_file_tags) { if (s == t) return true; } return false; @@ -4682,7 +4681,7 @@ void game_lua_kernel::load_game(const config& level) lua_newtable(L); int k = 1; - BOOST_FOREACH(const config::any_child &v, level.all_children_range()) + for (const config::any_child &v : level.all_children_range()) { if (is_handled_file_tag(v.key)) continue; lua_createtable(L, 2, 0); diff --git a/src/scripting/lua_api.cpp b/src/scripting/lua_api.cpp index d9985aa7964d..65e05f7d26ac 100644 --- a/src/scripting/lua_api.cpp +++ b/src/scripting/lua_api.cpp @@ -30,7 +30,6 @@ #include "units/map.hpp" #include "variable.hpp" -#include #include #include // for map<>::key_type #include // for operator new diff --git a/src/scripting/lua_common.cpp b/src/scripting/lua_common.cpp index b00b7b7501c4..58096d07e2d3 100644 --- a/src/scripting/lua_common.cpp +++ b/src/scripting/lua_common.cpp @@ -33,7 +33,6 @@ #include "log.hpp" #include "gettext.hpp" -#include #include #include // for distance, advance #include // for operator new @@ -213,7 +212,7 @@ static int impl_vconfig_get(lua_State *L) if (shallow_literal || strcmp(m, "__shallow_parsed") == 0) { lua_newtable(L); - BOOST_FOREACH(const config::attribute &a, v->get_config().attribute_range()) { + for (const config::attribute &a : v->get_config().attribute_range()) { if (shallow_literal) luaW_pushscalar(L, a.second); else @@ -574,7 +573,7 @@ void luaW_filltable(lua_State *L, config const &cfg) return; int k = 1; - BOOST_FOREACH(const config::any_child &ch, cfg.all_children_range()) + for (const config::any_child &ch : cfg.all_children_range()) { lua_createtable(L, 2, 0); lua_pushstring(L, ch.key.c_str()); @@ -584,7 +583,7 @@ void luaW_filltable(lua_State *L, config const &cfg) lua_rawseti(L, -2, 2); lua_rawseti(L, -2, k++); } - BOOST_FOREACH(const config::attribute &attr, cfg.attribute_range()) + for (const config::attribute &attr : cfg.attribute_range()) { luaW_pushscalar(L, attr.second); lua_setfield(L, -2, attr.first.c_str()); diff --git a/src/scripting/lua_common.hpp b/src/scripting/lua_common.hpp index 0cf21113e49b..307dd5908c60 100644 --- a/src/scripting/lua_common.hpp +++ b/src/scripting/lua_common.hpp @@ -212,7 +212,7 @@ bool luaW_checkvariable(lua_State *L, variable_access_create& v, int n); const std::vector& vector = accessor; \ lua_createtable(L, vector.size(), 0); \ int i = 1; \ - BOOST_FOREACH(const std::string& s, vector) { \ + for (const std::string& s : vector) { \ lua_pushstring(L, s.c_str()); \ lua_rawseti(L, -2, i); \ ++i; \ diff --git a/src/scripting/lua_race.cpp b/src/scripting/lua_race.cpp index 4e05a19c037d..5eebd99e74c4 100644 --- a/src/scripting/lua_race.cpp +++ b/src/scripting/lua_race.cpp @@ -18,7 +18,6 @@ #include "scripting/lua_common.hpp" #include "units/types.hpp" -#include #include #include "lua/lua.h" @@ -57,14 +56,14 @@ static int impl_race_get(lua_State* L) if (strcmp(m, "traits") == 0) { lua_newtable(L); if (race.uses_global_traits()) { - BOOST_FOREACH(const config& trait, unit_types.traits()) { + for (const config& trait : unit_types.traits()) { const std::string& id = trait["id"]; lua_pushlstring(L, id.c_str(), id.length()); luaW_pushconfig(L, trait); lua_rawset(L, -3); } } - BOOST_FOREACH(const config& trait, race.additional_traits()) { + for (const config& trait : race.additional_traits()) { const std::string& id = trait["id"]; lua_pushlstring(L, id.c_str(), id.length()); luaW_pushconfig(L, trait); @@ -108,7 +107,7 @@ void luaW_pushracetable(lua_State *L) const race_map& races = unit_types.races(); lua_createtable(L, 0, races.size()); - BOOST_FOREACH(const race_map::value_type &race, races) + for (const race_map::value_type &race : races) { assert(race.first == race.second.id()); luaW_pushrace(L, race.second); diff --git a/src/scripting/lua_team.cpp b/src/scripting/lua_team.cpp index 3a5c5aede767..3ed5e1789d1c 100644 --- a/src/scripting/lua_team.cpp +++ b/src/scripting/lua_team.cpp @@ -17,7 +17,6 @@ #include "scripting/lua_common.hpp" #include "team.hpp" -#include #include #include "lua/lua.h" @@ -83,7 +82,7 @@ static int impl_side_get(lua_State *L) std::set const &recruits = t.recruits(); lua_createtable(L, recruits.size(), 0); int i = 1; - BOOST_FOREACH(std::string const &r, t.recruits()) { + for (std::string const &r : t.recruits()) { lua_pushstring(L, r.c_str()); lua_rawseti(L, -2, i++); } diff --git a/src/scripting/lua_unit_type.cpp b/src/scripting/lua_unit_type.cpp index 478db31e07eb..787d1080e398 100644 --- a/src/scripting/lua_unit_type.cpp +++ b/src/scripting/lua_unit_type.cpp @@ -18,7 +18,6 @@ #include "scripting/push_check.hpp" #include "units/types.hpp" -#include #include #include "lua/lua.h" @@ -60,7 +59,7 @@ static int impl_unit_type_get(lua_State *L) return_cfgref_attrib("__cfg", ut.get_cfg()); if (strcmp(m, "traits") == 0) { lua_newtable(L); - BOOST_FOREACH(const config& trait, ut.possible_traits()) { + for (const config& trait : ut.possible_traits()) { const std::string& id = trait["id"]; lua_pushlstring(L, id.c_str(), id.length()); luaW_pushconfig(L, trait); diff --git a/src/scripting/push_check.hpp b/src/scripting/push_check.hpp index 5b2ad9c28cfd..8c44c8ee2c38 100644 --- a/src/scripting/push_check.hpp +++ b/src/scripting/push_check.hpp @@ -6,7 +6,6 @@ #include #include #include -#include #include "tstring.hpp" #include "map/location.hpp" #include "lua/lauxlib.h" @@ -293,7 +292,7 @@ namespace lua_check_impl lua_push(lua_State * L, const T& map ) { lua_newtable(L); - BOOST_FOREACH(const typename T::value_type& pair, map) + for(const typename T::value_type& pair : map) { lua_check_impl::lua_push::type>(L, pair.first); lua_check_impl::lua_push::type>(L, pair.second); diff --git a/src/serialization/parser.cpp b/src/serialization/parser.cpp index db3d33a29ad1..14571bdcd46c 100644 --- a/src/serialization/parser.cpp +++ b/src/serialization/parser.cpp @@ -34,7 +34,6 @@ #include #include -#include #include #include #include @@ -361,7 +360,7 @@ std::string parser::lineno_string(utils::string_map &i18n_symbols, result += '\n' + debug_string; } - BOOST_FOREACH(utils::string_map::value_type& var, i18n_symbols) + for(utils::string_map::value_type& var : i18n_symbols) boost::algorithm::replace_all(result, std::string("$") + var.first, std::string(var.second)); return result; } @@ -578,7 +577,7 @@ static void write_internal(config const &cfg, std::ostream &out, std::string& te if (tab > max_recursion_levels) throw config::error("Too many recursion levels in config write"); - BOOST_FOREACH(const config::attribute &i, cfg.attribute_range()) { + for (const config::attribute &i : cfg.attribute_range()) { if (!config::valid_id(i.first)) { ERR_CF << "Config contains invalid attribute name '" << i.first << "', skipping...\n"; continue; @@ -586,7 +585,7 @@ static void write_internal(config const &cfg, std::ostream &out, std::string& te write_key_val(out, i.first, i.second, tab, textdomain); } - BOOST_FOREACH(const config::any_child &item, cfg.all_children_range()) + for (const config::any_child &item : cfg.all_children_range()) { if (!config::valid_id(item.key)) { ERR_CF << "Config contains invalid tag name '" << item.key << "', skipping...\n"; diff --git a/src/serialization/preprocessor.cpp b/src/serialization/preprocessor.cpp index 0899960a3b57..1ad9bf05a3ae 100644 --- a/src/serialization/preprocessor.cpp +++ b/src/serialization/preprocessor.cpp @@ -33,8 +33,6 @@ #include "util.hpp" #include "version.hpp" -#include - #include static lg::log_domain log_preprocessor("preprocessor"); @@ -66,7 +64,7 @@ static std::string get_filename(const std::string& file_code){ int n = 0; s >> std::hex >> n; - BOOST_FOREACH(const t_file_number_map::value_type& p, file_number_map){ + for(const t_file_number_map::value_type& p : file_number_map) { if(p.second == n) return p.first; } @@ -145,8 +143,9 @@ void preproc_define::write(config_writer& writer, const std::string& name) const writer.write_key_val("linenum", std::to_string(linenum)); writer.write_key_val("location", get_location(location)); - BOOST_FOREACH(const std::string &arg, arguments) + for(const std::string &arg : arguments) { write_argument(writer, arg); + } writer.close_child(key); } @@ -163,8 +162,9 @@ void preproc_define::read(const config& cfg) linenum = cfg["linenum"]; location = cfg["location"].str(); - BOOST_FOREACH(const config &arg, cfg.child_range("argument")) + for(const config &arg : cfg.child_range("argument")) { read_argument(arg); + } } preproc_map::value_type preproc_define::read_pair(const config &cfg) @@ -558,7 +558,7 @@ preprocessor_file::preprocessor_file(preprocessor_streambuf &t, std::string cons filesystem::get_files_in_dir(name, &files_, nullptr, filesystem::ENTIRE_FILE_PATH, filesystem::SKIP_MEDIA_DIR, filesystem::DO_REORDER); - BOOST_FOREACH(std::string fname, files_) { + for(std::string fname : files_) { size_t cpos = fname.rfind(" "); if (cpos != std::string::npos && cpos >= symbol_index) { std::stringstream ss; @@ -1263,14 +1263,14 @@ void preprocess_resource(const std::string& res_name, preproc_map *defines_map, filesystem::get_files_in_dir(res_name, &files, &dirs, filesystem::ENTIRE_FILE_PATH, filesystem::SKIP_MEDIA_DIR, filesystem::DO_REORDER); // subdirectories - BOOST_FOREACH(const std::string& dir, dirs) + for(const std::string& dir : dirs) { LOG_PREPROC << "processing sub-dir: " << dir << '\n'; preprocess_resource(dir, defines_map, write_cfg, write_plain_cfg, target_directory); } // files in current directory - BOOST_FOREACH(const std::string& file, files) + for(const std::string& file : files) { preprocess_resource(file, defines_map, write_cfg, write_plain_cfg, target_directory); } diff --git a/src/serialization/schema_validator.cpp b/src/serialization/schema_validator.cpp index 214660a6fd5f..b202dec8ea3c 100644 --- a/src/serialization/schema_validator.cpp +++ b/src/serialization/schema_validator.cpp @@ -21,8 +21,6 @@ #include "serialization/preprocessor.hpp" #include "wml_exception.hpp" -#include - namespace schema_validation{ static lg::log_domain log_validation("validation"); @@ -149,14 +147,14 @@ bool schema_validator::read_config_file(const std::string &filename){ ERR_VL << "Failed to read file "<< filename << ":\n" << e.what() << "\n"; return false; } - BOOST_FOREACH(const config &g, cfg.child_range("wml_schema")) { - BOOST_FOREACH(const config &schema, g.child_range("tag")) { + for(const config &g : cfg.child_range("wml_schema")) { + for(const config &schema : g.child_range("tag")) { if (schema["name"].str() == "root"){ //@NOTE Don't know, maybe merging of roots needed. root_ = class_tag (schema); } } - BOOST_FOREACH(const config &type, g.child_range("type")) { + for(const config &type : g.child_range("type")) { try{ types_[type["name"].str()] = boost::regex( type["value"].str()); } diff --git a/src/serialization/unicode.cpp b/src/serialization/unicode.cpp index c41eb916e07c..206afef0f99d 100644 --- a/src/serialization/unicode.cpp +++ b/src/serialization/unicode.cpp @@ -29,7 +29,6 @@ #include #include -#include static lg::log_domain log_engine("engine"); #define ERR_GENERAL LOG_STREAM(err, lg::general()) diff --git a/src/server/ban.cpp b/src/server/ban.cpp index d7b32752d012..a24626ec62a7 100644 --- a/src/server/ban.cpp +++ b/src/server/ban.cpp @@ -23,7 +23,6 @@ #include "ban.hpp" -#include #include namespace wesnothd { @@ -268,7 +267,7 @@ static lg::log_domain log_server("server"); filesystem::scoped_istream ban_file = filesystem::istream_file(filename_); read_gz(cfg, *ban_file); - BOOST_FOREACH(const config &b, cfg.child_range("ban")) + for (const config &b : cfg.child_range("ban")) { try { banned_ptr new_ban(new banned(b)); @@ -284,7 +283,7 @@ static lg::log_domain log_server("server"); // load deleted too if (const config &cfg_del = cfg.child("deleted")) { - BOOST_FOREACH(const config &b, cfg_del.child_range("ban")) + for (const config &b : cfg_del.child_range("ban")) { try { banned_ptr new_ban(new banned(b)); @@ -697,7 +696,7 @@ static lg::log_domain log_server("server"); void ban_manager::load_config(const config& cfg) { ban_times_.clear(); - BOOST_FOREACH(const config &bt, cfg.child_range("ban_time")) { + for (const config &bt : cfg.child_range("ban_time")) { time_t duration = 0; if (parse_time(bt["time"], &duration)) { ban_times_.insert(default_ban_times::value_type(bt["name"], duration)); diff --git a/src/server/game.cpp b/src/server/game.cpp index f7a3eb1c0772..60236a83fbb0 100644 --- a/src/server/game.cpp +++ b/src/server/game.cpp @@ -25,7 +25,6 @@ #include #include -#include #include @@ -1419,7 +1418,7 @@ void game::send_data_sides(simple_wml::document& data, bool game::controls_side(const std::vector& sides, const network::connection player) const { - BOOST_FOREACH(int side, sides) + for (int side : sides) { size_t side_index = side - 1; if(side_index < sides_.size() && sides_[side_index] == player) { diff --git a/src/server/room_manager.cpp b/src/server/room_manager.cpp index 087c959202ba..3223fe2c4de7 100644 --- a/src/server/room_manager.cpp +++ b/src/server/room_manager.cpp @@ -22,8 +22,6 @@ #include "filesystem.hpp" #include "log.hpp" -#include - static lg::log_domain log_server_lobby("server/lobby"); #define ERR_LOBBY LOG_STREAM(err, log_server_lobby) #define WRN_LOBBY LOG_STREAM(warn, log_server_lobby) @@ -58,7 +56,7 @@ room_manager::~room_manager() // this assumes the server is shutting down, so there's no need to // send the actual room-quit messages to clients write_rooms(); - BOOST_FOREACH(t_rooms_by_name_::value_type i, rooms_by_name_) { + for (t_rooms_by_name_::value_type i : rooms_by_name_) { delete i.second; } } @@ -97,7 +95,7 @@ void room_manager::read_rooms() read(cfg, *file); } - BOOST_FOREACH(const config &c, cfg.child_range("room")) { + for (const config &c : cfg.child_range("room")) { room* r(new room(c)); if (room_exists(r->name())) { ERR_LOBBY << "Duplicate room ignored in stored rooms: " @@ -122,7 +120,7 @@ void room_manager::write_rooms() if (filename_.empty()) return; LOG_LOBBY << "Writing rooms to " << filename_ << "\n"; config cfg; - BOOST_FOREACH(const t_rooms_by_name_::value_type& v, rooms_by_name_) { + for (const t_rooms_by_name_::value_type& v : rooms_by_name_) { const room& r = *v.second; if (r.persistent()) { config& c = cfg.add_child("room"); @@ -211,7 +209,7 @@ void room_manager::enter_lobby(network::connection player) void room_manager::enter_lobby(const wesnothd::game &game) { - BOOST_FOREACH(network::connection player, game.all_game_users()) { + for (network::connection player : game.all_game_users()) { enter_lobby(player); } } @@ -225,7 +223,7 @@ void room_manager::exit_lobby(network::connection player) store_player_rooms(player); t_rooms_by_player_::iterator i = rooms_by_player_.find(player); if (i != rooms_by_player_.end()) { - BOOST_FOREACH(room* r, i->second) { + for (room* r : i->second) { r->remove_player(player); } } @@ -244,7 +242,7 @@ void room_manager::remove_player(network::connection player) lobby_->remove_player(player); t_rooms_by_player_::iterator i = rooms_by_player_.find(player); if (i != rooms_by_player_.end()) { - BOOST_FOREACH(room* r, i->second) { + for (room* r : i->second) { r->remove_player(player); } } @@ -315,7 +313,7 @@ void room_manager::store_player_rooms(network::connection player) t_player_stored_rooms_::iterator it = player_stored_rooms_.insert(std::make_pair(player, std::set())).first; std::set& store = it->second; - BOOST_FOREACH(room* r, i->second) { + for (room* r : i->second) { store.insert(r->name()); } } @@ -337,7 +335,7 @@ void room_manager::unstore_player_rooms(const player_map::iterator user) simple_wml::document doc; simple_wml::node& join_msg = doc.root().add_child("room_join"); join_msg.set_attr_dup("player", user->second.name().c_str()); - BOOST_FOREACH(const std::string& room_name, it->second) { + for (const std::string& room_name : it->second) { room* r = get_create_room(room_name, user->first); if (r == nullptr) { LOG_LOBBY << "Player " << user->second.name() << " unable to rejoin room " << room_name << "\n"; @@ -528,7 +526,7 @@ void room_manager::process_room_query(simple_wml::document& data, const player_m void room_manager::fill_room_list(simple_wml::node& root) { simple_wml::node& rooms = root.add_child("rooms"); - BOOST_FOREACH(const t_rooms_by_name_::value_type& tr, rooms_by_name_) { + for (const t_rooms_by_name_::value_type& tr : rooms_by_name_) { const room& r = *tr.second; simple_wml::node& room = rooms.add_child("room"); room.set_attr_dup("name", r.name().c_str()); @@ -539,7 +537,7 @@ void room_manager::fill_room_list(simple_wml::node& root) void room_manager::fill_member_list(const room* room, simple_wml::node& root) { simple_wml::node& members = root.add_child("members"); - BOOST_FOREACH(network::connection m, room->members()) { + for (network::connection m : room->members()) { simple_wml::node& member = members.add_child("member"); player_map::const_iterator mi = all_players_.find(m); if (mi != all_players_.end()) { diff --git a/src/server/server.cpp b/src/server/server.cpp index e06d35b9c084..02b05cb71249 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -562,15 +561,15 @@ void server::load_config() { } redirected_versions_.clear(); - BOOST_FOREACH(const config &redirect, cfg_.child_range("redirect")) { - BOOST_FOREACH(const std::string &version, utils::split(redirect["version"])) { + for(const config &redirect : cfg_.child_range("redirect")) { + for(const std::string &version : utils::split(redirect["version"])) { redirected_versions_[version] = redirect; } } proxy_versions_.clear(); - BOOST_FOREACH(const config &proxy, cfg_.child_range("proxy")) { - BOOST_FOREACH(const std::string &version, utils::split(proxy["version"])) { + for(const config &proxy : cfg_.child_range("proxy")) { + for(const std::string &version : utils::split(proxy["version"])) { proxy_versions_[version] = proxy; } } @@ -710,7 +709,7 @@ void server::run() { simple_wml::document ping( strstr.str().c_str(), simple_wml::INIT_COMPRESSED ); simple_wml::string_span s = ping.output_compressed(); - BOOST_FOREACH(network::connection sock, ghost_players_) { + for(network::connection sock : ghost_players_) { if (!lg::debug().dont_log(log_server)) { wesnothd::player_map::const_iterator i = players_.find(sock); if (i != players_.end()) { @@ -726,7 +725,7 @@ void server::run() { // Only a single thread should be accessing this // Erase before we copy - speeds inserts ghost_players_.clear(); - BOOST_FOREACH(const wesnothd::player_map::value_type v, players_) { + for(const wesnothd::player_map::value_type v : players_) { ghost_players_.insert(v.first); } last_ping_ = now; @@ -2470,7 +2469,7 @@ void server::process_data_game(const network::connection sock, } const simple_wml::node::child_list& mlist = data.children("modification"); - BOOST_FOREACH (const simple_wml::node* m, mlist) { + for (const simple_wml::node* m : mlist) { desc.add_child_at("modification", 0); desc.child("modification")->set_attr_dup("id", m->attr("id")); if (m->attr("require_modification").to_bool(false)) diff --git a/src/side_filter.cpp b/src/side_filter.cpp index 57cf73364e61..e574689727b6 100644 --- a/src/side_filter.cpp +++ b/src/side_filter.cpp @@ -34,8 +34,6 @@ #include "formula/callable_objects.hpp" #include "formula/formula.hpp" -#include - static lg::log_domain log_engine_sf("engine/side_filter"); #define ERR_NG LOG_STREAM(err, log_engine_sf) @@ -75,7 +73,7 @@ std::vector side_filter::get_teams() const assert(fc_); //@todo: replace with better implementation std::vector result; - BOOST_FOREACH(const team &t, fc_->get_disp_context().teams()) { + for(const team &t : fc_->get_disp_context().teams()) { if (match(t)) { result.push_back(t.side()); } @@ -128,7 +126,7 @@ bool side_filter::match_internal(const team &t) const else { const std::vector& these_team_names = utils::split(this_team_name); bool search_futile = true; - BOOST_FOREACH(const std::string& this_single_team_name, these_team_names) { + for(const std::string& this_single_team_name : these_team_names) { if(this_single_team_name == that_team_name) { search_futile = false; break; @@ -144,7 +142,7 @@ bool side_filter::match_internal(const team &t) const if (!ufilter_) ufilter_.reset(new unit_filter(ufilt_cfg, fc_, flat_)); bool found = false; - BOOST_FOREACH(const unit &u, fc_->get_disp_context().units()) { + for(const unit &u : fc_->get_disp_context().units()) { if (u.side() != t.side()) { continue; } @@ -154,7 +152,7 @@ bool side_filter::match_internal(const team &t) const } } if(!found && ufilt_cfg["search_recall_list"].to_bool(false)) { - BOOST_FOREACH(const unit_const_ptr & u, t.recall_list()) { + for(const unit_const_ptr & u : t.recall_list()) { scoped_recall_unit this_unit("this_unit", t.save_id(),t.recall_list().find_index(u->id())); if(ufilter_->matches(*u)) { found = true; @@ -173,7 +171,7 @@ bool side_filter::match_internal(const team &t) const enemy_filter_.reset(new side_filter(enemy_of, fc_)); const std::vector& teams = enemy_filter_->get_teams(); if(teams.empty()) return false; - BOOST_FOREACH(const int side, teams) { + for(const int side : teams) { if(!(fc_->get_disp_context().teams())[side - 1].is_enemy(t.side())) return false; } @@ -185,7 +183,7 @@ bool side_filter::match_internal(const team &t) const allied_filter_.reset(new side_filter(allied_with, fc_)); const std::vector& teams = allied_filter_->get_teams(); if(teams.empty()) return false; - BOOST_FOREACH(const int side, teams) { + for(const int side : teams) { if((fc_->get_disp_context().teams())[side - 1].is_enemy(t.side())) return false; } @@ -197,7 +195,7 @@ bool side_filter::match_internal(const team &t) const has_enemy_filter_.reset(new side_filter(has_enemy, fc_)); const std::vector& teams = has_enemy_filter_->get_teams(); bool found = false; - BOOST_FOREACH(const int side, teams) { + for(const int side : teams) { if((fc_->get_disp_context().teams())[side - 1].is_enemy(t.side())) { found = true; @@ -213,7 +211,7 @@ bool side_filter::match_internal(const team &t) const has_ally_filter_.reset(new side_filter(has_ally, fc_)); const std::vector& teams = has_ally_filter_->get_teams(); bool found = false; - BOOST_FOREACH(const int side, teams) { + for(const int side : teams) { if(!(fc_->get_disp_context().teams())[side - 1].is_enemy(t.side())) { found = true; @@ -232,7 +230,7 @@ bool side_filter::match_internal(const team &t) const } else { bool found = false; - BOOST_FOREACH(const std::string& controller, utils::split(cfg_controller)) + for(const std::string& controller : utils::split(cfg_controller)) { if(t.controller().to_string() == controller) { found = true; diff --git a/src/sound.cpp b/src/sound.cpp index 28bb4c1fcced..c241c1149bd2 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -26,8 +26,6 @@ #include #include // Travis doesn't like this, although it works on my machine -> '#include -#include - #include #include #include @@ -629,7 +627,7 @@ void commit_music_changes() return; // If current track no longer on playlist, change it. - BOOST_FOREACH(const music_track &m, current_track_list) { + for (const music_track &m : current_track_list) { if (current_track == m) return; } @@ -647,7 +645,7 @@ void write_music_play_list(config& snapshot) { // First entry clears playlist, others append to it. bool append = false; - BOOST_FOREACH(music_track &m, current_track_list) { + for (music_track &m : current_track_list) { m.write(snapshot, append); append = true; } diff --git a/src/statistics.cpp b/src/statistics.cpp index a31a52308712..79ff758dbf24 100644 --- a/src/statistics.cpp +++ b/src/statistics.cpp @@ -26,8 +26,6 @@ #include "units/unit.hpp" #include "util.hpp" -#include - static lg::log_domain log_engine("engine"); #define DBG_NG LOG_STREAM(debug, log_engine) #define ERR_NG LOG_STREAM(err, log_engine) @@ -67,7 +65,7 @@ scenario_stats::scenario_stats(const config& cfg) : team_stats(), scenario_name(cfg["scenario"]) { - BOOST_FOREACH(const config &team, cfg.child_range("team")) { + for(const config &team : cfg.child_range("team")) { team_stats[team["save_id"]] = stats(team); } } @@ -127,7 +125,7 @@ static void write_str_int_map(config_writer &out, const stats::str_int_map& m) static stats::str_int_map read_str_int_map(const config& cfg) { stats::str_int_map m; - BOOST_FOREACH(const config::attribute &i, cfg.attribute_range()) { + for(const config::attribute &i : cfg.attribute_range()) { m[i.first] = i.second; } @@ -159,7 +157,7 @@ static void write_battle_result_map(config_writer &out, const stats::battle_resu static stats::battle_result_map read_battle_result_map(const config& cfg) { stats::battle_result_map m; - BOOST_FOREACH(const config &i, cfg.child_range("sequence")) + for(const config &i : cfg.child_range("sequence")) { config item = i; int key = item["_num"]; @@ -611,7 +609,7 @@ void read_stats(const config& cfg) fresh_stats(); mid_scenario = cfg["mid_scenario"].to_bool(); - BOOST_FOREACH(const config &s, cfg.child_range("scenario")) { + for(const config &s : cfg.child_range("scenario")) { master_stats.push_back(scenario_stats(s)); } } diff --git a/src/storyscreen/controller.cpp b/src/storyscreen/controller.cpp index 99614e515264..49bb615e0c63 100644 --- a/src/storyscreen/controller.cpp +++ b/src/storyscreen/controller.cpp @@ -35,8 +35,6 @@ #include "resources.hpp" #include "widgets/button.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) #define LOG_NG LOG_STREAM(info, log_engine) @@ -160,7 +158,7 @@ STORY_RESULT controller::show(START_POSITION startpos) // caching the scaled backgrounds can take over a decent amount of memory. #ifndef LOW_MEM std::vector< render_pointer_type > uis_; - BOOST_FOREACH(part_pointer_type p, parts_) { + for(part_pointer_type p : parts_) { ASSERT_LOG( p != nullptr, "Ouch: hit nullptr storyscreen part in collection" ); render_pointer_type const rpt(new part_ui(*p, video_, next_button, back_button, play_button)); uis_.push_back(rpt); diff --git a/src/storyscreen/render.cpp b/src/storyscreen/render.cpp index e4efb5d069fd..576c40e0d270 100644 --- a/src/storyscreen/render.cpp +++ b/src/storyscreen/render.cpp @@ -33,8 +33,6 @@ #include "video.hpp" #include "widgets/button.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) #define WARN_NG LOG_STREAM(warn, log_engine) @@ -125,7 +123,7 @@ void part_ui::prepare_background() has_background_ = false; bool no_base_yet = true; - BOOST_FOREACH(const background_layer& bl, p_.get_background_layers()) { + for (const background_layer& bl : p_.get_background_layers()) { sdl::timage layer; if (!bl.file().empty()) { @@ -194,7 +192,7 @@ void part_ui::prepare_background() bool no_base_yet = true; // Build background surface - BOOST_FOREACH(const background_layer& bl, p_.get_background_layers()) { + for (const background_layer& bl : p_.get_background_layers()) { surface layer; if(bl.file().empty() != true) { @@ -303,7 +301,7 @@ void part_ui::prepare_geometry() void part_ui::prepare_floating_images() { // Build floating image surfaces - BOOST_FOREACH(const floating_image& fi, p_.get_floating_images()) { + for (const floating_image& fi : p_.get_floating_images()) { imgs_.push_back( fi.get_render_input(x_scale_factor_, y_scale_factor_, base_rect_) ); } } @@ -326,7 +324,7 @@ bool part_ui::render_floating_images() last_key_ = true; size_t fi_n = 0; - BOOST_FOREACH(floating_image::render_input& ri, imgs_) { + for (floating_image::render_input& ri : imgs_) { const floating_image& fi = p_.get_floating_images()[fi_n]; if(!ri.image.null()) { @@ -356,7 +354,7 @@ bool part_ui::render_floating_images() last_key_ = true; size_t fi_n = 0; - BOOST_FOREACH(floating_image::render_input& ri, imgs_) { + for (floating_image::render_input& ri : imgs_) { const floating_image& fi = p_.get_floating_images()[fi_n]; if(!ri.image.null()) { diff --git a/src/synced_commands.cpp b/src/synced_commands.cpp index ed7bc64aaae5..a97e4fc85edc 100644 --- a/src/synced_commands.cpp +++ b/src/synced_commands.cpp @@ -37,8 +37,6 @@ #include "units/types.hpp" #include "units/udisplay.hpp" -#include - static lg::log_domain log_replay("replay"); #define DBG_REPLAY LOG_STREAM(debug, log_replay) #define LOG_REPLAY LOG_STREAM(info, log_replay) @@ -425,7 +423,7 @@ SYNCED_COMMAND_HANDLER_FUNCTION(debug_unit, child, use_undo, /*show*/, /*error_ i->write(cfg); resources::units->erase(loc); config& statuses = cfg.child_or_add("status"); - BOOST_FOREACH(std::string status, utils::split(value)) { + for (std::string status : utils::split(value)) { bool add = true; if (status.length() >= 1 && status[0] == '-') { add = false; diff --git a/src/synced_user_choice.cpp b/src/synced_user_choice.cpp index 8eee22c0e18f..8f34aa75fc0e 100644 --- a/src/synced_user_choice.cpp +++ b/src/synced_user_choice.cpp @@ -26,7 +26,6 @@ #include "replay.hpp" #include "resources.hpp" #include "gui/dialogs/multiplayer/synced_choice_wait.hpp" -#include #include #include #include @@ -120,7 +119,7 @@ std::map mp_sync::get_user_choice_multiple_sides(const std::string & for empty sides we want to use random choice instead. */ std::set empty_sides; - BOOST_FOREACH(int side, sides) + for(int side : sides) { assert(1 <= side && side <= max_side); if( (*resources::teams)[side-1].is_empty()) @@ -129,14 +128,14 @@ std::map mp_sync::get_user_choice_multiple_sides(const std::string & } } - BOOST_FOREACH(int side, empty_sides) + for(int side : empty_sides) { sides.erase(side); } std::map retv = user_choice_manager::get_user_choice_internal(name, uch, sides); - BOOST_FOREACH(int side, empty_sides) + for(int side : empty_sides) { retv[side] = uch.random_choice(side); } @@ -238,7 +237,7 @@ user_choice_manager::user_choice_manager(const std::string &name, const mp_sync: update_local_choice(); const int max_side = static_cast(resources::teams->size()); - BOOST_FOREACH(int side, required_) + for(int side : required_) { assert(1 <= side && side <= max_side); const team& t = (*resources::teams)[side-1]; @@ -312,7 +311,7 @@ void user_choice_manager::update_local_choice() local_choice_ = 0; //if for any side from which we need an answer std::string sides_str; - BOOST_FOREACH(int side, required_) + for(int side : required_) { //and we havent already received our answer from that side if(res_.find(side) == res_.end()) @@ -366,7 +365,7 @@ void user_choice_manager::fix_oos() { assert(oos_); ERR_REPLAY << "A sync error appeared while waiting for a synced user choice of type '" << uch_.description() << "' ([" + tagname_ + "]), doing the choice locally\n"; - BOOST_FOREACH(int side, required_) + for(int side : required_) { if(res_.find(side) == res_.end()) { diff --git a/src/syncmp_handler.cpp b/src/syncmp_handler.cpp index a8e5847c51e4..b716b8bee0b1 100644 --- a/src/syncmp_handler.cpp +++ b/src/syncmp_handler.cpp @@ -16,8 +16,6 @@ #include #include -#include - syncmp_handler::syncmp_handler() { syncmp_registry::add_handler(this); @@ -51,7 +49,7 @@ void syncmp_registry::add_handler(syncmp_handler* handler) void syncmp_registry::pull_remote_choice() { - BOOST_FOREACH(syncmp_handler* phandler, handlers()) + for(syncmp_handler* phandler : handlers()) { phandler->pull_remote_choice(); } @@ -59,7 +57,7 @@ void syncmp_registry::pull_remote_choice() void syncmp_registry::send_user_choice() { - BOOST_FOREACH(syncmp_handler* phandler, handlers()) + for(syncmp_handler* phandler : handlers()) { phandler->send_user_choice(); } diff --git a/src/team.cpp b/src/team.cpp index 39210e86bae1..db094951ba06 100644 --- a/src/team.cpp +++ b/src/team.cpp @@ -36,8 +36,6 @@ #include "config_assign.hpp" #include "serialization/string_utils.hpp" -#include - static lg::log_domain log_engine("engine"); #define DBG_NG LOG_STREAM(debug, log_engine) #define LOG_NG LOG_STREAM(info, log_engine) @@ -333,7 +331,7 @@ void team::build(const config &cfg, const gamemap& map, int gold) // Was it correct? // Load in the villages the side controls at the start - BOOST_FOREACH(const config &v, cfg.child_range("village")) + for (const config &v : cfg.child_range("village")) { map_location loc(v); if (map.is_village(loc)) { @@ -421,7 +419,7 @@ int team::minimum_recruit_price() const return info_.minimum_recruit_price; }else{ int min = 20; - BOOST_FOREACH(std::string recruit, info_.can_recruit){ + for(std::string recruit : info_.can_recruit) { const unit_type *ut = unit_types.find(recruit); if(!ut) continue; @@ -734,7 +732,7 @@ bool team::shroud_map::shared_value(const std::vector& maps, return true; // A tile is uncovered if it is uncovered on any shared map. - BOOST_FOREACH(const shroud_map * const shared_map, maps) { + for (const shroud_map * const shared_map : maps) { if ( shared_map->enabled_ && !shared_map->value(x,y) ) return false; } @@ -878,7 +876,7 @@ config team::to_config() const std::string team::allied_human_teams() const { std::vector res; - BOOST_FOREACH(const team& t, *teams) + for(const team& t : *teams) { if(!t.is_enemy(this->side()) && t.is_human()) { res.push_back(t.side()); diff --git a/src/teambuilder.cpp b/src/teambuilder.cpp index 4cdef76e2ac3..5ffab18aec35 100644 --- a/src/teambuilder.cpp +++ b/src/teambuilder.cpp @@ -26,7 +26,6 @@ #include "game_errors.hpp" #include "formula/string_utils.hpp" -#include #include #include @@ -181,7 +180,7 @@ class team_builder { // can be recruited for the player, add them. if (!side_cfg_) return; if (const config::attribute_value *v = side_cfg_.get("previous_recruits")) { - BOOST_FOREACH(const std::string &rec, utils::split(*v)) { + for (const std::string &rec : utils::split(*v)) { DBG_NG_TC << "adding previous recruit: " << rec << '\n'; t_->add_recruit(rec); } @@ -235,7 +234,7 @@ class team_builder { config & stored = leader_configs_.back(); // Remove the attributes used to define a side. - BOOST_FOREACH( const std::string & attr , team::attributes) { + for (const std::string & attr : team::attributes) { stored.remove_attribute(attr); } @@ -261,7 +260,7 @@ class team_builder { if (side_cfg_.has_attribute("type") && side_cfg_["type"] != "null" ) { handle_leader(side_cfg_); } - BOOST_FOREACH(const config &l, side_cfg_.child_range("leader")) { + for (const config &l : side_cfg_.child_range("leader")) { handle_leader(l); } } @@ -276,7 +275,7 @@ class team_builder { //for create-or-recall semantics to work: for each unit with non-empty //id, unconditionally put OTHER, later, units with same id directly to //recall list, not including them in unit_configs_ - BOOST_FOREACH(const config &su, side_cfg_.child_range("unit")) { + for (const config &su : side_cfg_.child_range("unit")) { handle_unit(su, "side_cfg"); } } @@ -294,7 +293,7 @@ class team_builder { .allow_rename_side(true) .allow_show(false); - BOOST_FOREACH(const config *u, unit_configs_) { + for (const config *u : unit_configs_) { uc.add_unit(*u); } } diff --git a/src/terrain/builder.cpp b/src/terrain/builder.cpp index acca2d1c0e0b..8be1d4aef55e 100644 --- a/src/terrain/builder.cpp +++ b/src/terrain/builder.cpp @@ -26,8 +26,6 @@ #include "serialization/string_utils.hpp" #include "gui/dialogs/loadscreen.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) #define WRN_NG LOG_STREAM(warn, log_engine) @@ -121,16 +119,16 @@ void terrain_builder::tile::rebuild_cache(const std::string& tod, logs* log) sorted_images = true; } - BOOST_FOREACH(const rule_image_rand& ri, images){ + for(const rule_image_rand& ri : images) { bool is_background = ri->is_background(); bool animate = (!ri.ri->is_water || preferences::animate_water()); imagelist& img_list = is_background ? images_background : images_foreground; - BOOST_FOREACH(const rule_image_variant& variant, ri->variants){ + for(const rule_image_variant& variant : ri->variants) { if(!variant.has_flag.empty()) { bool has_flag_match = true; - BOOST_FOREACH(const std::string& s, variant.has_flag) { + for(const std::string& s : variant.has_flag) { // If a flag listed in "has_flag" is not present, this variant does not match if(flags.find(s) == flags.end()) { has_flag_match = false; @@ -337,12 +335,12 @@ bool terrain_builder::update_animation(const map_location &loc) tile& btile = tile_map_[loc]; - BOOST_FOREACH(animated& a, btile.images_background) { + for(animated& a : btile.images_background) { if(a.need_update()) changed = true; a.update_last_draw_time(); } - BOOST_FOREACH(animated& a, btile.images_foreground) { + for(animated& a : btile.images_foreground) { if(a.need_update()) changed = true; a.update_last_draw_time(); @@ -419,7 +417,7 @@ static std::vector get_variations(const std::string& base, const st } std::vector vars = utils::split(variations, ';', 0); - BOOST_FOREACH(const std::string& v, vars){ + for (const std::string& v : vars) { res.push_back(base); std::string::size_type pos = 0; while ((pos = res.back().find("@V", pos)) != std::string::npos) { @@ -438,21 +436,21 @@ bool terrain_builder::load_images(building_rule &rule) // Parse images and animations data // If one is not valid, return false. - BOOST_FOREACH(terrain_constraint &constraint, rule.constraints) + for(terrain_constraint &constraint : rule.constraints) { - BOOST_FOREACH(rule_image& ri, constraint.images) + for(rule_image& ri : constraint.images) { - BOOST_FOREACH(rule_image_variant& variant, ri.variants) + for(rule_image_variant& variant : ri.variants) { std::vector var_strings = get_variations(variant.image_string, variant.variations); - BOOST_FOREACH(const std::string& var, var_strings) + for(const std::string& var : var_strings) { /** @todo improve this, 99% of terrains are not animated. */ std::vector frames = utils::square_parenthetical_split(var,','); animated res; - BOOST_FOREACH(const std::string& frame, frames) + for(const std::string& frame : frames) { const std::vector items = utils::split(frame, ':'); const std::string& str = items.front(); @@ -592,7 +590,7 @@ void terrain_builder::replace_rotate_tokens(std::string &s, int angle, void terrain_builder::replace_rotate_tokens(rule_image &image, int angle, const std::vector &replacement) { - BOOST_FOREACH(rule_image_variant& variant, image.variants) { + for(rule_image_variant& variant : image.variants) { replace_rotate_tokens(variant, angle, replacement); } } @@ -600,7 +598,7 @@ void terrain_builder::replace_rotate_tokens(rule_image &image, int angle, void terrain_builder::replace_rotate_tokens(rule_imagelist &list, int angle, const std::vector &replacement) { - BOOST_FOREACH(rule_image &img, list) { + for(rule_image &img : list) { replace_rotate_tokens(img, angle, replacement); } } @@ -608,16 +606,16 @@ void terrain_builder::replace_rotate_tokens(rule_imagelist &list, int angle, void terrain_builder::replace_rotate_tokens(building_rule &rule, int angle, const std::vector &replacement) { - BOOST_FOREACH(terrain_constraint &cons, rule.constraints) + for(terrain_constraint &cons : rule.constraints) { // Transforms attributes - BOOST_FOREACH(std::string &flag, cons.set_flag) { + for(std::string &flag : cons.set_flag) { replace_rotate_tokens(flag, angle, replacement); } - BOOST_FOREACH(std::string &flag, cons.no_flag) { + for(std::string &flag : cons.no_flag) { replace_rotate_tokens(flag, angle, replacement); } - BOOST_FOREACH(std::string &flag, cons.has_flag) { + for(std::string &flag : cons.has_flag) { replace_rotate_tokens(flag, angle, replacement); } replace_rotate_tokens(cons.images, angle, replacement); @@ -634,7 +632,7 @@ void terrain_builder::rotate_rule(building_rule &ret, int angle, return; } - BOOST_FOREACH(terrain_constraint &cons, ret.constraints) { + for(terrain_constraint &cons : ret.constraints) { rotate(cons, angle); } @@ -642,7 +640,7 @@ void terrain_builder::rotate_rule(building_rule &ret, int angle, int minx = INT_MAX; int miny = INT_MAX; - BOOST_FOREACH(const terrain_constraint &cons, ret.constraints) { + for(const terrain_constraint &cons : ret.constraints) { minx = std::min(cons.loc.x, minx); miny = std::min(2 * cons.loc.y + (cons.loc.x & 1), miny); } @@ -652,7 +650,7 @@ void terrain_builder::rotate_rule(building_rule &ret, int angle, if(!(miny & 1) && (minx & 1) && (minx > 0)) miny -= 2; - BOOST_FOREACH(terrain_constraint &cons, ret.constraints) { + for(terrain_constraint &cons : ret.constraints) { legacy_sum_assign(cons.loc,map_location(-minx, -((miny - 1) / 2))); } @@ -678,7 +676,7 @@ terrain_builder::rule_image_variant::rule_image_variant(const std::string &image void terrain_builder::add_images_from_config(rule_imagelist& images, const config &cfg, bool global, int dx, int dy) { - BOOST_FOREACH(const config &img, cfg.child_range("image")) + for (const config &img : cfg.child_range("image")) { int layer = img["layer"]; @@ -705,7 +703,7 @@ void terrain_builder::add_images_from_config(rule_imagelist& images, const confi images.push_back(rule_image(layer, basex - dx, basey - dy, global, center_x, center_y, is_water)); // Adds the other variants of the image - BOOST_FOREACH(const config &variant, img.child_range("variant")) + for(const config &variant : img.child_range("variant")) { const std::string &name = variant["name"]; const std::string &variations = img["variations"]; @@ -731,7 +729,7 @@ terrain_builder::terrain_constraint &terrain_builder::add_constraints( const t_translation::t_match& type, const config& global_images) { terrain_constraint *cons = nullptr; - BOOST_FOREACH(terrain_constraint &c, constraints) { + for (terrain_constraint &c : constraints) { if (c.loc == loc) { cons = &c; break; @@ -872,7 +870,7 @@ void terrain_builder::parse_config(const config &cfg, bool local) int n = 0; // Parses the list of building rules (BRs) - BOOST_FOREACH(const config &br, cfg.child_range("terrain_graphics")) + for(const config &br : cfg.child_range("terrain_graphics")) { building_rule pbr; // Parsed Building rule pbr.local = local; @@ -894,7 +892,7 @@ void terrain_builder::parse_config(const config &cfg, bool local) parse_mapstring(br["map"], pbr, anchors, br); // Parses the terrain constraints (TCs) - BOOST_FOREACH(const config &tc, br.child_range("tile")) + for (const config &tc : br.child_range("tile")) { // Adds the terrain constraint to the current built terrain's list // of terrain constraints, if it does not exist. @@ -930,7 +928,7 @@ void terrain_builder::parse_config(const config &cfg, bool local) const std::vector global_has_flag = utils::split(br["has_flag"]); const std::vector global_set_no_flag = utils::split(br["set_no_flag"]); - BOOST_FOREACH(terrain_constraint &constraint, pbr.constraints) + for(terrain_constraint &constraint : pbr.constraints) { constraint.set_flag.insert(constraint.set_flag.end(), global_set_flag.begin(), global_set_flag.end()); @@ -1035,7 +1033,7 @@ bool terrain_builder::rule_matches(const terrain_builder::building_rule &rule, } } - BOOST_FOREACH(const terrain_constraint &cons, rule.constraints) + for(const terrain_constraint &cons : rule.constraints) { // Translated location const map_location tloc = legacy_sum(loc,cons.loc); @@ -1053,13 +1051,13 @@ bool terrain_builder::rule_matches(const terrain_builder::building_rule &rule, const std::set &flags = tile_map_[tloc].flags; - BOOST_FOREACH(const std::string &s, cons.no_flag) { + for (const std::string &s : cons.no_flag) { // If a flag listed in "no_flag" is present, the rule does not match if (flags.find(s) != flags.end()) { return false; } } - BOOST_FOREACH(const std::string &s, cons.has_flag) { + for (const std::string &s : cons.has_flag) { // If a flag listed in "has_flag" is not present, this rule does not match if (flags.find(s) == flags.end()) { return false; @@ -1074,7 +1072,7 @@ void terrain_builder::apply_rule(const terrain_builder::building_rule &rule, con { unsigned int rand_seed = get_noise(loc, rule.get_hash()); - BOOST_FOREACH(const terrain_constraint &constraint, rule.constraints) + for(const terrain_constraint &constraint : rule.constraints) { const map_location tloc = legacy_sum(loc,constraint.loc); if(!tile_map_.on_map(tloc)) { @@ -1084,13 +1082,13 @@ void terrain_builder::apply_rule(const terrain_builder::building_rule &rule, con tile& btile = tile_map_[tloc]; if (!constraint.no_draw) { - BOOST_FOREACH(const rule_image &img, constraint.images) { + for (const rule_image &img : constraint.images) { btile.images.push_back(tile::rule_image_rand(&img, rand_seed)); } } // Sets flags - BOOST_FOREACH(const std::string &flag, constraint.set_flag) { + for (const std::string &flag : constraint.set_flag) { btile.flags.insert(flag); } @@ -1113,9 +1111,9 @@ unsigned int terrain_builder::building_rule::get_hash() const if(hash_ != DUMMY_HASH) return hash_; - BOOST_FOREACH(const terrain_constraint &constraint, constraints) { - BOOST_FOREACH(const rule_image& ri, constraint.images) { - BOOST_FOREACH(const rule_image_variant& variant, ri.variants) { + for(const terrain_constraint &constraint : constraints) { + for(const rule_image& ri : constraint.images) { + for(const rule_image_variant& variant : ri.variants) { // we will often hash the same string, but that seems fast enough hash_ += hash_str(variant.image_string); } @@ -1143,7 +1141,7 @@ void terrain_builder::build_terrains() } } - BOOST_FOREACH(const building_rule &rule, building_rules_) + for(const building_rule &rule : building_rules_) { // Find the constraint that contains the less terrain of all terrain rules. // We will keep a track of the matching terrains of this constraint @@ -1152,7 +1150,7 @@ void terrain_builder::build_terrains() t_translation::t_list min_types = t_translation::t_list(); // <-- This must be explicitly initialized, just as min_constraint is, at start of loop, or we get a null pointer dereference when we go through on later times. const terrain_constraint *min_constraint = nullptr; - BOOST_FOREACH(const terrain_constraint &constraint, rule.constraints) + for(const terrain_constraint &constraint : rule.constraints) { const t_translation::t_match& match = constraint.terrain_types_match; t_translation::t_list matching_types; diff --git a/src/terrain/filter.cpp b/src/terrain/filter.cpp index 12ad44b7d244..cbd2e3db6765 100644 --- a/src/terrain/filter.cpp +++ b/src/terrain/filter.cpp @@ -33,8 +33,6 @@ #include "formula/callable_objects.hpp" #include "formula/formula.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) #define WRN_NG LOG_STREAM(warn, log_engine) @@ -148,7 +146,7 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); bool found = false; - BOOST_FOREACH(const config &cfg, vi.as_array()) { + for (const config &cfg : vi.as_array()) { if (map_location(cfg, nullptr) == loc) { found = true; break; @@ -187,7 +185,7 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x std::vector sides = ssf.get_teams(); bool found = false; - BOOST_FOREACH(const int side, sides) { + for (const int side : sides) { const team &viewing_team = fc_->get_disp_context().teams().at(side - 1); bool viewer_sees = respect_fog ? !viewing_team.fogged(loc) : !viewing_team.shrouded(loc); if (visible == viewer_sees) { @@ -312,7 +310,7 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x bool found = false; if(sides.empty() && fc_->get_disp_context().village_owner(loc) == -1) found = true; - BOOST_FOREACH(const int side, sides) { + for(const int side : sides) { if(fc_->get_disp_context().teams().at(side - 1).owns_village(loc)) { found = true; break; @@ -461,7 +459,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde try { variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); - BOOST_FOREACH(const config& cfg, vi.as_array()) + for (const config& cfg : vi.as_array()) { map_location test_loc(cfg, nullptr); match_set.insert(test_loc); @@ -498,7 +496,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde { std::set findin_locs; variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); - BOOST_FOREACH(const config& cfg, vi.as_array()) + for (const config& cfg : vi.as_array()) { map_location test_loc(cfg, nullptr); if (match_set.count(test_loc)) { @@ -523,7 +521,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde xy_vector = fc_->get_disp_context().map().parse_location_range(cfg_["x"], cfg_["y"], with_border); const std::set& area = fc_->get_tod_man().get_area_by_id(cfg_["area"]); - BOOST_FOREACH(const map_location& loc, xy_vector) { + for (const map_location& loc : xy_vector) { if (area.count(loc) != 0) match_set.insert(loc); } @@ -542,7 +540,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde try { variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); - BOOST_FOREACH(const config& cfg, vi.as_array()) + for (const config& cfg : vi.as_array()) { map_location test_loc(cfg, nullptr); if (area.count(test_loc) != 0) @@ -573,7 +571,7 @@ void terrain_filter::get_locations(std::set& locs, bool with_borde { variable_access_const vi = gd->get_variable_access_read(cfg_["find_in"]); - BOOST_FOREACH(const config &cfg, vi.as_array()) { + for (const config &cfg : vi.as_array()) { map_location test_loc(cfg, nullptr); if (area.count(test_loc) != 0 && xy_set.count(test_loc) != 0) match_set.insert(test_loc); diff --git a/src/terrain/terrain.cpp b/src/terrain/terrain.cpp index 91a750e12597..38cafe18caec 100644 --- a/src/terrain/terrain.cpp +++ b/src/terrain/terrain.cpp @@ -20,8 +20,6 @@ #include "terrain/terrain.hpp" #include "util.hpp" -#include - #include static lg::log_domain log_config("config"); @@ -319,7 +317,7 @@ void create_terrain_maps(const config::const_child_itors &cfgs, t_translation::t_list& terrain_list, std::map& letter_to_terrain) { - BOOST_FOREACH(const config &t, cfgs) + for (const config &t : cfgs) { terrain_type terrain(t); DBG_G << "create_terrain_maps: " << terrain.number() << " " @@ -336,10 +334,12 @@ void create_terrain_maps(const config::const_child_itors &cfgs, std::vector eg2 = utils::split(terrain.editor_group()); std::set egs; bool clean_merge = true; - BOOST_FOREACH(std::string& t, eg1) + for (std::string& t : eg1) { clean_merge &= egs.insert(t).second; - BOOST_FOREACH(std::string& t, eg2) + } + for (std::string& t : eg2) { clean_merge &= egs.insert(t).second; + } std::string joined = utils::join(egs); curr.set_editor_group(joined); diff --git a/src/tests/create_images.cpp b/src/tests/create_images.cpp index 2cc22056287f..0c855eaf2128 100644 --- a/src/tests/create_images.cpp +++ b/src/tests/create_images.cpp @@ -24,7 +24,6 @@ #include #include -#include #include diff --git a/src/tests/gui/test_gui2.cpp b/src/tests/gui/test_gui2.cpp index 79c073b03303..e8e3b969c672 100644 --- a/src/tests/gui/test_gui2.cpp +++ b/src/tests/gui/test_gui2.cpp @@ -89,7 +89,6 @@ #include "wml_exception.hpp" #include -#include #include @@ -158,7 +157,7 @@ namespace { template void test_resolutions(const tresolution_list& resolutions) { - BOOST_FOREACH(const tresolution& resolution, resolutions) { + for(const tresolution& resolution : resolutions) { CVideo& video = test_utils::get_fake_display(resolution.first, resolution.second).video(); boost::scoped_ptr dlg(twrapper::create()); @@ -196,7 +195,7 @@ namespace { { bool interact = false; for(int i = 0; i < 2; ++i) { - BOOST_FOREACH(const tresolution& resolution, resolutions) { + for(const tresolution& resolution : resolutions) { CVideo& video = test_utils::get_fake_display(resolution.first, resolution.second).video(); boost::scoped_ptr dlg(twrapper::create()); @@ -242,7 +241,7 @@ namespace { void test_tip_resolutions(const tresolution_list& resolutions , const std::string& id) { - BOOST_FOREACH(const tresolution& resolution, resolutions) { + for(const tresolution& resolution : resolutions) { //CVideo& video = test_utils::get_fake_display(resolution.first, resolution.second).video(); @@ -483,7 +482,7 @@ BOOST_AUTO_TEST_CASE(test_gui2) // Test size() instead of empty() to get the number of offenders BOOST_CHECK_EQUAL(list.size(), 0); - BOOST_FOREACH(const std::string& id, list) { + for(const std::string& id : list) { std::cerr << "Window '" << id << "' registered but not tested.\n"; } } @@ -858,7 +857,7 @@ struct twrapper BOOST_REQUIRE_MESSAGE(result, "Failed to create a dialog."); std::vector map_generators; - BOOST_FOREACH(const config &i, main_config.child_range("multiplayer")) { + for(const config &i : main_config.child_range("multiplayer")) { if(i["scenario_generation"] == "default") { const config &generator_cfg = i.child("generator"); if (generator_cfg) { diff --git a/src/tests/test_addons.cpp b/src/tests/test_addons.cpp index 51e12035d383..10de8ff1b722 100644 --- a/src/tests/test_addons.cpp +++ b/src/tests/test_addons.cpp @@ -18,8 +18,6 @@ #include "addon/validation.hpp" -#include - BOOST_AUTO_TEST_SUITE( addons ) BOOST_AUTO_TEST_CASE( validation ) @@ -78,7 +76,7 @@ BOOST_AUTO_TEST_CASE( encoding ) // There is no test for \x00 here because \x00 really shouldn't occur in // a string -- otherwise things get weird. // - BOOST_FOREACH(const char c, raw) + for(const char c : raw) { if(c == bin_escape || bin_special.find(c) != std::string::npos) { encoded += bin_escape; diff --git a/src/tests/test_config.cpp b/src/tests/test_config.cpp index d51dc2f26aee..0f5da3acbb2a 100644 --- a/src/tests/test_config.cpp +++ b/src/tests/test_config.cpp @@ -15,7 +15,6 @@ #define GETTEXT_DOMAIN "wesnoth-test" #include -#include #include #include "config.hpp" @@ -260,7 +259,7 @@ BOOST_AUTO_TEST_CASE ( test_variable_info ) BOOST_CHECK_EQUAL (variable_access_const("tag1[1].tag2.length", nonempty).as_scalar(), 3); BOOST_CHECK_EQUAL (variable_access_const("tag1[1].tag2[2].atribute1", nonempty).as_scalar().to_int(), 88); int count = 0; - BOOST_FOREACH(const config& child, variable_access_const("tag1", nonempty).as_array()) + for(const config& child : variable_access_const("tag1", nonempty).as_array()) { //silences unused variable warning. UNUSED(child); @@ -268,7 +267,7 @@ BOOST_AUTO_TEST_CASE ( test_variable_info ) } BOOST_CHECK_EQUAL (count, 3); count = 0; - BOOST_FOREACH(const config& child, variable_access_const("tag1.tag2", nonempty).as_array()) + for(const config& child : variable_access_const("tag1.tag2", nonempty).as_array()) { //silences unused variable warning. UNUSED(child); @@ -277,7 +276,7 @@ BOOST_AUTO_TEST_CASE ( test_variable_info ) BOOST_CHECK_EQUAL (count, 0); count = 0; // explicit indexes as range always return a one element range, whether they exist or not. - BOOST_FOREACH(const config& child, variable_access_const("tag1.tag2[5]", nonempty).as_array()) + for(const config& child : variable_access_const("tag1.tag2[5]", nonempty).as_array()) { //silences unused variable warning. UNUSED(child); diff --git a/src/tests/test_filesystem.cpp b/src/tests/test_filesystem.cpp index bba7cc2260ae..ee6f17801809 100644 --- a/src/tests/test_filesystem.cpp +++ b/src/tests/test_filesystem.cpp @@ -16,8 +16,6 @@ #include "filesystem.hpp" #include "game_config.hpp" -#include - #if 0 namespace { @@ -107,11 +105,11 @@ BOOST_AUTO_TEST_CASE( test_fs_enum ) std::vector files, dirs; std::vector expected_filepaths, expected_dirpaths; - BOOST_FOREACH(const std::string& n, expected_filenames) { + for(const std::string& n : expected_filenames) { expected_filepaths.push_back(gamedata + "/" + path + "/" + n); } - BOOST_FOREACH(const std::string& n, expected_dirnames) { + for(const std::string& n : expected_dirnames) { expected_dirpaths.push_back(gamedata + "/" + path + "/" + n); } diff --git a/src/tests/test_mp_connect.cpp b/src/tests/test_mp_connect.cpp index 33820583f8a5..f480df891d43 100644 --- a/src/tests/test_mp_connect.cpp +++ b/src/tests/test_mp_connect.cpp @@ -25,7 +25,6 @@ #include "saved_game.hpp" #include "tests/utils/fake_display.hpp" -#include #include #include diff --git a/src/tests/test_whiteboard_side_actions.cpp b/src/tests/test_whiteboard_side_actions.cpp index 9ccd3f3d89b2..c6b6276031ec 100644 --- a/src/tests/test_whiteboard_side_actions.cpp +++ b/src/tests/test_whiteboard_side_actions.cpp @@ -20,7 +20,6 @@ #include "whiteboard/visitor.hpp" #include -#include using namespace wb; @@ -61,7 +60,7 @@ BOOST_AUTO_TEST_CASE( test_insertion ) BOOST_REQUIRE(sac.num_turns() == 1); int tmp=0; - BOOST_FOREACH(action_ptr act, sac){ + for(action_ptr act : sac) { ++tmp; BOOST_REQUIRE(dact = boost::dynamic_pointer_cast(act)); BOOST_REQUIRE(dact->id_ == tmp); @@ -82,7 +81,7 @@ BOOST_AUTO_TEST_CASE( test_insertion ) BOOST_REQUIRE(sac.num_turns() == 3); tmp=0; - BOOST_FOREACH(action_ptr act, sac){ + for(action_ptr act : sac) { ++tmp; BOOST_REQUIRE(dact = boost::dynamic_pointer_cast(act)); BOOST_REQUIRE(dact->id_ == tmp); diff --git a/src/text.cpp b/src/text.cpp index a75bc0f23c4e..14afd944445b 100644 --- a/src/text.cpp +++ b/src/text.cpp @@ -26,8 +26,6 @@ #include "tstring.hpp" #include "preferences.hpp" -#include - #include #include @@ -73,7 +71,7 @@ static bool looks_like_url(const std::string & token); std::string escape_text(const std::string& text) { std::string result; - BOOST_FOREACH(const char c, text) { + for(const char c : text) { switch(c) { case '&': result += "&"; break; case '<': result += "<"; break; @@ -870,7 +868,7 @@ bool ttext::set_markup_helper(const std::string& text) * with the escaped version. */ std::string semi_escaped; - BOOST_FOREACH(const char c, text) { + for(const char c : text) { if(c == '&') { semi_escaped += "&"; } else { diff --git a/src/time_of_day.cpp b/src/time_of_day.cpp index 2c7b70c348c3..c53b273be526 100644 --- a/src/time_of_day.cpp +++ b/src/time_of_day.cpp @@ -18,8 +18,6 @@ #include "time_of_day.hpp" #include "gettext.hpp" -#include - std::ostream &operator<<(std::ostream &s, const tod_color& c){ s << c.r << "," << c.g << "," << c.b; return s; @@ -67,7 +65,7 @@ void time_of_day::write(config& cfg) const void time_of_day::parse_times(const config& cfg, std::vector& times) { - BOOST_FOREACH(const config &t, cfg.child_range("time")) { + for(const config &t : cfg.child_range("time")) { times.push_back(time_of_day(t)); } diff --git a/src/tod_manager.cpp b/src/tod_manager.cpp index 482c25cf5213..3dcb7d9589c2 100644 --- a/src/tod_manager.cpp +++ b/src/tod_manager.cpp @@ -29,7 +29,6 @@ #include "network.hpp" #include "config_assign.hpp" -#include #include #include #include @@ -314,7 +313,7 @@ void tod_manager::set_area_id(int area_index, const std::string& id) { std::vector tod_manager::get_area_ids() const { std::vector areas; - BOOST_FOREACH(const area_time_of_day& area, areas_) { + for (const area_time_of_day& area : areas_) { areas.push_back(area.id); } return areas; @@ -322,7 +321,7 @@ std::vector tod_manager::get_area_ids() const const std::set& tod_manager::get_area_by_id(const std::string& id) const { - BOOST_FOREACH(const area_time_of_day& area, areas_) { + for (const area_time_of_day& area : areas_) { if (area.id == id) return area.hexes; } @@ -451,7 +450,7 @@ void tod_manager::set_turn_by_wml(const int num, game_data* vars, const bool inc void tod_manager::set_new_current_times(const int new_current_turn_number) { set_current_time(calculate_current_time(times_.size(), new_current_turn_number, currentTime_)); - BOOST_FOREACH(area_time_of_day& area, areas_) { + for (area_time_of_day& area : areas_) { set_current_time(calculate_current_time( area.times.size(), new_current_turn_number, diff --git a/src/tools/exploder_cutter.cpp b/src/tools/exploder_cutter.cpp index e3dde551fa4c..e9f81ea4bf50 100644 --- a/src/tools/exploder_cutter.cpp +++ b/src/tools/exploder_cutter.cpp @@ -20,8 +20,6 @@ #include "serialization/string_utils.hpp" #include -#include - #include cutter::cutter() diff --git a/src/tools/schema/tag.cpp b/src/tools/schema/tag.cpp index fed276add047..e0a0646cb5a6 100644 --- a/src/tools/schema/tag.cpp +++ b/src/tools/schema/tag.cpp @@ -21,8 +21,6 @@ #include "config.hpp" -#include - namespace schema_validation{ /*WIKI @@ -82,15 +80,15 @@ class_tag::class_tag(const config & cfg) if (cfg.has_attribute("super")){ super_ = cfg["super"].str(); } - BOOST_FOREACH(const config &child, cfg.child_range("tag")) { + for (const config &child : cfg.child_range("tag")) { class_tag child_tag (child); add_tag(child_tag); } - BOOST_FOREACH(const config &child, cfg.child_range("key")) { + for (const config &child : cfg.child_range("key")) { class_key child_key (child); add_key(child_key); } - BOOST_FOREACH(const config &link, cfg.child_range("link")) { + for (const config &link : cfg.child_range("link")) { std::string link_name = link["name"].str(); add_link(link_name); } diff --git a/src/tools/sdl2/sdl2.cpp b/src/tools/sdl2/sdl2.cpp index da5ca0204540..e3ad2cb6a131 100644 --- a/src/tools/sdl2/sdl2.cpp +++ b/src/tools/sdl2/sdl2.cpp @@ -26,8 +26,6 @@ #include -#include - #include #include diff --git a/src/tooltips.cpp b/src/tooltips.cpp index 9d797f3bbf4a..1402505ad856 100644 --- a/src/tooltips.cpp +++ b/src/tooltips.cpp @@ -25,8 +25,6 @@ #include // Travis doesn't like this, although it works on my machine -> '#include -#include - namespace { CVideo* video_ = nullptr; diff --git a/src/tracer.cpp b/src/tracer.cpp index b307c6a6d55b..034e0699c6cd 100644 --- a/src/tracer.cpp +++ b/src/tracer.cpp @@ -14,8 +14,6 @@ #include "tracer.hpp" -#include - #include #include diff --git a/src/units/abilities.cpp b/src/units/abilities.cpp index 90be47c9d6aa..529185e052bc 100644 --- a/src/units/abilities.cpp +++ b/src/units/abilities.cpp @@ -28,8 +28,6 @@ #include "units/map.hpp" #include "filter_context.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) @@ -132,7 +130,7 @@ bool unit::get_ability_bool(const std::string& tag_name, const map_location& loc { assert(resources::teams); - BOOST_FOREACH(const config &i, this->abilities_.child_range(tag_name)) { + for (const config &i : this->abilities_.child_range(tag_name)) { if (ability_active(tag_name, i, loc) && ability_affects_self(tag_name, i, loc)) { @@ -154,7 +152,7 @@ bool unit::get_ability_bool(const std::string& tag_name, const map_location& loc // ourself. if ( &*it == this ) continue; - BOOST_FOREACH(const config &j, it->abilities_.child_range(tag_name)) { + for (const config &j : it->abilities_.child_range(tag_name)) { if (affects_side(j, *resources::teams, side(), it->side()) && it->ability_active(tag_name, j, adjacent[i]) && ability_affects_adjacent(tag_name, j, i, loc, *it)) @@ -173,7 +171,7 @@ unit_ability_list unit::get_abilities(const std::string& tag_name, const map_loc unit_ability_list res; - BOOST_FOREACH(const config &i, this->abilities_.child_range(tag_name)) { + for (const config &i : this->abilities_.child_range(tag_name)) { if (ability_active(tag_name, i, loc) && ability_affects_self(tag_name, i, loc)) { @@ -195,7 +193,7 @@ unit_ability_list unit::get_abilities(const std::string& tag_name, const map_loc // ourself. if ( &*it == this ) continue; - BOOST_FOREACH(const config &j, it->abilities_.child_range(tag_name)) { + for (const config &j : it->abilities_.child_range(tag_name)) { if (affects_side(j, *resources::teams, side(), it->side()) && it->ability_active(tag_name, j, adjacent[i]) && ability_affects_adjacent(tag_name, j, i, loc, *it)) @@ -213,7 +211,7 @@ std::vector unit::get_ability_list() const { std::vector res; - BOOST_FOREACH(const config::any_child &ab, this->abilities_.all_children_range()) { + for (const config::any_child &ab : this->abilities_.all_children_range()) { std::string const &id = ab.cfg["id"]; if (!id.empty()) res.push_back(id); @@ -266,7 +264,7 @@ std::vector > unit::ability_tooltips(st if ( active_list ) active_list->clear(); - BOOST_FOREACH(const config::any_child &ab, this->abilities_.all_children_range()) + for (const config::any_child &ab : this->abilities_.all_children_range()) { if ( !active_list || ability_active(ab.key, ab.cfg, loc_) ) { @@ -321,12 +319,12 @@ bool unit::ability_active(const std::string& ability,const config& cfg,const map get_adjacent_tiles(loc,adjacent); const unit_map& units = *resources::units; - BOOST_FOREACH(const config &i, cfg.child_range("filter_adjacent")) + for (const config &i : cfg.child_range("filter_adjacent")) { size_t count = 0; const unit_filter ufilt(vconfig(i), resources::filter_con, illuminates); std::vector dirs = map_location::parse_directions(i["adjacent"]); - BOOST_FOREACH(const map_location::DIRECTION index, dirs) + for (const map_location::DIRECTION index : dirs) { if (index == map_location::NDIRECTIONS) continue; @@ -351,14 +349,14 @@ bool unit::ability_active(const std::string& ability,const config& cfg,const map } } - BOOST_FOREACH(const config &i, cfg.child_range("filter_adjacent_location")) + for (const config &i : cfg.child_range("filter_adjacent_location")) { size_t count = 0; terrain_filter adj_filter(vconfig(i), resources::filter_con); adj_filter.flatten(illuminates); std::vector dirs = map_location::parse_directions(i["adjacent"]); - BOOST_FOREACH(const map_location::DIRECTION index, dirs) + for (const map_location::DIRECTION index : dirs) { if (index == map_location::NDIRECTIONS) { continue; @@ -389,7 +387,7 @@ bool unit::ability_affects_adjacent(const std::string& ability, const config& cf assert(dir >=0 && dir <= 5); map_location::DIRECTION direction = static_cast(dir); - BOOST_FOREACH(const config &i, cfg.child_range("affect_adjacent")) + for (const config &i : cfg.child_range("affect_adjacent")) { if (i.has_attribute("adjacent")) { //key adjacent defined std::vector dirs = map_location::parse_directions(i["adjacent"]); @@ -437,7 +435,7 @@ std::pair unit_ability_list::highest(const std::string& key, i int abs_max = 0; int flat = 0; int stack = 0; - BOOST_FOREACH(unit_ability const &p, cfgs_) + for (unit_ability const &p : cfgs_) { int value = (*p.first)[key].to_int(def); if ((*p.first)["cumulative"].to_bool()) { @@ -468,7 +466,7 @@ std::pair unit_ability_list::lowest(const std::string& key, in int abs_max = 0; int flat = 0; int stack = 0; - BOOST_FOREACH(unit_ability const &p, cfgs_) + for (unit_ability const &p : cfgs_) { int value = (*p.first)[key].to_int(def); if ((*p.first)["cumulative"].to_bool()) { @@ -530,7 +528,7 @@ namespace { */ bool get_special_children(std::vector& result, const config& parent, const std::string& id, bool just_peeking=false) { - BOOST_FOREACH(const config::any_child &sp, parent.all_children_range()) + for (const config::any_child &sp : parent.all_children_range()) { if (sp.key == id || sp.cfg["id"] == id) { if(just_peeking) { @@ -590,12 +588,12 @@ unit_ability_list attack_type::get_specials(const std::string& special) const { //log_scope("get_specials"); unit_ability_list res; - BOOST_FOREACH(const config &i, specials_.child_range(special)) { + for (const config &i : specials_.child_range(special)) { if ( special_active(i, AFFECT_SELF) ) res.push_back(unit_ability(&i, self_loc_)); } if (!other_attack_) return res; - BOOST_FOREACH(const config &i, other_attack_->specials_.child_range(special)) { + for (const config &i : other_attack_->specials_.child_range(special)) { if ( other_attack_->special_active(i, AFFECT_OTHER) ) res.push_back(unit_ability(&i, other_loc_)); } @@ -619,7 +617,7 @@ std::vector > attack_type::special_tooltips( if ( active_list ) active_list->clear(); - BOOST_FOREACH(const config::any_child &sp, specials_.all_children_range()) + for (const config::any_child &sp : specials_.all_children_range()) { if ( !active_list || special_active(sp.cfg, AFFECT_EITHER) ) { const t_string &name = sp.cfg["name"]; @@ -652,7 +650,7 @@ std::string attack_type::weapon_specials(bool only_active, bool is_backstab) con { //log_scope("weapon_specials"); std::string res; - BOOST_FOREACH(const config::any_child &sp, specials_.all_children_range()) + for (const config::any_child &sp : specials_.all_children_range()) { if ( only_active && !special_active(sp.cfg, AFFECT_EITHER, is_backstab) ) continue; @@ -924,12 +922,12 @@ bool attack_type::special_active(const config& special, AFFECTS whom, get_adjacent_tiles(self_loc_, adjacent); // Filter the adjacent units. - BOOST_FOREACH(const config &i, special.child_range("filter_adjacent")) + for (const config &i : special.child_range("filter_adjacent")) { size_t count = 0; std::vector dirs = map_location::parse_directions(i["adjacent"]); unit_filter filter(vconfig(i), resources::filter_con); - BOOST_FOREACH(const map_location::DIRECTION index, dirs) + for (const map_location::DIRECTION index : dirs) { if (index == map_location::NDIRECTIONS) continue; @@ -953,12 +951,12 @@ bool attack_type::special_active(const config& special, AFFECTS whom, } // Filter the adjacent locations. - BOOST_FOREACH(const config &i, special.child_range("filter_adjacent_location")) + for (const config &i : special.child_range("filter_adjacent_location")) { size_t count = 0; std::vector dirs = map_location::parse_directions(i["adjacent"]); terrain_filter adj_filter(vconfig(i), resources::filter_con); - BOOST_FOREACH(const map_location::DIRECTION index, dirs) + for (const map_location::DIRECTION index : dirs) { if (index == map_location::NDIRECTIONS) continue; @@ -1023,7 +1021,7 @@ effect::effect(const unit_ability_list& list, int def, bool backstab) : individual_effect set_effect; - BOOST_FOREACH (const unit_ability & ability, list) { + for (const unit_ability & ability : list) { const config& cfg = *ability.first; std::string const &effect_id = cfg[cfg["id"].empty() ? "name" : "id"]; diff --git a/src/units/animation.cpp b/src/units/animation.cpp index 7ef24bb870ee..22a6a9d4ea6a 100644 --- a/src/units/animation.cpp +++ b/src/units/animation.cpp @@ -27,8 +27,6 @@ #include "units/filter.hpp" #include "variable.hpp" -#include - #include struct tag_name_manager { @@ -81,7 +79,7 @@ struct animation_branch config merge() const { config result = attributes; - BOOST_FOREACH(const config::all_children_iterator &i, children) { + for (const config::all_children_iterator &i : children) { result.add_child(i->key, i->cfg); } return result; @@ -222,7 +220,7 @@ static void prepare_single_animation(const config &anim_cfg, animation_branches } if (ac.itors.first->key != "if") { // Append current config object to all the branches in scope. - BOOST_FOREACH(animation_branch &ab, ac.branches) { + for (animation_branch &ab : ac.branches) { ab.children.push_back(ac.itors.first); } ++ac.itors.first; @@ -243,9 +241,9 @@ static void prepare_single_animation(const config &anim_cfg, animation_branches } //debug - /*BOOST_FOREACH(animation_branch &ab, anim_cursors.back().branches) { + /*for (animation_branch &ab : anim_cursors.back().branches) { std::cout << "--branch--\n" << ab.attributes; - BOOST_FOREACH(config::all_children_iterator &ci, ab.children) { + for (config::all_children_iterator &ci : ab.children) { std::cout << "--branchcfg--\n" << ci->cfg; } std::cout << "\n"; @@ -261,7 +259,7 @@ static void prepare_single_animation(const config &anim_cfg, animation_branches static animation_branches prepare_animation(const config &cfg, const std::string &animation_tag) { animation_branches expanded_animations; - BOOST_FOREACH(const config &anim, cfg.child_range(animation_tag)) { + for (const config &anim : cfg.child_range(animation_tag)) { prepare_single_animation(anim, expanded_animations); } return expanded_animations; @@ -314,7 +312,7 @@ unit_animation::unit_animation(const config& cfg,const std::string& frame_string overlaped_hex_() { // if(!cfg["debug"].empty()) printf("DEBUG WML: FINAL\n%s\n\n",cfg.debug().c_str()); - BOOST_FOREACH(const config::any_child &fr, cfg.all_children_range()) + for (const config::any_child &fr : cfg.all_children_range()) { if (fr.key == frame_string) continue; if (fr.key.find("_frame", fr.key.size() - 6) == std::string::npos) continue; @@ -334,11 +332,11 @@ unit_animation::unit_animation(const config& cfg,const std::string& frame_string fc = resources::filter_con; //!< This is a pointer to the gamestate. Would prefer to tie unit animations only to the display, but for now this is an acceptable fallback. It seems to be relevant because when a second game is created, it seems that the game_display is null at the time that units are being constructed, and hence at the time that this code is running. A different solution might be to delay the team_builder stage 2 call until after the gui is initialized. Note that the current set up could concievably cause problems with the editor, iirc it doesn't initailize a filter context. assert(fc); }*/ - BOOST_FOREACH(const config &filter, cfg.child_range("filter")) { + for (const config &filter : cfg.child_range("filter")) { unit_filter_.push_back(filter); } - BOOST_FOREACH(const config &filter, cfg.child_range("filter_second")) { + for (const config &filter : cfg.child_range("filter_second")) { secondary_unit_filter_.push_back(filter); } @@ -366,10 +364,10 @@ unit_animation::unit_animation(const config& cfg,const std::string& frame_string for(value2=value2_str.begin() ; value2 != value2_str.end() ; ++value2) { value2_.push_back(atoi(value2->c_str())); } - BOOST_FOREACH(const config &filter, cfg.child_range("filter_attack")) { + for (const config &filter : cfg.child_range("filter_attack")) { primary_attack_filter_.push_back(filter); } - BOOST_FOREACH(const config &filter, cfg.child_range("filter_second_attack")) { + for (const config &filter : cfg.child_range("filter_second_attack")) { secondary_attack_filter_.push_back(filter); } play_offscreen_ = cfg["offscreen"].to_bool(true); @@ -418,7 +416,7 @@ int unit_animation::matches(const display &disp, const map_location& loc,const m if(!secondary_unit_filter_.empty()) { unit_map::const_iterator unit = disp.get_units().find(second_loc); if (unit.valid()) { - BOOST_FOREACH(const config &c , secondary_unit_filter_) { + for (const config &c : secondary_unit_filter_) { unit_filter f(vconfig(c), &disp); if (!f(*unit, second_loc)) return MATCH_FAIL; result++; @@ -603,7 +601,7 @@ static void add_simple_anim(std::vector &animations, display::tdrawing_layer layer = display::LAYER_UNIT_DEFAULT, bool offscreen = true) { - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, tag_name)) + for (const animation_branch &ab : prepare_animation(cfg, tag_name)) { config anim = ab.merge(); anim["apply_to"] = apply_to; @@ -619,7 +617,7 @@ static void add_simple_anim(std::vector &animations, void unit_animation::add_anims( std::vector & animations, const config & cfg) { - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "animation")) { + for (const animation_branch &ab : prepare_animation(cfg, "animation")) { animations.push_back(unit_animation(ab.merge())); } @@ -635,13 +633,13 @@ void unit_animation::add_anims( std::vector & animations, const add_simple_anim(animations, cfg, "levelin_anim", "levelin"); add_simple_anim(animations, cfg, "levelout_anim", "levelout"); - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "standing_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "standing_anim")) { config anim = ab.merge(); anim["apply_to"] = "standing"; anim["cycles"] = "true"; // add cycles to all frames within a standing animation block - BOOST_FOREACH(config::all_children_iterator ci, ab.children) + for (config::all_children_iterator ci : ab.children) { std::string sub_frame_name = ci->key; size_t pos = sub_frame_name.find("_frame"); @@ -654,12 +652,12 @@ void unit_animation::add_anims( std::vector & animations, const animations.push_back(unit_animation(anim)); } // standing animations are also used as default animations - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "standing_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "standing_anim")) { config anim = ab.merge(); anim["apply_to"] = "default"; anim["cycles"] = "true"; - BOOST_FOREACH(config::all_children_iterator ci, ab.children) + for (config::all_children_iterator ci : ab.children) { std::string sub_frame_name = ci->key; size_t pos = sub_frame_name.find("_frame"); @@ -671,7 +669,7 @@ void unit_animation::add_anims( std::vector & animations, const if (anim["offscreen"].empty()) anim["offscreen"] = false; animations.push_back(unit_animation(anim)); } - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "healing_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "healing_anim")) { config anim = ab.merge(); anim["apply_to"] = "healing"; @@ -680,7 +678,7 @@ void unit_animation::add_anims( std::vector & animations, const animations.push_back(unit_animation(anim)); } - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "healed_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "healed_anim")) { config anim = ab.merge(); anim["apply_to"] = "healed"; @@ -697,7 +695,7 @@ void unit_animation::add_anims( std::vector & animations, const animations.back().sub_anims_["_healed_sound"].add_frame(1,frame_builder().sound(healed_sound),true); } - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "poison_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "poison_anim")) { config anim = ab.merge(); anim["apply_to"] ="poisoned"; @@ -710,7 +708,7 @@ void unit_animation::add_anims( std::vector & animations, const add_simple_anim(animations, cfg, "pre_movement_anim", "pre_movement", display::LAYER_UNIT_MOVE_DEFAULT); - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "movement_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "movement_anim")) { config anim = ab.merge(); if (anim["offset"].empty()) { @@ -723,7 +721,7 @@ void unit_animation::add_anims( std::vector & animations, const add_simple_anim(animations, cfg, "post_movement_anim", "post_movement", display::LAYER_UNIT_MOVE_DEFAULT); - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "defend")) + for (const animation_branch &ab : prepare_animation(cfg, "defend")) { config anim = ab.merge(); anim["apply_to"] = "defend"; @@ -748,7 +746,7 @@ void unit_animation::add_anims( std::vector & animations, const else { std::vector v = utils::split(anim["hits"]); - BOOST_FOREACH(const std::string &hit_type, v) + for (const std::string &hit_type : v) { config tmp = anim; tmp["hits"] = hit_type; @@ -767,7 +765,7 @@ void unit_animation::add_anims( std::vector & animations, const add_simple_anim(animations, cfg, "draw_weapon_anim", "draw_weapon", display::LAYER_UNIT_MOVE_DEFAULT); add_simple_anim(animations, cfg, "sheath_weapon_anim", "sheath_weapon", display::LAYER_UNIT_MOVE_DEFAULT); - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "attack_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "attack_anim")) { config anim = ab.merge(); anim["apply_to"] = "attack"; @@ -788,7 +786,7 @@ void unit_animation::add_anims( std::vector & animations, const animations.push_back(unit_animation(anim)); } - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "death")) + for (const animation_branch &ab : prepare_animation(cfg, "death")) { config anim = ab.merge(); anim["apply_to"] = "death"; @@ -808,7 +806,7 @@ void unit_animation::add_anims( std::vector & animations, const add_simple_anim(animations, cfg, "victory_anim", "victory"); - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "extra_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "extra_anim")) { config anim = ab.merge(); anim["apply_to"] = anim["flag"]; @@ -816,7 +814,7 @@ void unit_animation::add_anims( std::vector & animations, const animations.push_back(unit_animation(anim)); } - BOOST_FOREACH(const animation_branch &ab, prepare_animation(cfg, "teleport_anim")) + for (const animation_branch &ab : prepare_animation(cfg, "teleport_anim")) { config anim = ab.merge(); if (anim["layer"].empty()) anim["layer"] = default_layer; @@ -887,14 +885,14 @@ unit_animation::particule::particule( config::const_child_itors range = cfg.child_range(frame_string+"frame"); starting_frame_time_=INT_MAX; if(cfg[frame_string+"start_time"].empty() &&range.first != range.second) { - BOOST_FOREACH(const config &frame, range) { + for (const config &frame : range) { starting_frame_time_ = std::min(starting_frame_time_, frame["begin"].to_int()); } } else { starting_frame_time_ = cfg[frame_string+"start_time"]; } - BOOST_FOREACH(const config &frame, range) + for (const config &frame : range) { unit_frame tmp_frame(frame); add_frame(tmp_frame.duration(),tmp_frame,!tmp_frame.does_not_change()); @@ -1101,7 +1099,7 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim { std::cout << "["; int i=0; - BOOST_FOREACH(std::string event, u_animation.event_) { + for (std::string event : u_animation.event_) { if (i>0) std::cout << ','; i++; std::cout << event; } @@ -1112,7 +1110,7 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim if (u_animation.hits_.size() > 0) { std::cout << "\thits="; i=0; - BOOST_FOREACH(const unit_animation::hit_type hit_type, u_animation.hits_) { + for (const unit_animation::hit_type hit_type : u_animation.hits_) { if (i>0) std::cout << ','; i++; switch (hit_type) { case (unit_animation::HIT) : std::cout << "hit"; break; @@ -1126,7 +1124,7 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim if (u_animation.directions_.size() > 0) { std::cout << "\tdirections="; i=0; - BOOST_FOREACH(const map_location::DIRECTION direction, u_animation.directions_) { + for (const map_location::DIRECTION direction : u_animation.directions_) { if (i>0) std::cout << ','; i++; switch (direction) { case (map_location::NORTH) : std::cout << "n"; break; @@ -1143,7 +1141,7 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim if (u_animation.terrain_types_.size() > 0) { i=0; std::cout << "\tterrain="; - BOOST_FOREACH(const t_translation::t_terrain terrain, u_animation.terrain_types_) { + for (const t_translation::t_terrain terrain : u_animation.terrain_types_) { if (i>0) std::cout << ','; i++; std::cout << terrain; } @@ -1153,7 +1151,7 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim if (u_animation.unit_filter_.size() > 0) { std::cout << "[filter]\n"; - BOOST_FOREACH(const config & cfg, u_animation.unit_filter_) { + for (const config & cfg : u_animation.unit_filter_) { std::cout << cfg.debug(); } //std::cout << "TODO: create debugging output for unit filters"; @@ -1161,7 +1159,7 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim } if (u_animation.secondary_unit_filter_.size() > 0) { std::cout << "[filter_second]\n"; - BOOST_FOREACH(const config & cfg, u_animation.secondary_unit_filter_) { + for (const config & cfg : u_animation.secondary_unit_filter_) { std::cout << cfg.debug(); } //std::cout << "TODO: create debugging output for unit filters"; @@ -1169,14 +1167,14 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim } if (u_animation.primary_attack_filter_.size() > 0) { std::cout << "[filter_attack]\n"; - BOOST_FOREACH(const config cfg, u_animation.primary_attack_filter_) { + for (const config cfg : u_animation.primary_attack_filter_) { std::cout << cfg.debug(); } std::cout << "[/filter_attack]\n"; } if (u_animation.secondary_attack_filter_.size() > 0) { std::cout << "[filter_second_attack]\n"; - BOOST_FOREACH(const config cfg, u_animation.secondary_attack_filter_) { + for (const config cfg : u_animation.secondary_attack_filter_) { std::cout << cfg.debug(); } std::cout << "[/filter_second_attack]\n"; @@ -1184,21 +1182,20 @@ std::ostream& operator << (std::ostream& outstream, const unit_animation& u_anim for (size_t i=0; i p; - BOOST_FOREACH (p, u_animation.sub_anims_) { + for (std::pair p : u_animation.sub_anims_) { for (size_t i=0; i0) std::cout << ','; i++; std::cout << event; } diff --git a/src/units/attack_type.cpp b/src/units/attack_type.cpp index 9eb127128ed1..1ee4a9a49069 100644 --- a/src/units/attack_type.cpp +++ b/src/units/attack_type.cpp @@ -26,7 +26,6 @@ #include "log.hpp" #include "serialization/string_utils.hpp" #include "gettext.hpp" -#include static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -162,7 +161,7 @@ bool attack_type::matches_filter(const config& filter) const bool matches = matches_simple_filter(*this, filter); // Handle [and], [or], and [not] with in-order precedence - BOOST_FOREACH( const config::any_child &condition, filter.all_children_range() ) + for (const config::any_child &condition : filter.all_children_range() ) { // Handle [and] if ( condition.key == "and" ) @@ -238,7 +237,7 @@ bool attack_type::apply_modification(const config& cfg) if(del_specials.empty() == false) { const std::vector& dsl = utils::split(del_specials); config new_specials; - BOOST_FOREACH(const config::any_child &vp, specials_.all_children_range()) { + for (const config::any_child &vp : specials_.all_children_range()) { std::vector::const_iterator found_id = std::find(dsl.begin(), dsl.end(), vp.cfg["id"].str()); if (found_id == dsl.end()) { @@ -253,7 +252,7 @@ bool attack_type::apply_modification(const config& cfg) if (mode != "append") { specials_.clear(); } - BOOST_FOREACH(const config::any_child &value, set_specials.all_children_range()) { + for (const config::any_child &value : set_specials.all_children_range()) { specials_.add_child(value.key, value.cfg); } } diff --git a/src/units/drawer.cpp b/src/units/drawer.cpp index 6f594cc6bc53..f5d606328165 100644 --- a/src/units/drawer.cpp +++ b/src/units/drawer.cpp @@ -27,8 +27,6 @@ #include "units/animation_component.hpp" #include "units/frame.hpp" -#include - unit_drawer::unit_drawer(display & thedisp, std::map & bar_rects) : disp(thedisp), dc(disp.get_disp_context()), diff --git a/src/units/filter.cpp b/src/units/filter.cpp index bcda435f335e..856947600e6d 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -38,7 +38,6 @@ #include "formula/callable_objects.hpp" #include "formula/formula.hpp" -#include #include #include #include @@ -85,7 +84,7 @@ class null_unit_filter_impl : public unit_filter_abstract_impl { } virtual std::vector all_matches_on_map(unsigned max_matches) const { std::vector ret; - BOOST_FOREACH(const unit & u, fc_.get_disp_context().units()) { + for(const unit & u : fc_.get_disp_context().units()) { --max_matches; ret.push_back(&u); if(max_matches == 0) { @@ -340,7 +339,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l const unit_type* const type = u.variation().empty() ? &u.type() : unit_types.find(u.type().base_id()); assert(type); - BOOST_FOREACH(const std::string& variation_id, utils::split(vcfg["has_variation"])) { + for (const std::string& variation_id : utils::split(vcfg["has_variation"])) { if (type->has_variation(variation_id)) { match = true; break; @@ -353,7 +352,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l { bool match = false; - BOOST_FOREACH(const std::string& ability_id, utils::split(vcfg["ability"])) { + for (const std::string& ability_id : utils::split(vcfg["ability"])) { if (u.has_ability_by_id(ability_id)) { match = true; break; @@ -386,7 +385,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l bool status_found = false; std::map states_map = u.get_states(); - BOOST_FOREACH (const std::string status, utils::split(vcfg["status"])) { + for (const std::string status : utils::split(vcfg["status"])) { if (states_map[status] == "yes") { status_found = true; break; @@ -461,7 +460,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l // filter only => not for us // unit only => not filtered config unit_cfg; // No point in serializing the unit once for each [filter_wml]! - BOOST_FOREACH(const vconfig& wmlcfg, vcfg.get_children("filter_wml")) { + for (const vconfig& wmlcfg : vcfg.get_children("filter_wml")) { config fwml = wmlcfg.get_parsed_config(); /* Check if the filter only cares about variables. If so, no need to serialize the whole unit. */ @@ -480,7 +479,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l } } - BOOST_FOREACH(const vconfig& vision, vcfg.get_children("filter_vision")) { + for (const vconfig& vision : vcfg.get_children("filter_vision")) { std::set viewers; // Use standard side filter @@ -489,7 +488,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l viewers.insert(sides.begin(), sides.end()); bool found = false; - BOOST_FOREACH (const int viewer, viewers) { + for (const int viewer : viewers) { bool fogged = fc_.get_disp_context().teams()[viewer - 1].fogged(loc); bool hiding = u.invisible(loc/*, false(?) */); bool unit_hidden = fogged || hiding; @@ -506,7 +505,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l map_location adjacent[6]; get_adjacent_tiles(loc, adjacent); - BOOST_FOREACH(const vconfig& adj_cfg, vcfg.get_children("filter_adjacent")) { + for (const vconfig& adj_cfg : vcfg.get_children("filter_adjacent")) { int match_count=0; unit_filter filt(adj_cfg, &fc_, use_flat_tod_); @@ -549,7 +548,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l { variable_access_const vi = gd->get_variable_access_read(vcfg["find_in"]); bool found_id = false; - BOOST_FOREACH(const config& c, vi.as_array()) + for (const config& c : vi.as_array()) { if(c["id"] == u.id()) found_id = true; @@ -598,7 +597,7 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l std::vector basic_unit_filter_impl::all_matches_on_map(unsigned max_matches) const { std::vector ret; - BOOST_FOREACH(const unit & u, fc_.get_disp_context().units()) { + for (const unit & u : fc_.get_disp_context().units()) { if (matches(u, u.get_location(), nullptr)) { if(max_matches == 0) { return ret; diff --git a/src/units/formula_manager.cpp b/src/units/formula_manager.cpp index 5f62bfa306f9..6cd41d4a1ea3 100644 --- a/src/units/formula_manager.cpp +++ b/src/units/formula_manager.cpp @@ -21,8 +21,6 @@ #include "map/location.hpp" #include "log.hpp" -#include - void unit_formula_manager::add_formula_var(std::string str, variant var) { if(!formula_vars_) formula_vars_ = new game_logic::map_formula_callable; @@ -40,7 +38,7 @@ void unit_formula_manager::read(const config & ai) formula_vars_ = new game_logic::map_formula_callable; variant var; - BOOST_FOREACH(const config::attribute &i, ai_vars.attribute_range()) { + for (const config::attribute &i : ai_vars.attribute_range()) { var.serialize_from_string(i.second); formula_vars_->add(i.first, var); } diff --git a/src/units/map.cpp b/src/units/map.cpp index 87c80f6c32e5..4dd89eda1e2f 100644 --- a/src/units/map.cpp +++ b/src/units/map.cpp @@ -22,8 +22,6 @@ #include #include "units/map.hpp" -#include - static lg::log_domain log_engine("engine"); #define ERR_NG LOG_STREAM(err, log_engine) #define WRN_NG LOG_STREAM(warn, log_engine) @@ -382,7 +380,7 @@ bool unit_map::has_unit(const unit * const u) const { assert(u); - BOOST_FOREACH(const t_umap::value_type& item, umap_) { + for(const t_umap::value_type& item : umap_) { if(item.second.unit.get() == u) { return true; } diff --git a/src/units/types.cpp b/src/units/types.cpp index d458abc6a6d7..8582df2df7ff 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -34,7 +34,6 @@ #include "gui/auxiliary/formula.hpp" #include "gui/dialogs/loadscreen.hpp" -#include #include #include @@ -198,7 +197,7 @@ void unit_type::build_full(const movement_type_map &mv_types, if ( cfg_["ignore_race_traits"].to_bool() ) { possible_traits_.clear(); } else { - BOOST_FOREACH(const config &t, race_->additional_traits()) + for (const config &t : race_->additional_traits()) { if (alignment_ != unit_type::ALIGNMENT::NEUTRAL || t["id"] != "fearless") possible_traits_.add_child("trait", t); @@ -210,7 +209,7 @@ void unit_type::build_full(const movement_type_map &mv_types, } // Insert any traits that are just for this unit type - BOOST_FOREACH(const config &trait, cfg_.child_range("trait")) + for (const config &trait : cfg_.child_range("trait")) { possible_traits_.add_child("trait", trait); } @@ -228,7 +227,7 @@ void unit_type::build_full(const movement_type_map &mv_types, xp_bar_scaling_ = cfg_["xp_bar_scaling"].to_double(game_config::xp_bar_scaling); // Propagate the build to the variations. - BOOST_FOREACH(variations_map::value_type & variation, variations_) { + for (variations_map::value_type & variation : variations_) { variation.second->build_full(mv_types, races, traits); } @@ -296,7 +295,7 @@ void unit_type::build_help_index(const movement_type_map &mv_types, if (const config &abil_cfg = cfg_.child("abilities")) { - BOOST_FOREACH(const config::any_child &ab, abil_cfg.all_children_range()) { + for (const config::any_child &ab : abil_cfg.all_children_range()) { const config::attribute_value &name = ab.cfg["name"]; if (!name.empty()) { abilities_.push_back(name.t_str()); @@ -305,15 +304,15 @@ void unit_type::build_help_index(const movement_type_map &mv_types, } } - BOOST_FOREACH(const config &adv, cfg_.child_range("advancement")) + for (const config &adv : cfg_.child_range("advancement")) { - BOOST_FOREACH(const config &effect, adv.child_range("effect")) + for (const config &effect : adv.child_range("effect")) { const config &abil_cfg = effect.child("abilities"); if (!abil_cfg || effect["apply_to"] != "new_ability") { continue; } - BOOST_FOREACH(const config::any_child &ab, abil_cfg.all_children_range()) { + for (const config::any_child &ab : abil_cfg.all_children_range()) { const config::attribute_value &name = ab.cfg["name"]; if (!name.empty()) { adv_abilities_.push_back(name.t_str()); @@ -336,11 +335,11 @@ void unit_type::build_help_index(const movement_type_map &mv_types, // Override parts of the movement type with what is in our config. movement_type_.merge(cfg_); - BOOST_FOREACH(const config &t, traits) + for (const config &t : traits) { possible_traits_.add_child("trait", t); } - BOOST_FOREACH(const config &var_cfg, cfg_.child_range("variation")) + for (const config &var_cfg : cfg_.child_range("variation")) { const std::string& var_id = var_cfg["variation_id"].empty() ? var_cfg["variation_name"] : var_cfg["variation_id"]; @@ -484,7 +483,7 @@ const std::vector& unit_type::animations() const { std::vector unit_type::attacks() const { std::vector res; - BOOST_FOREACH(const config &att, cfg_.child_range("attack")) { + for (const config &att : cfg_.child_range("attack")) { res.push_back(attack_type(att)); } @@ -534,7 +533,7 @@ bool unit_type::has_ability_by_id(const std::string& ability) const { if (const config &abil = cfg_.child("abilities")) { - BOOST_FOREACH(const config::any_child &ab, abil.all_children_range()) { + for (const config::any_child &ab : abil.all_children_range()) { if (ab.cfg["id"] == ability) return true; } @@ -549,7 +548,7 @@ std::vector unit_type::get_ability_list() const const config &abilities = cfg_.child("abilities"); if (!abilities) return res; - BOOST_FOREACH(const config::any_child &ab, abilities.all_children_range()) { + for (const config::any_child &ab : abilities.all_children_range()) { const std::string &id = ab.cfg["id"]; if (!id.empty()) res.push_back(id); @@ -631,7 +630,7 @@ static void advancement_tree_internal(const std::string& id, std::setadvances_to()) { + for (const std::string& adv : ut->advances_to()) { if (tree.insert(adv).second) { // insertion succeed, expand the new type advancement_tree_internal(adv, tree); @@ -652,9 +651,9 @@ const std::vector unit_type::advances_from() const unit_types.build_all(unit_type::HELP_INDEXED); std::vector adv_from; - BOOST_FOREACH(const unit_type_data::unit_type_map::value_type &ut, unit_types.types()) + for (const unit_type_data::unit_type_map::value_type &ut : unit_types.types()) { - BOOST_FOREACH(const std::string& adv, ut.second.advances_to()) { + for (const std::string& adv : ut.second.advances_to()) { if (adv == id_) adv_from.push_back(ut.second.id()); } @@ -675,12 +674,12 @@ bool unit_type::musthave_status(const std::string& status_name) const // status gets changed. In the unlikely event it gets changed // multiple times, we want to try to do it in the same order // that unit::apply_modifications does things. - BOOST_FOREACH(const config &mod, possible_traits()) + for (const config &mod : possible_traits()) { if (mod["availability"] != "musthave") continue; - BOOST_FOREACH(const config &effect, mod.child_range("effect")) + for (const config &effect : mod.child_range("effect")) { // See if the effect only applies to // certain unit types But don't worry @@ -727,7 +726,7 @@ std::vector unit_type::variations() const { std::vector retval; retval.reserve(variations_.size()); - BOOST_FOREACH(const variations_map::value_type &val, variations_) { + for (const variations_map::value_type &val : variations_) { retval.push_back(val.first); } return retval; @@ -740,7 +739,7 @@ bool unit_type::has_variation(const std::string& variation_id) const bool unit_type::show_variations_in_help() const { - BOOST_FOREACH(const variations_map::value_type &val, variations_) { + for (const variations_map::value_type &val : variations_) { assert(val.second != nullptr); if (!val.second->hide_help()) { return true; @@ -767,7 +766,7 @@ const config & unit_type::build_unit_cfg() const "name", "num_traits", "variation_id", "variation_name", "recall_cost", "cost", "level", "gender", "flag_rgb", "alignment", "advances_to", "do_not_list" }; - BOOST_FOREACH(const char *attr, unit_type_attrs) { + for (const char *attr : unit_type_attrs) { unit_cfg_.remove_attribute(attr); } built_unit_cfg_ = true; @@ -779,7 +778,7 @@ int unit_type::resistance_against(const std::string& damage_name, bool attacker) int resistance = movement_type_.resistance_against(damage_name); unit_ability_list resistance_abilities; if (const config &abilities = cfg_.child("abilities")) { - BOOST_FOREACH(const config& cfg, abilities.child_range("resistance")) { + for (const config& cfg : abilities.child_range("resistance")) { if (!cfg["affect_self"].to_bool(true)) { continue; } @@ -871,7 +870,7 @@ namespace { // Helpers for set_config() { std::stringstream ss; ss << "[base_unit] recursion loop in [unit_type] "; - BOOST_FOREACH(const std::string &step, base_tree) + for (const std::string &step : base_tree) ss << step << "->"; ss << base_id; ERR_CF << ss.str() << '\n'; @@ -904,7 +903,7 @@ namespace { // Helpers for set_config() { // Get a list of base units to apply. std::vector base_ids; - BOOST_FOREACH (config & base, ut_cfg.child_range("base_unit") ) + for (config & base : ut_cfg.child_range("base_unit")) base_ids.push_back(base["id"]); if ( base_ids.empty() ) @@ -920,7 +919,7 @@ namespace { // Helpers for set_config() ut_cfg.clear_children("base_unit"); // Merge the base units, in order. - BOOST_FOREACH(const std::string & base_id, base_ids) { + for (const std::string & base_id : base_ids) { // Detect recursion so the WML author is made aware of an error. if ( std::find(base_tree.begin(), base_tree.end(), base_id) != base_tree.end() ) throw_base_unit_recursion_error(base_tree, base_id); @@ -967,7 +966,7 @@ namespace { // Helpers for set_config() variations.splice_children(ut_cfg, "variation"); // Handle each variation's inheritance. - BOOST_FOREACH (config &var_cfg, variations.child_range("variation")) + for (config &var_cfg : variations.child_range("variation")) fill_unit_sub_type(var_cfg, ut_cfg, false); // Restore the variations. @@ -987,7 +986,7 @@ namespace { // Helpers for set_config() gui2::tformula formula(formula_str); game_logic::map_formula_callable original; boost::sregex_iterator m(formula_str.begin(), formula_str.end(), fai_identifier); - BOOST_FOREACH(const boost::sregex_iterator::value_type& p, std::make_pair(m, boost::sregex_iterator())) { + for (const boost::sregex_iterator::value_type& p : std::make_pair(m, boost::sregex_iterator())) { const std::string var_name = p.str(); variant val(original_cfg[var_name].to_int(default_val)); original.add(var_name, val); @@ -1009,13 +1008,13 @@ void unit_type_data::set_config(config &cfg) clear(); unit_cfg_ = &cfg; - BOOST_FOREACH(const config &mt, cfg.child_range("movetype")) + for (const config &mt : cfg.child_range("movetype")) { movement_types_.insert(std::make_pair(mt["name"].str(), movetype(mt))); gui2::tloadscreen::progress(); } - BOOST_FOREACH(const config &r, cfg.child_range("race")) + for (const config &r : cfg.child_range("race")) { const unit_race race(r); races_.insert(std::pair(race.id(),race)); @@ -1023,11 +1022,11 @@ void unit_type_data::set_config(config &cfg) } // Movetype resistance patching - BOOST_FOREACH(const config &r, cfg.child_range("resistance_defaults")) + for (const config &r : cfg.child_range("resistance_defaults")) { const std::string& dmg_type = r["id"]; config temp_cfg; - BOOST_FOREACH(const config::attribute &attr, r.attribute_range()) { + for (const config::attribute &attr : r.attribute_range()) { const std::string &mt = attr.first; if (mt == "id" || mt == "default" || movement_types_.find(mt) == movement_types_.end()) { continue; @@ -1035,7 +1034,7 @@ void unit_type_data::set_config(config &cfg) patch_movetype(movement_types_[mt].get_resistances(), dmg_type, attr.second, 100, true); } if (r.has_attribute("default")) { - BOOST_FOREACH(movement_type_map::value_type &mt, movement_types_) { + for (movement_type_map::value_type &mt : movement_types_) { // Don't apply a default if a value is explicitly specified. if (r.has_attribute(mt.first)) { continue; @@ -1046,17 +1045,17 @@ void unit_type_data::set_config(config &cfg) } // Movetype move/defend patching - BOOST_FOREACH(const config &terrain, cfg.child_range("terrain_defaults")) + for (const config &terrain : cfg.child_range("terrain_defaults")) { const std::string& ter_type = terrain["id"]; config temp_cfg; static const std::string terrain_info_tags[] = {"movement", "vision", "jamming", "defense"}; - BOOST_FOREACH(const std::string &tag, terrain_info_tags) { + for (const std::string &tag : terrain_info_tags) { if (!terrain.has_child(tag)) { continue; } const config& info = terrain.child(tag); - BOOST_FOREACH(const config::attribute &attr, info.attribute_range()) { + for (const config::attribute &attr : info.attribute_range()) { const std::string &mt = attr.first; if (mt == "default" || movement_types_.find(mt) == movement_types_.end()) { continue; @@ -1072,7 +1071,7 @@ void unit_type_data::set_config(config &cfg) } } if (info.has_attribute("default")) { - BOOST_FOREACH(movement_type_map::value_type &mt, movement_types_) { + for (movement_type_map::value_type &mt : movement_types_) { // Don't apply a default if a value is explicitly specified. if (info.has_attribute(mt.first)) { continue; @@ -1092,7 +1091,7 @@ void unit_type_data::set_config(config &cfg) } // Apply base units. - BOOST_FOREACH(config &ut, cfg.child_range("unit_type")) + for (config &ut : cfg.child_range("unit_type")) { if ( ut.has_child("base_unit") ) { // Derived units must specify a new id. @@ -1107,7 +1106,7 @@ void unit_type_data::set_config(config &cfg) } // Handle inheritance and recording of unit types. - BOOST_FOREACH(config &ut, cfg.child_range("unit_type")) + for (config &ut : cfg.child_range("unit_type")) { std::string id = ut["id"]; // Every type is required to have an id. @@ -1176,7 +1175,7 @@ const unit_type *unit_type_data::find(const std::string& key, unit_type::BUILD_S void unit_type_data::check_types(const std::vector& types) const { - BOOST_FOREACH(const std::string& type, types) { + for (const std::string& type : types) { if(!find(type)) throw game::game_error("unknown unit type: " + type); } } @@ -1231,7 +1230,7 @@ void unit_type_data::read_hide_help(const config& cfg) std::vector trees = utils::split(cfg["type_adv_tree"]); hide_help_type_.back().insert(trees.begin(), trees.end()); - BOOST_FOREACH(const std::string& t_id, trees) { + for (const std::string& t_id : trees) { unit_type_map::iterator ut = types_.find(t_id); if (ut != types_.end()) { std::set adv_tree = ut->second.advancement_tree(); @@ -1262,7 +1261,7 @@ void unit_type_data::add_advancement(unit_type& to_unit) const { const config& cfg = to_unit.get_cfg(); - BOOST_FOREACH(const config &af, cfg.child_range("advancefrom")) + for (const config &af : cfg.child_range("advancefrom")) { const std::string &from = af["unit"]; int xp = af["experience"]; diff --git a/src/units/udisplay.cpp b/src/units/udisplay.cpp index b2dcfbc244ff..42dc97ef4d7f 100644 --- a/src/units/udisplay.cpp +++ b/src/units/udisplay.cpp @@ -32,8 +32,6 @@ #include "units/filter.hpp" #include "units/map.hpp" -#include - #define LOG_DP LOG_STREAM(info, display) @@ -629,7 +627,7 @@ void unit_attack(display * disp, game_board & board, animator.add_animation(&defender, defender_anim, def->get_location(), true, text , display::rgb(255, 0, 0)); - BOOST_FOREACH (const unit_ability & ability, leaders) { + for (const unit_ability & ability : leaders) { if(ability.second == a) continue; if(ability.second == b) continue; unit_map::const_iterator leader = board.units().find(ability.second); @@ -639,7 +637,7 @@ void unit_attack(display * disp, game_board & board, att->get_location(), damage, true, "", 0, hit_type, &attack, secondary_attack, swing); } - BOOST_FOREACH (const unit_ability & ability, helpers) { + for (const unit_ability & ability : helpers) { if(ability.second == a) continue; if(ability.second == b) continue; unit_map::const_iterator helper = board.units().find(ability.second); @@ -657,7 +655,7 @@ void unit_attack(display * disp, game_board & board, bool extra_hit_sounds_played = false; while(damage_left > 0 && !animator.would_end()) { if(!extra_hit_sounds_played && extra_hit_sounds != nullptr) { - BOOST_FOREACH (std::string hit_sound, *extra_hit_sounds) { + for (std::string hit_sound : *extra_hit_sounds) { sound::play_sound(hit_sound); } extra_hit_sounds_played = true; @@ -685,7 +683,7 @@ void reset_helpers(const unit *attacker,const unit *defender) const unit_map& units = disp->get_units(); if(attacker) { unit_ability_list leaders = attacker->get_abilities("leadership"); - BOOST_FOREACH (const unit_ability & ability, leaders) { + for (const unit_ability & ability : leaders) { unit_map::const_iterator leader = units.find(ability.second); assert(leader != units.end()); leader->anim_comp().set_standing(); @@ -694,7 +692,7 @@ void reset_helpers(const unit *attacker,const unit *defender) if(defender) { unit_ability_list helpers = defender->get_abilities("resistance"); - BOOST_FOREACH (const unit_ability & ability, helpers) { + for (const unit_ability & ability : helpers) { unit_map::const_iterator helper = units.find(ability.second); assert(helper != units.end()); helper->anim_comp().set_standing(); @@ -742,7 +740,7 @@ void unit_healing(unit &healed, const std::vector &healers, int healing, disp->display_unit_hex(healed_loc); unit_animator animator; - BOOST_FOREACH(unit *h, healers) { + for (unit *h : healers) { h->set_facing(h->get_location().get_relative_dir(healed_loc)); animator.add_animation(h, "healing", h->get_location(), healed_loc, healing); diff --git a/src/units/unit.cpp b/src/units/unit.cpp index 3a3b3d21d515..9723efa0fe3a 100644 --- a/src/units/unit.cpp +++ b/src/units/unit.cpp @@ -49,7 +49,6 @@ #include "variable.hpp" // for vconfig, etc #include -#include // for auto_any_base, etc #include // for intrusive_ptr #include #include @@ -426,7 +425,7 @@ unit::unit(const config &cfg, bool use_traits, const vconfig* vcfg, n_unit::id_m filter_recall_ = filter_recall.get_config(); const vconfig::child_list& events = vcfg->get_children("event"); - BOOST_FOREACH(const vconfig& e, events) { + for(const vconfig& e : events) { events_.add_child("event", e.get_config()); } } @@ -434,7 +433,7 @@ unit::unit(const config &cfg, bool use_traits, const vconfig* vcfg, n_unit::id_m { filter_recall_ = cfg.child_or_empty("filter_recall"); - BOOST_FOREACH(const config& unit_event, cfg.child_range("event")) { + for(const config& unit_event : cfg.child_range("event")) { events_.add_child("event", unit_event); } } @@ -540,7 +539,7 @@ unit::unit(const config &cfg, bool use_traits, const vconfig* vcfg, n_unit::id_m cfg_range = cfg.child_range("abilities"); if(cfg_range.first != cfg_range.second) { this->abilities_.clear(); - BOOST_FOREACH(const config& abilities, cfg_range) + for(const config& abilities : cfg_range) { this->abilities_.append(abilities); } @@ -552,7 +551,7 @@ unit::unit(const config &cfg, bool use_traits, const vconfig* vcfg, n_unit::id_m if (const config &status_flags = cfg.child("status")) { - BOOST_FOREACH(const config::attribute &st, status_flags.attribute_range()) { + for(const config::attribute &st : status_flags.attribute_range()) { if (st.second.to_bool()) { set_state(st.first, true); } @@ -832,12 +831,12 @@ void unit::generate_traits(bool musthaveonly) config::const_child_itors current_traits = modifications_.child_range("trait"); std::vector candidate_traits; - BOOST_FOREACH(const config &t, u_type.possible_traits()) + for (const config &t : u_type.possible_traits()) { // Skip the trait if the unit already has it. const std::string &tid = t["id"]; bool already = false; - BOOST_FOREACH(const config &mod, current_traits) + for (const config &mod : current_traits) { if (mod["id"] == tid) { already = true; @@ -883,7 +882,7 @@ std::vector unit::get_traits_list() const { std::vector res; - BOOST_FOREACH(const config &mod, modifications_.child_range("trait")) + for (const config &mod : modifications_.child_range("trait")) { std::string const &id = mod["id"]; // Make sure to return empty id trait strings as otherwise @@ -928,7 +927,7 @@ void unit::advance_to(const unit_type &u_type, generate_name_ &= new_type.generate_name(); abilities_ = new_type.abilities_cfg(); advancements_.clear(); - BOOST_FOREACH(const config& advancement, new_type.advancements()) { + for(const config& advancement : new_type.advancements()) { advancements_.push_back(new config(advancement)); } // If unit has specific profile, remember it and keep it after advancing @@ -1120,7 +1119,7 @@ void unit::set_recruits(const std::vector& recruits) const std::vector unit::advances_to_translated() const { std::vector result; - BOOST_FOREACH(std::string adv_type_id, advances_to_) + for (std::string adv_type_id : advances_to_) { const unit_type *adv_type = unit_types.find(adv_type_id); if ( adv_type ) @@ -1266,7 +1265,7 @@ void unit::heal(int amount) const std::map unit::get_states() const { std::map all_states; - BOOST_FOREACH(std::string const &s, states_) { + for (std::string const &s : states_) { all_states[s] = "yes"; } for (std::map::const_iterator i = known_boolean_state_names_.begin(), @@ -1355,7 +1354,7 @@ void unit::set_state(const std::string &state, bool value) bool unit::has_ability_by_id(const std::string& ability) const { - BOOST_FOREACH(const config::any_child &ab, this->abilities_.all_children_range()) { + for (const config::any_child &ab : this->abilities_.all_children_range()) { if (ab.cfg["id"] == ability) { return true; } @@ -1480,7 +1479,7 @@ void unit::write(config& cfg) const cfg.clear_children("abilities"); cfg.add_child("abilities", abilities_); cfg.clear_children("advancement"); - BOOST_FOREACH(const config& advancement, this->advancements_) + for(const config& advancement : this->advancements_) { cfg.add_child("advancement", advancement); } @@ -1586,7 +1585,7 @@ std::map unit::advancement_icons() const { std::ostringstream tooltip; const std::string &image = game_config::images::level; - BOOST_FOREACH(const std::string &s, advances_to()) + for (const std::string &s : advances_to()) { if (!s.empty()) tooltip << s << '\n'; @@ -1594,7 +1593,7 @@ std::map unit::advancement_icons() const temp[image] = tooltip.str(); } - BOOST_FOREACH(const config &adv, get_modification_advances()) + for (const config &adv : get_modification_advances()) { const std::string &image = adv["image"]; if (image.empty()) continue; @@ -1612,7 +1611,7 @@ std::vector > unit::amla_icons() const std::vector > temp; std::pair icon; // - BOOST_FOREACH(const config &adv, get_modification_advances()) + for (const config &adv : get_modification_advances()) { icon.first = adv["icon"].str(); icon.second = adv["description"].str(); @@ -1629,7 +1628,7 @@ std::vector > unit::amla_icons() const std::vector unit::get_modification_advances() const { std::vector res; - BOOST_FOREACH(const config &adv, modification_advancements()) + for (const config &adv : modification_advancements()) { if (adv["strict_amla"].to_bool() && !advances_to_.empty()) continue; @@ -1650,7 +1649,7 @@ std::vector unit::get_modification_advances() const std::unique_copy(temp_exclude.begin(), temp_exclude.end(), std::back_inserter(uniq_exclude)); bool exclusion_found = false; - BOOST_FOREACH(const std::string &s, uniq_exclude) + for (const std::string &s : uniq_exclude) { int max_num = std::count(temp_exclude.begin(), temp_exclude.end(), s); int mod_num = modification_count("advancement", s); @@ -1664,7 +1663,7 @@ std::vector unit::get_modification_advances() const } bool requirements_done = true; - BOOST_FOREACH(const std::string &s, uniq_require) + for (const std::string &s : uniq_require) { int required_num = std::count(temp_require.begin(), temp_require.end(), s); int mod_num = modification_count("advancement", s); @@ -1684,7 +1683,7 @@ std::vector unit::get_modification_advances() const void unit::set_advancements(std::vector advancements) { this->advancements_.clear(); - BOOST_FOREACH(config& advancement, advancements) + for (config& advancement : advancements) { this->advancements_.push_back(new config()); this->advancements_.back().swap(advancement); @@ -1694,7 +1693,7 @@ void unit::set_advancements(std::vector advancements) size_t unit::modification_count(const std::string& mod_type, const std::string& id) const { size_t res = 0; - BOOST_FOREACH(const config &item, modifications_.child_range(mod_type)) { + for (const config &item : modifications_.child_range(mod_type)) { if (item["id"] == id) { ++res; } @@ -1947,12 +1946,12 @@ void unit::apply_builtin_effect(std::string apply_to, const config& effect) const std::string& add = effect["add"]; const std::string& remove = effect["remove"]; - BOOST_FOREACH(const std::string& to_add, utils::split(add)) + for (const std::string& to_add : utils::split(add)) { set_state(to_add, true); } - BOOST_FOREACH(const std::string& to_remove, utils::split(remove)) + for (const std::string& to_remove : utils::split(remove)) { set_state(to_remove, false); } @@ -1985,7 +1984,7 @@ void unit::apply_builtin_effect(std::string apply_to, const config& effect) } else if (apply_to == "new_ability") { if (const config &ab_effect = effect.child("abilities")) { config to_append; - BOOST_FOREACH(const config::any_child &ab, ab_effect.all_children_range()) { + for (const config::any_child &ab : ab_effect.all_children_range()) { if(!has_ability_by_id(ab.cfg["id"])) { to_append.add_child(ab.key, ab.cfg); } @@ -1994,7 +1993,7 @@ void unit::apply_builtin_effect(std::string apply_to, const config& effect) } } else if (apply_to == "remove_ability") { if (const config &ab_effect = effect.child("abilities")) { - BOOST_FOREACH(const config::any_child &ab, ab_effect.all_children_range()) { + for (const config::any_child &ab : ab_effect.all_children_range()) { remove_ability_by_id(ab.cfg["id"]); } } @@ -2062,7 +2061,7 @@ void unit::apply_builtin_effect(std::string apply_to, const config& effect) std::vector temp_advances = utils::parenthetical_split(types, ','); std::vector::iterator iter; - BOOST_FOREACH(const std::string& unit, temp_advances) { + for (const std::string& unit : temp_advances) { iter = std::find(advances_to_.begin(), advances_to_.end(), unit); if (iter != advances_to_.end()) { advances_to_.erase(iter); @@ -2139,7 +2138,7 @@ void unit::add_modification(const std::string& mod_type, const config& mod, bool bool set_poisoned = false; // Tracks if the poisoned state was set after the type or variation was changed. config last_effect; std::vector effects_description; - BOOST_FOREACH(const config &effect, mod.child_range("effect")) + for (const config &effect : mod.child_range("effect")) { // Apply SUF. if (const config &afilter = effect.child("filter")) { @@ -2279,7 +2278,7 @@ void unit::apply_modifications() if(mod == "advance" && modifications_.has_child(mod)) { lg::wml_error() << "[modifications][advance] is deprecated, use [advancement] instead\n"; } - BOOST_FOREACH(const config &m, modifications_.child_range(mod)) { + for(const config &m : modifications_.child_range(mod)) { log_scope("add mod"); add_modification(ModificationTypes[i], m, true); } @@ -2551,20 +2550,20 @@ std::string get_checksum(const unit& u) { "number", ""}; - BOOST_FOREACH(const config &att, unit_config.child_range("attack")) + for (const config &att : unit_config.child_range("attack")) { config& child = wcfg.add_child("attack"); for (int i = 0; !attack_keys[i].empty(); ++i) { child[attack_keys[i]] = att[attack_keys[i]]; } - BOOST_FOREACH(const config &spec, att.child_range("specials")) { + for (const config &spec : att.child_range("specials")) { config& child_spec = child.add_child("specials", spec); child_spec.recursive_clear_value("description"); } } - BOOST_FOREACH(const config &abi, unit_config.child_range("abilities")) + for (const config &abi : unit_config.child_range("abilities")) { config& child = wcfg.add_child("abilities", abi); child.recursive_clear_value("description"); @@ -2573,7 +2572,7 @@ std::string get_checksum(const unit& u) { child.recursive_clear_value("name_inactive"); } - BOOST_FOREACH(const config &trait, unit_config.child_range("trait")) + for (const config &trait : unit_config.child_range("trait")) { config& child = wcfg.add_child("trait", trait); child.recursive_clear_value("description"); @@ -2586,7 +2585,7 @@ std::string get_checksum(const unit& u) { for (int i = 0; !child_keys[i].empty(); ++i) { - BOOST_FOREACH(const config &c, unit_config.child_range(child_keys[i])) { + for (const config &c : unit_config.child_range(child_keys[i])) { wcfg.add_child(child_keys[i], c); } } diff --git a/src/units/unit.hpp b/src/units/unit.hpp index 8a5f0f0c5b2c..f6dd77ae88a5 100644 --- a/src/units/unit.hpp +++ b/src/units/unit.hpp @@ -68,7 +68,7 @@ class unit_ability_list std::pair highest(const std::string& key, int def=0) const; std::pair lowest(const std::string& key, int def=0) const; - // The following make this class usable with BOOST_FOREACH: + // The following make this class usable with standard library algorithms and such: typedef std::vector::iterator iterator; typedef std::vector::const_iterator const_iterator; iterator begin() { return cfgs_.begin(); } diff --git a/src/utils/iterable_pair.hpp b/src/utils/iterable_pair.hpp index 6a61a21f68ae..728c72adb974 100644 --- a/src/utils/iterable_pair.hpp +++ b/src/utils/iterable_pair.hpp @@ -20,6 +20,7 @@ #define UTILS_ITERABLE_PAIR_HPP_INCLUDED #include +#include namespace std { // Some cases don't work if not in std namespace @@ -33,6 +34,38 @@ inline T end(const std::pair& p) { return p.second; } +// TODO: Is there a way to enforce that this is called only for const_iterators? +template +inline T cbegin(const std::pair& p) { + return p.first; +} + +template +inline T cend(const std::pair& p) { + return p.second; +} + +template +inline std::reverse_iterator rbegin(const std::pair& p) { + return std::reverse_iterator(p.second); +} + +template +inline std::reverse_iterator rend(const std::pair& p) { + return std::reverse_iterator(p.first); +} + +// TODO: Is there a way to enforce that this is called only for const_iterators? +template +inline std::reverse_iterator crbegin(const std::pair& p) { + return std::reverse_iterator(p.second); +} + +template +inline std::reverse_iterator crend(const std::pair& p) { + return std::reverse_iterator(p.first); +} + } #endif diff --git a/src/utils/smart_list.hpp b/src/utils/smart_list.hpp index 40330c9c3de4..c0dd39c8e246 100644 --- a/src/utils/smart_list.hpp +++ b/src/utils/smart_list.hpp @@ -91,7 +91,7 @@ class smart_list typedef value_type * pointer; typedef value_type & reference; typedef std::bidirectional_iterator_tag iterator_category; - typedef ptrdiff_t difference_type; // Needed to use this with BOOST_FOREACH + typedef ptrdiff_t difference_type; protected: // Construct this via derived classes. /// Default constructor diff --git a/src/variable.cpp b/src/variable.cpp index 44afeb8ed5e7..82a521b5bd0c 100644 --- a/src/variable.cpp +++ b/src/variable.cpp @@ -32,7 +32,6 @@ #include "units/map.hpp" #include "team.hpp" -#include #include static lg::log_domain log_engine("engine"); @@ -136,11 +135,11 @@ config vconfig::get_parsed_config() const config res; - BOOST_FOREACH(const config::attribute &i, cfg_->attribute_range()) { + for (const config::attribute &i : cfg_->attribute_range()) { res[i.first] = expand(i.first); } - BOOST_FOREACH(const config::any_child &child, cfg_->all_children_range()) + for (const config::any_child &child : cfg_->all_children_range()) { if (child.key == "insert_tag") { vconfig insert_cfg(child.cfg); @@ -152,7 +151,7 @@ config vconfig::get_parsed_config() const try { config::const_child_itors range = as_nonempty_range(vname); - BOOST_FOREACH(const config& child, range) + for (const config& child : range) { res.add_child(name, vconfig(child).get_parsed_config()); } @@ -183,7 +182,7 @@ vconfig::child_list vconfig::get_children(const std::string& key) const { vconfig::child_list res; - BOOST_FOREACH(const config::any_child &child, cfg_->all_children_range()) + for (const config::any_child &child : cfg_->all_children_range()) { if (child.key == key) { res.push_back(vconfig(child.cfg, cache_)); @@ -194,7 +193,7 @@ vconfig::child_list vconfig::get_children(const std::string& key) const try { config::const_child_itors range = as_nonempty_range(insert_cfg["variable"]); - BOOST_FOREACH(const config& child, range) + for (const config& child : range) { res.push_back(vconfig(child, true)); } @@ -213,7 +212,7 @@ size_t vconfig::count_children(const std::string& key) const { size_t n = 0; - BOOST_FOREACH(const config::any_child &child, cfg_->all_children_range()) + for (const config::any_child &child : cfg_->all_children_range()) { if (child.key == key) { n++; @@ -246,7 +245,7 @@ vconfig vconfig::child(const std::string& key) const if (const config &natural = cfg_->child(key)) { return vconfig(natural, cache_); } - BOOST_FOREACH(const config &ins, cfg_->child_range("insert_tag")) + for (const config &ins : cfg_->child_range("insert_tag")) { vconfig insert_cfg(ins); if(insert_cfg["name"] == key) @@ -273,7 +272,7 @@ bool vconfig::has_child(const std::string& key) const if (cfg_->child(key)) { return true; } - BOOST_FOREACH(const config &ins, cfg_->child_range("insert_tag")) + for (const config &ins : cfg_->child_range("insert_tag")) { vconfig insert_cfg(ins); if(insert_cfg["name"] == key) { @@ -419,7 +418,7 @@ config &scoped_wml_variable::store(const config &var_value) { try { - BOOST_FOREACH(const config &i, resources::gamedata->get_variables().child_range(var_name_)) { + for (const config &i : resources::gamedata->get_variables().child_range(var_name_)) { previous_val_.add_child(var_name_, i); } resources::gamedata->clear_variable_cfg(var_name_); @@ -442,7 +441,7 @@ scoped_wml_variable::~scoped_wml_variable() if(activated_) { resources::gamedata->clear_variable_cfg(var_name_); - BOOST_FOREACH(const config &i, previous_val_.child_range(var_name_)) + for(const config &i : previous_val_.child_range(var_name_)) { try { diff --git a/src/video.cpp b/src/video.cpp index 3355f59f323c..437e46977ef8 100644 --- a/src/video.cpp +++ b/src/video.cpp @@ -31,8 +31,6 @@ #include "sdl/gpu.hpp" #include "display.hpp" -#include - #include #include #include diff --git a/src/wesmage/filter.cpp b/src/wesmage/filter.cpp index 0ff070d5da91..4030e363ddc7 100644 --- a/src/wesmage/filter.cpp +++ b/src/wesmage/filter.cpp @@ -18,7 +18,6 @@ #include "wesmage/exit.hpp" #include -#include #include "utils/boost_function_guarded.hpp" #include diff --git a/src/wesmage/options.cpp b/src/wesmage/options.cpp index f9d7b5330fc9..20ee74ddc47b 100644 --- a/src/wesmage/options.cpp +++ b/src/wesmage/options.cpp @@ -17,8 +17,6 @@ #include "wesmage/exit.hpp" #include "wesmage/filter.hpp" -#include - #include #include #include diff --git a/src/wesmage/wesmage.cpp b/src/wesmage/wesmage.cpp index b69538f35fa8..48261a6dafe7 100644 --- a/src/wesmage/wesmage.cpp +++ b/src/wesmage/wesmage.cpp @@ -22,8 +22,6 @@ #include "wesmage/filter.hpp" #include "wesmage/options.hpp" -#include - #include #include diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 844a0582beb1..89ff71f32f24 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -74,7 +74,6 @@ #include // for SDL_Init, SDL_INIT_TIMER #include -#include // for auto_any_base, etc #include // for input, output #include // for copy #include // for bzip2_compressor, etc @@ -232,7 +231,7 @@ static void handle_preprocess_command(const commandline_options& cmdline_opts) int read = 0; // use static preproc_define::read_pair(config) to make a object - BOOST_FOREACH( const config::any_child &value, cfg.all_children_range() ) { + for (const config::any_child &value : cfg.all_children_range()) { const preproc_map::value_type def = preproc_define::read_pair( value.cfg ); input_macros[def.first] = def.second; ++read; @@ -253,7 +252,7 @@ static void handle_preprocess_command(const commandline_options& cmdline_opts) if ( cmdline_opts.preprocess_defines ) { // add the specified defines - BOOST_FOREACH( const std::string &define, *cmdline_opts.preprocess_defines ) { + for (const std::string &define : *cmdline_opts.preprocess_defines) { if (define.empty()){ std::cerr << "empty define supplied\n"; continue; @@ -696,7 +695,7 @@ static int do_gameloop(const std::vector& args) config_manager.game_config().child("titlescreen_music"); if (cfg) { sound::play_music_repeatedly(game_config::title_music); - BOOST_FOREACH(const config &i, cfg.child_range("music")) { + for (const config &i : cfg.child_range("music")) { sound::play_music_config(i); } sound::commit_music_changes(); @@ -835,8 +834,7 @@ static int do_gameloop(const std::vector& args) int current = 0; std::vector cores; - BOOST_FOREACH(const config& core, - game_config_manager::get()->game_config().child_range("core")) { + for (const config& core : game_config_manager::get()->game_config().child_range("core")) { cores.push_back(core); if (core["id"] == preferences::core_id()) current = cores.size() -1; diff --git a/src/whiteboard/highlighter.cpp b/src/whiteboard/highlighter.cpp index dfb87ff1b545..b6df9014a05d 100644 --- a/src/whiteboard/highlighter.cpp +++ b/src/whiteboard/highlighter.cpp @@ -18,6 +18,7 @@ #include #include +#include #include @@ -46,8 +47,6 @@ #include "units/animation_component.hpp" #include "units/map.hpp" -#include - namespace wb { @@ -111,7 +110,7 @@ void highlighter::set_mouseover_hex(const map_location& hex) if(side_actions_->empty()) { return; } - BOOST_REVERSE_FOREACH(action_ptr act, *side_actions_) { + for(action_ptr act : boost::adaptors::reverse(*side_actions_)) { /**@todo "is_numbering_hex" is not the "correct" criterion by which to * select the hightlighted/selected action. It's just convenient for me * to use at the moment since it happens to coincide with the "correct" @@ -154,7 +153,7 @@ void highlighter::highlight() if(!secondary_highlights_.empty()) { //Highlight secondary highlights highlight_secondary_visitor hs_visitor(*this); - BOOST_FOREACH(weak_action_ptr weak, secondary_highlights_) { + for(weak_action_ptr weak : secondary_highlights_) { if(action_ptr action = weak.lock()) { action->accept(hs_visitor); } @@ -173,14 +172,14 @@ void highlighter::unhighlight() } //unhighlight secondary highlights - BOOST_FOREACH(weak_action_ptr weak, secondary_highlights_) { + for(weak_action_ptr weak : secondary_highlights_) { if(action_ptr action = weak.lock()) { action->accept(uh_visitor); } } //unhide other units if needed - BOOST_FOREACH(map_location hex, exclusive_display_hexes_) { + for(map_location hex : exclusive_display_hexes_) { resources::screen->remove_exclusive_draw(hex); } exclusive_display_hexes_.clear(); diff --git a/src/whiteboard/manager.cpp b/src/whiteboard/manager.cpp index b912632df14f..49c7dc267d7d 100644 --- a/src/whiteboard/manager.cpp +++ b/src/whiteboard/manager.cpp @@ -52,7 +52,6 @@ #include #include -#include #include @@ -277,7 +276,7 @@ bool manager::allow_leader_to_move(unit const& leader) const } //Look for planned recruits that depend on this leader - BOOST_FOREACH(action_const_ptr action, *viewer_actions()) + for(action_const_ptr action : *viewer_actions()) { recruit_const_ptr recruit = boost::dynamic_pointer_cast(action); recall_const_ptr recall = boost::dynamic_pointer_cast(action); @@ -345,8 +344,9 @@ void manager::post_delete_action(action_ptr action) static void hide_all_plans() { - BOOST_FOREACH(team& t, *resources::teams) + for(team& t : *resources::teams){ t.get_side_actions()->hide(); + } } /* private */ @@ -357,7 +357,7 @@ void manager::update_plan_hiding(size_t team_index) hide_all_plans(); else // normal circumstance { - BOOST_FOREACH(team& t, *resources::teams) + for(team& t : *resources::teams) { //make sure only appropriate teams are hidden if(!t.is_network_human()) @@ -518,7 +518,7 @@ void manager::pre_draw() for_each_action(boost::ref(move_finder)); units_owning_moves_ = move_finder.get_units_owning_moves(); - BOOST_FOREACH(size_t unit_id, units_owning_moves_) { + for (size_t unit_id : units_owning_moves_) { unit_map::iterator unit_iter = resources::units->find(unit_id); assert(unit_iter.valid()); ghost_owner_unit(&*unit_iter); @@ -528,7 +528,7 @@ void manager::pre_draw() void manager::post_draw() { - BOOST_FOREACH(size_t unit_id, units_owning_moves_) + for (size_t unit_id : units_owning_moves_) { unit_map::iterator unit_iter = resources::units->find(unit_id); if (unit_iter.valid()) { @@ -553,7 +553,7 @@ void manager::draw_hex(const map_location& hex) //Info about the action numbers to be displayed on screen. side_actions::numbers_t numbers; - BOOST_FOREACH(team& t, *resources::teams) + for (team& t : *resources::teams) { side_actions& sa = *t.get_side_actions(); if(!sa.hidden()) @@ -628,7 +628,7 @@ void manager::process_network_data(config const& cfg) LOG_WB << "Received wb data (" << count << ").\n"; team& team_from = resources::teams->at(wb_cfg["side"]-1); - BOOST_FOREACH(side_actions::net_cmd const& cmd, wb_cfg.child_range("net_cmd")) + for(side_actions::net_cmd const& cmd : wb_cfg.child_range("net_cmd")) team_from.get_side_actions()->execute_net_cmd(cmd); } } @@ -744,7 +744,7 @@ void manager::create_temp_move() void manager::erase_temp_move() { move_arrows_.clear(); - BOOST_FOREACH(fake_unit_ptr const& tmp, fake_units_) { + for(fake_unit_ptr const& tmp : fake_units_) { if(tmp) { tmp->anim_comp().invalidate(*game_display::get_singleton()); } @@ -1083,7 +1083,7 @@ void manager::options_dlg() options.push_back(_("HIDE ALL allies’ plans")); //populate list of networked allies - BOOST_FOREACH(team &t, *resources::teams) + for(team &t : *resources::teams) { //Exclude enemies, AIs, and local players if(t.is_enemy(v_side) || !t.is_network()) @@ -1109,12 +1109,14 @@ void manager::options_dlg() switch(selection) { case 0: - BOOST_FOREACH(team* t, allies) + for(team* t : allies) { team_plans_hidden_[t->side()-1]=false; + } break; case 1: - BOOST_FOREACH(team* t, allies) + for(team* t : allies) { team_plans_hidden_[t->side()-1]=true; + } break; default: if(selection > 1) diff --git a/src/whiteboard/mapbuilder.cpp b/src/whiteboard/mapbuilder.cpp index c34b74f2baf6..d0268328cf10 100644 --- a/src/whiteboard/mapbuilder.cpp +++ b/src/whiteboard/mapbuilder.cpp @@ -29,7 +29,7 @@ #include "units/unit.hpp" #include "units/map.hpp" -#include +#include namespace wb { @@ -56,13 +56,13 @@ mapbuilder::~mapbuilder() void mapbuilder::pre_build() { - BOOST_FOREACH(team& t, *resources::teams) { + for (team& t : *resources::teams) { //Reset spent gold to zero, it'll be recalculated during the map building t.get_side_actions()->reset_gold_spent(); } int current_side = resources::controller->current_side(); - BOOST_FOREACH(unit& u, *resources::units) { + for (unit& u : *resources::units) { bool on_current_side = (u.side() == current_side); //Remove any unit the current side cannot see to avoid their detection by planning @@ -96,7 +96,7 @@ void mapbuilder::build_map() bool end = false; for(size_t turn=0; !end; ++turn) { end = true; - BOOST_FOREACH(team &side, *resources::teams) { + for (team &side : *resources::teams) { side_actions &actions = *side.get_side_actions(); if(turn < actions.num_turns() && team_has_visible_plan(side)) { end = false; @@ -177,7 +177,7 @@ void mapbuilder::post_visit_team(size_t turn) // Go backwards through the actions of this turn to identify // which ones are moves that end a turn. - BOOST_REVERSE_FOREACH(action_ptr action, applied_actions_this_turn_) { + for(action_ptr action : boost::adaptors::reverse(applied_actions_this_turn_)) { move_ptr move = boost::dynamic_pointer_cast(action); if(move) { move->set_turn_number(0); @@ -197,7 +197,7 @@ void mapbuilder::post_visit_team(size_t turn) void mapbuilder::restore_normal_map() { //applied_actions_ contain only the actions that we applied to the unit map - BOOST_REVERSE_FOREACH(action_ptr act, applied_actions_) { + for(action_ptr act : boost::adaptors::reverse(applied_actions_)) { act->remove_temp_modifier(unit_map_); } } diff --git a/src/whiteboard/move.cpp b/src/whiteboard/move.cpp index 27a423f1417b..0fe0705931fd 100644 --- a/src/whiteboard/move.cpp +++ b/src/whiteboard/move.cpp @@ -39,8 +39,6 @@ #include "units/udisplay.hpp" #include "units/map.hpp" -#include - namespace wb { std::ostream& operator<<(std::ostream &s, move_ptr move) @@ -110,10 +108,10 @@ move::move(config const& cfg, bool hidden) if(!route_cfg) throw action::ctor_err("move: Invalid route_"); route_->move_cost = route_cfg["move_cost"]; - BOOST_FOREACH(config const& loc_cfg, route_cfg.child_range("step")) { + for(config const& loc_cfg : route_cfg.child_range("step")) { route_->steps.push_back(map_location(loc_cfg["x"],loc_cfg["y"])); } - BOOST_FOREACH(config const& mark_cfg, route_cfg.child_range("mark")) { + for(config const& mark_cfg : route_cfg.child_range("mark")) { route_->marks[map_location(mark_cfg["x"],mark_cfg["y"])] = pathfind::marked_route::mark(mark_cfg["turns"], mark_cfg["zoc"].to_bool(), @@ -504,7 +502,7 @@ config move::to_config() const //Serialize route_ config route_cfg; route_cfg["move_cost"]=route_->move_cost; - BOOST_FOREACH(map_location const& loc, route_->steps) + for(map_location const& loc : route_->steps) { config loc_cfg; loc_cfg["x"]=loc.x; @@ -512,7 +510,7 @@ config move::to_config() const route_cfg.add_child("step",loc_cfg); } typedef std::pair pair_loc_mark; - BOOST_FOREACH(pair_loc_mark const& item, route_->marks) + for(pair_loc_mark const& item : route_->marks) { config mark_cfg; mark_cfg["x"]=item.first.x; diff --git a/src/whiteboard/recall.cpp b/src/whiteboard/recall.cpp index 998c9ebda558..3fa9d29f0fd0 100644 --- a/src/whiteboard/recall.cpp +++ b/src/whiteboard/recall.cpp @@ -36,8 +36,6 @@ #include "units/unit.hpp" #include "units/animation_component.hpp" -#include - namespace wb { @@ -75,7 +73,7 @@ recall::recall(config const& cfg, bool hidden) { // Construct and validate temp_unit_ size_t underlying_id = cfg["temp_unit_"]; - BOOST_FOREACH(const unit_const_ptr & recall_unit, resources::teams->at(team_index()).recall_list()) + for(const unit_const_ptr & recall_unit : resources::teams->at(team_index()).recall_list()) { if(recall_unit->underlying_id()==underlying_id) { diff --git a/src/whiteboard/side_actions.cpp b/src/whiteboard/side_actions.cpp index 788b7de290b5..dc34b09d9f00 100644 --- a/src/whiteboard/side_actions.cpp +++ b/src/whiteboard/side_actions.cpp @@ -42,8 +42,6 @@ #include "resources.hpp" #include "units/unit.hpp" -#include - namespace wb { @@ -290,7 +288,7 @@ void side_actions::get_numbers(const map_location& hex, numbers_t& result) main_number = index; } - BOOST_FOREACH(weak_action_ptr action, hlighter->get_secondary_highlights()) { + for(weak_action_ptr action : hlighter->get_secondary_highlights()) { if(action.lock() == *it) { secondary_numbers.insert(index); } @@ -377,7 +375,7 @@ void side_actions::hide() hidden_ = true; - BOOST_FOREACH(action_ptr act, *this) { + for(action_ptr act : *this) { act->hide(); } } @@ -389,7 +387,7 @@ void side_actions::show() hidden_ = false; - BOOST_FOREACH(action_ptr act, *this) { + for(action_ptr act : *this) { act->show(); } } @@ -787,7 +785,7 @@ void side_actions::execute_net_cmd(net_cmd const& cmd) } else if(type=="refresh") { LOG_WB << "Command received: refresh\n"; clear(); - BOOST_FOREACH(net_cmd const& sub_cmd, cmd.child_range("net_cmd")) + for(net_cmd const& sub_cmd : cmd.child_range("net_cmd")) execute_net_cmd(sub_cmd); } else { ERR_WB << "side_actions::execute_network_command(): received invalid type!" << std::endl; @@ -862,7 +860,7 @@ void side_actions::raw_turn_shift() { //find units who still have plans for turn 0 (i.e. were too lazy to finish their jobs) std::set lazy_units; - BOOST_FOREACH(action_ptr const& act, iter_turn(0)) { + for(action_ptr const& act : iter_turn(0)) { unit_const_ptr u = act->get_unit(); if(u) { lazy_units.insert(u); diff --git a/src/whiteboard/utility.cpp b/src/whiteboard/utility.cpp index 12d99e87510c..d909c820059c 100644 --- a/src/whiteboard/utility.cpp +++ b/src/whiteboard/utility.cpp @@ -34,8 +34,6 @@ #include "units/unit.hpp" #include "units/animation_component.hpp" -#include - namespace wb { size_t viewer_team() @@ -82,7 +80,7 @@ unit* find_recruiter(size_t team_index, map_location const& hex) if ( !resources::gameboard->map().is_castle(hex) ) return nullptr; - BOOST_FOREACH(unit& u, *resources::units) + for(unit& u : *resources::units) if(u.can_recruit() && u.side() == static_cast(team_index+1) && dynamic_cast(resources::filter_con)->can_recruit_on(u, hex)) @@ -124,8 +122,9 @@ int path_cost(std::vector const& path, unit const& u) int result = 0; gamemap const& map = resources::gameboard->map(); - BOOST_FOREACH(map_location const& loc, std::make_pair(path.begin()+1,path.end())) + for(map_location const& loc : std::make_pair(path.begin()+1,path.end())) { result += u.movement_cost(map[loc]); + } return result; } @@ -153,9 +152,10 @@ void unghost_owner_unit(unit* unit) bool has_actions() { - BOOST_FOREACH(team& t, *resources::teams) + for (team& t : *resources::teams) { if (!t.get_side_actions()->empty()) return true; + } return false; } @@ -170,7 +170,7 @@ void for_each_action(boost::function function, team_filter tea bool end = false; for(size_t turn=0; !end; ++turn) { end = true; - BOOST_FOREACH(team &side, *resources::teams) { + for(team &side : *resources::teams) { side_actions &actions = *side.get_side_actions(); if(turn < actions.num_turns() && team_filter(side)) { std::for_each(actions.turn_begin(turn), actions.turn_end(turn), function); @@ -185,7 +185,7 @@ action_ptr find_action_at(map_location hex, team_filter team_filter) action_ptr result; size_t result_turn = std::numeric_limits::max(); - BOOST_FOREACH(team &side, *resources::teams) { + for(team &side : *resources::teams) { side_actions &actions = *side.get_side_actions(); if(team_filter(side)) { side_actions::iterator chall = actions.find_first_action_at(hex); From fe818f80051ece8f1fb084fd9e5bc072a7cd1188 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 2 Mar 2016 12:58:00 -0500 Subject: [PATCH 127/240] Add Lua API function to set the current time of day --- changelog | 5 ++++ src/scripting/game_lua_kernel.cpp | 47 +++++++++++++++++++++++++++++++ src/scripting/game_lua_kernel.hpp | 1 + src/tod_manager.cpp | 7 +++++ src/tod_manager.hpp | 1 + 5 files changed, 61 insertions(+) diff --git a/changelog b/changelog index efadb73f5940..913b712b57ee 100644 --- a/changelog +++ b/changelog @@ -115,6 +115,11 @@ Version 1.13.4+dev: (with the exception that it does not outline the hex if true is passed as the second argument), but this name change was done to emphasize that it acts on a unit, more than a location. + * New wesnoth.set_time_of_day function which sets the current time + of day, taken either as the time ID (eg "second_watch") or the index + of the time in the overall schedule (eg, 1 would be dawn in the default + schedule). Optional second argument takes a time area ID, to set + local instead of global time. * WML tables defined in Lua now accept string keys with array values (where "array" is a table whose keys are all integers). This joins the elements of the array with commas and produces a single string diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 327a49b49d03..8902ca6e4149 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -4037,6 +4037,52 @@ int game_lua_kernel::intf_replace_schedule(lua_State * L) return 0; } +int game_lua_kernel::intf_set_time_of_day(lua_State * L) +{ + if(!game_display_) { + return 0; + } + std::string area_id; + size_t area_i; + if (lua_isstring(L, 2)) { + area_id = lua_tostring(L, 1); + std::vector area_ids = resources::tod_manager->get_area_ids(); + area_i = std::find(area_ids.begin(), area_ids.end(), area_id) - area_ids.begin(); + if(area_i >= area_ids.size()) { + return luaL_argerror(L, 1, "invalid time area ID"); + } + } + int is_num = false; + int new_time = lua_tonumberx(L, 1, &is_num) - 1; + const std::vector& times = area_id.empty() + ? game_display_->get_tod_man().times() + : game_display_->get_tod_man().times(area_i); + int num_times = times.size(); + if(!is_num) { + std::string time_id = luaL_checkstring(L, 1); + new_time = 0; + for(const time_of_day& time : times) { + if(time_id == time.id) { + break; + } + new_time++; + } + if(new_time >= num_times) { + return luaL_argerror(L, 1, "invalid time of day ID"); + } + } + if(new_time < 0 || new_time >= num_times) { + return luaL_argerror(L, 1, "invalid time of day index"); + } + + if(area_id.empty()) { + resources::tod_manager->set_current_time(new_time); + } else { + resources::tod_manager->set_current_time(new_time, area_i); + } + return 0; +} + int game_lua_kernel::intf_scroll(lua_State * L) { vconfig cfg = luaW_checkvconfig(L, 1); @@ -4343,6 +4389,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "scroll", &dispatch<&game_lua_kernel::intf_scroll > }, { "scroll_to_tile", &dispatch<&game_lua_kernel::intf_scroll_to_tile > }, { "select_hex", &dispatch<&game_lua_kernel::intf_select_hex > }, + { "set_time_of_day", &dispatch<&game_lua_kernel::intf_set_time_of_day > }, { "deselect_hex", &dispatch<&game_lua_kernel::intf_deselect_hex > }, { "select_unit", &dispatch<&game_lua_kernel::intf_select_unit > }, { "skip_messages", &dispatch<&game_lua_kernel::intf_skip_messages > }, diff --git a/src/scripting/game_lua_kernel.hpp b/src/scripting/game_lua_kernel.hpp index b102873d2026..8d13b1a124ca 100644 --- a/src/scripting/game_lua_kernel.hpp +++ b/src/scripting/game_lua_kernel.hpp @@ -153,6 +153,7 @@ class game_lua_kernel : public lua_kernel_base int intf_label(lua_State *L); int intf_redraw(lua_State *L); int intf_replace_schedule(lua_State *l); + int intf_set_time_of_day(lua_State *L); int intf_scroll(lua_State *L); int intf_get_all_vars(lua_State *L); int impl_theme_item(lua_State *L, std::string name); diff --git a/src/tod_manager.cpp b/src/tod_manager.cpp index 3dcb7d9589c2..629144592d1e 100644 --- a/src/tod_manager.cpp +++ b/src/tod_manager.cpp @@ -485,6 +485,13 @@ void tod_manager::set_current_time(int time, int area_index) { set_current_time(time, areas_[area_index]); } +void tod_manager::set_current_time(int time, const std::string& area_id) { + for (area_time_of_day& area : areas_) { + if (area.id == area_id) + set_current_time(time, area); + } +} + void tod_manager::set_current_time(int time, area_time_of_day& area) { assert(time < static_cast(area.times.size()) ); if (area.times[time].lawful_bonus != area.times[area.currentTime].lawful_bonus) { diff --git a/src/tod_manager.hpp b/src/tod_manager.hpp index 9b1374fc55bb..eb3a6485869e 100644 --- a/src/tod_manager.hpp +++ b/src/tod_manager.hpp @@ -47,6 +47,7 @@ class tod_manager : public savegame::savegame_config void set_current_time(int time); void set_current_time(int time, int area_index); + void set_current_time(int time, const std::string& area_id); void set_area_id(int area_index, const std::string& id); /** From bfc6744b03c01c3bf7440a073f9c6f6e399dae02 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 04:03:46 -0400 Subject: [PATCH 128/240] Workaround for MSVC2013's buggy atomic --- src/gui/dialogs/loadscreen.cpp | 14 ++++++++++++-- src/gui/dialogs/loadscreen.hpp | 7 ++++++- 2 files changed, 18 insertions(+), 3 deletions(-) diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index 7f98e3f7075a..c2e95fe064fe 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -115,7 +115,12 @@ void tloadscreen::progress(const char* stage) return; } if(stage) { - current_load->current_stage_.store(stage, std::memory_order_release); + current_load->current_stage_ +#if defined(_MSC_VER) && _MSC_VER < 1900 + = stage; +#else + .store(stage, std::memory_order_release); +#endif } } @@ -126,7 +131,12 @@ void tloadscreen::timer_callback(twindow& window) if (!worker_ || worker_->timed_join(boost::posix_time::milliseconds(0))) { window.close(); } - const char* stage = current_stage_.load(std::memory_order_acquire); + const char* stage = current_stage_ +#if defined(_MSC_VER) && _MSC_VER < 1900 + ; +#else + .load(std::memory_order_acquire); +#endif if (stage && (current_visible_stage_ == stages.end() || stage != current_visible_stage_->first)) { auto iter = stages.find(stage); diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index d8758156d3d2..68cb27fa2d6a 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -51,7 +51,7 @@ class tloadscreen : public tdialog /** * Hides the window. * - * The hiding also destroys the window. It is save to call the function + * The hiding also destroys the window. It is safe to call the function * when the window is not shown. */ void close(); @@ -79,7 +79,12 @@ class tloadscreen : public tdialog tlabel* animation_label_; static tloadscreen* current_load; +#if defined(_MSC_VER) && _MSC_VER < 1900 + // std::atomic is buggy in MSVC 2013 - doesn't work for cv types + const char* current_stage_; +#else std::atomic current_stage_; +#endif std::map::const_iterator current_visible_stage_; }; From 4d1c9bdd437cc4a9e3cb2ea2c2cc01abf1b27316 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 25 Feb 2016 21:30:55 -0500 Subject: [PATCH 129/240] Add wesnoth.eval_formula which compiles and evaluates a formula in the formula engine --- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 6 + src/scripting/game_lua_kernel.cpp | 2 + src/scripting/lua_formula_bridge.cpp | 242 ++++++++++++++++++ src/scripting/lua_formula_bridge.hpp | 25 ++ 4 files changed, 275 insertions(+) create mode 100644 src/scripting/lua_formula_bridge.cpp create mode 100644 src/scripting/lua_formula_bridge.hpp diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index f16e8fa386ae..3cb749247b6d 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -717,6 +717,7 @@ 91F462841C71139C0050A9C9 /* preferences_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462821C71139B0050A9C9 /* preferences_dialog.cpp */; }; 91F462881C7115C50050A9C9 /* combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462861C7115C50050A9C9 /* combobox.cpp */; }; 91F462941C7117400050A9C9 /* drop_down_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462921C7117400050A9C9 /* drop_down_list.cpp */; }; + 91FAC70A1C7FBC3400DAB2C3 /* lua_formula_bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91FAC7091C7FBC2C00DAB2C3 /* lua_formula_bridge.cpp */; }; B504B94C1284C06B00261FE9 /* tips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B504B94A1284C06B00261FE9 /* tips.cpp */; }; B508D13F10013BF900B12852 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B508D13E10013BF900B12852 /* Growl.framework */; }; B508D14B10013E4700B12852 /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = B508D14A10013E4700B12852 /* Growl Registration Ticket.growlRegDict */; }; @@ -1713,6 +1714,8 @@ 91F462921C7117400050A9C9 /* drop_down_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drop_down_list.cpp; sourceTree = ""; }; 91F462931C7117400050A9C9 /* drop_down_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drop_down_list.hpp; sourceTree = ""; }; 91FAC70B1C80168600DAB2C3 /* group.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = group.hpp; sourceTree = ""; }; + 91FAC7081C7F931900DAB2C3 /* lua_formula_bridge.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = lua_formula_bridge.hpp; sourceTree = ""; }; + 91FAC7091C7FBC2C00DAB2C3 /* lua_formula_bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lua_formula_bridge.cpp; sourceTree = ""; }; B504B94A1284C06B00261FE9 /* tips.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tips.cpp; sourceTree = ""; }; B504B94B1284C06B00261FE9 /* tips.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tips.hpp; sourceTree = ""; }; B508D13E10013BF900B12852 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = lib/Growl.framework; sourceTree = ""; }; @@ -4100,6 +4103,8 @@ 91B621E61B76BB0B00B00E0F /* lua_cpp_function.hpp */, ECA4A6781A1EC319006BCCF2 /* lua_fileops.cpp */, 91B621E71B76BB0E00B00E0F /* lua_fileops.hpp */, + 91FAC7091C7FBC2C00DAB2C3 /* lua_formula_bridge.cpp */, + 91FAC7081C7F931900DAB2C3 /* lua_formula_bridge.hpp */, ECA1E0F11A1271AC00426E00 /* lua_gui2.cpp */, 91B621E81B76BB1100B00E0F /* lua_gui2.hpp */, EC218E9F1A106648007C910C /* lua_kernel_base.cpp */, @@ -5182,6 +5187,7 @@ 91DCA6891C9066CC0030F8D0 /* unit_preview_pane.cpp in Sources */, 91DCA68D1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */, 9122417C1CAAB7B7008B347F /* loadscreen.cpp in Sources */, + 91FAC70A1C7FBC3400DAB2C3 /* lua_formula_bridge.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 327a49b49d03..a07470b7abce 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -75,6 +75,7 @@ #include "scripting/lua_api.hpp" // for luaW_toboolean, etc #include "scripting/lua_common.hpp" #include "scripting/lua_cpp_function.hpp" +#include "scripting/lua_formula_bridge.hpp" #include "scripting/lua_gui2.hpp" // for show_gamestate_inspector #include "scripting/lua_pathfind_cost_calculator.hpp" #include "scripting/lua_race.hpp" @@ -4261,6 +4262,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "debug", &intf_debug }, { "debug_ai", &intf_debug_ai }, { "eval_conditional", &intf_eval_conditional }, + { "eval_formula", &lua_formula_bridge::intf_eval_formula}, { "get_era", &intf_get_era }, { "get_image_size", &intf_get_image_size }, { "get_time_stamp", &intf_get_time_stamp }, diff --git a/src/scripting/lua_formula_bridge.cpp b/src/scripting/lua_formula_bridge.cpp new file mode 100644 index 000000000000..8fc9ffc67768 --- /dev/null +++ b/src/scripting/lua_formula_bridge.cpp @@ -0,0 +1,242 @@ +/* + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. + */ + +#include "scripting/lua_formula_bridge.hpp" + +#include "boost/variant/static_visitor.hpp" + +#include "scripting/game_lua_kernel.hpp" +#include "scripting/lua_api.hpp" +#include "scripting/lua_common.hpp" +#include "lua/lauxlib.h" +#include "lua/lua.h" +#include "formula/callable_objects.hpp" +#include "formula/formula.hpp" +#include "formula/function.hpp" +#include "variable.hpp" + +void luaW_pushfaivariant(lua_State* L, variant val); +variant luaW_tofaivariant(lua_State* L, int i); + +static const char*const formula_id_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; + +using namespace game_logic; + +class lua_callable : public formula_callable { + lua_State* mState; + int table_i; +public: + lua_callable(lua_State* L, int i) : mState(L), table_i(lua_absindex(L,i)) {} + variant get_value(const std::string& key) const { + if(key == "__list") { + std::vector values; + size_t n = lua_rawlen(mState, table_i); + if(n == 0) { + return variant(); + } + for(size_t i = 1; i <= n; i++) { + lua_pushinteger(mState, i); + lua_gettable(mState, table_i); + values.push_back(luaW_tofaivariant(mState, -1)); + } + return variant(&values); + } else if(key == "__map") { + std::map values; + for(lua_pushnil(mState); lua_next(mState, table_i); lua_pop(mState, 1)) { + values[luaW_tofaivariant(mState, -2)] = luaW_tofaivariant(mState, -1); + } + return variant(&values); + } + lua_pushlstring(mState, key.c_str(), key.size()); + lua_gettable(mState, table_i); + variant result = luaW_tofaivariant(mState, -1); + lua_pop(mState, 1); + return result; + } + void get_inputs(std::vector* inputs) const { + inputs->push_back(formula_input("__list", FORMULA_READ_ONLY)); + inputs->push_back(formula_input("__map", FORMULA_READ_ONLY)); + for(lua_pushnil(mState); lua_next(mState, table_i); lua_pop(mState,1)) { + if(lua_isstring(mState, -2) && !lua_isnumber(mState, -2)) { + std::string key = lua_tostring(mState, -2); + if(key.find_first_not_of(formula_id_chars) != std::string::npos) { + inputs->push_back(formula_input(key, FORMULA_READ_ONLY)); + } + } + } + } +}; + +class fai_variant_visitor : public boost::static_visitor { +public: + variant operator()(bool b) const {return variant(b ? 1 : 0);} + variant operator()(int i) const {return variant(i);} + variant operator()(unsigned long long i) const {return variant(i);} + variant operator()(double i) const {return variant(i * 1000, variant::DECIMAL_VARIANT);} + variant operator()(const std::string& s) const {return variant(s);} // TODO: Should comma-separated lists of stuff be returned as a list? The challenge is to distinguish them from ordinary strings that happen to contain a comma (or should we assume that such strings will be translatable?) + variant operator()(const t_string& s) const {return variant(s.str());} + variant operator()(boost::blank) const {return variant();} +}; + +class config_callable : public formula_callable { + const config& cfg; +public: + config_callable(const config& c) : cfg(c) {} + variant get_value(const std::string& key) const { + if(cfg.has_attribute(key)) { + return cfg[key].apply_visitor(fai_variant_visitor()); + } else if(cfg.has_child(key)) { + std::vector result; + for(const config& child : cfg.child_range(key)) { + result.push_back(variant(new config_callable(child))); + } + return variant(&result); + } else if(key == "__all_children") { + std::vector result; + for(const config::any_child& child : cfg.all_children_range()) { + const variant cfg_child(new config_callable(child.cfg)); + const variant kv(new key_value_pair(variant(child.key), cfg_child)); + result.push_back(kv); + } + return variant(&result); + } else if(key == "__children") { + std::map > build; + for(const config::any_child& child : cfg.all_children_range()) { + const variant cfg_child(new config_callable(child.cfg)); + build[child.key].push_back(cfg_child); + } + std::map result; + for(auto& p : build) { + result[variant(p.first)] = variant(&p.second); + } + return variant(&result); + } else if(key == "__attributes") { + std::map result; + for(const config::attribute& val : cfg.attribute_range()) { + result[variant(val.first)] = val.second.apply_visitor(fai_variant_visitor()); + } + return variant(&result); + } else return variant(); + } + void get_inputs(std::vector* inputs) const { + inputs->push_back(formula_input("__all_children", FORMULA_READ_ONLY)); + inputs->push_back(formula_input("__children", FORMULA_READ_ONLY)); + inputs->push_back(formula_input("__attributes", FORMULA_READ_ONLY)); + for(const config::attribute& val : cfg.attribute_range()) { + if(val.first.find_first_not_of(formula_id_chars) != std::string::npos) { + inputs->push_back(formula_input(val.first, FORMULA_READ_ONLY)); + } + } + } +}; + +void luaW_pushfaivariant(lua_State* L, variant val) { + if(val.is_int()) { + lua_pushinteger(L, val.as_int()); + } else if(val.is_decimal()) { + lua_pushnumber(L, val.as_decimal() / 1000.0); + } else if(val.is_string()) { + const std::string result_string = val.as_string(); + lua_pushlstring(L, result_string.c_str(), result_string.size()); + } else if(val.is_list()) { + lua_newtable(L); + for(const variant& v : val.as_list()) { + lua_pushinteger(L, lua_rawlen(L, -1) + 1); + luaW_pushfaivariant(L, v); + lua_settable(L, -3); + } + } else if(val.is_map()) { + typedef std::map::value_type kv_type; + lua_newtable(L); + for(const kv_type& v : val.as_map()) { + luaW_pushfaivariant(L, v.first); + luaW_pushfaivariant(L, v.second); + lua_settable(L, -3); + } + } else if(val.is_callable()) { + // First try a few special cases (well, currently, only one) + if(unit_callable* u = val.try_convert()) { + std::string id = u->query_value("id").as_string(); + luaW_getglobal(L, "wesnoth", "get_unit", NULL); + lua_pushstring(L, id.c_str()); + luaW_pcall(L, 1, 1); + } else { + // If those fail, convert generically to a map + const formula_callable* obj = val.as_callable(); + std::vector inputs; + obj->get_inputs(&inputs); + lua_newtable(L); + for(const formula_input& attr : inputs) { + if(attr.access == FORMULA_WRITE_ONLY) { + continue; + } + lua_pushstring(L, attr.name.c_str()); + luaW_pushfaivariant(L, obj->query_value(attr.name)); + lua_settable(L, -3); + } + } + } else if(val.is_null()) { + lua_pushnil(L); + } +} + +variant luaW_tofaivariant(lua_State* L, int i) { + switch(lua_type(L, i)) { + case LUA_TBOOLEAN: + return variant(lua_tointeger(L, i)); + case LUA_TNUMBER: + return variant(lua_tonumber(L, i), variant::DECIMAL_VARIANT); + case LUA_TSTRING: + return variant(lua_tostring(L, i)); + case LUA_TTABLE: + return variant(new lua_callable(L, i)); + case LUA_TUSERDATA: + static t_string tstr; + static vconfig vcfg = vconfig::unconstructed_vconfig(); + if(luaW_totstring(L, i, tstr)) { + return variant(tstr.str()); + } else if(luaW_tovconfig(L, i, vcfg)) { + return variant(new config_callable(vcfg.get_parsed_config())); + } else if(unit* u = luaW_tounit(L, i)) { + return variant(new unit_callable(*u)); + } + break; + } + return variant(); +} + +/** + * Evaluates a formula in the formula engine. + * - Arg 1: Formula string. + * - Arg 2: optional context; can be a unit or a Lua table. + * - Ret 1: Result of the formula. + */ +int lua_formula_bridge::intf_eval_formula(lua_State *L) +{ + using namespace game_logic; + if(!lua_isstring(L, 1)) { + luaL_typerror(L, 1, "string"); + } + const formula form(lua_tostring(L, 1)); + boost::shared_ptr context, fallback; + if(unit* u = luaW_tounit(L, 2)) { + context.reset(new unit_callable(*u)); + } else if(lua_istable(L, 2)) { + context.reset(new lua_callable(L, 2)); + } else { + context.reset(new map_formula_callable); + } + variant result = form.evaluate(*context); + luaW_pushfaivariant(L, result); + return 1; +} diff --git a/src/scripting/lua_formula_bridge.hpp b/src/scripting/lua_formula_bridge.hpp new file mode 100644 index 000000000000..8cc8fd4ba9bc --- /dev/null +++ b/src/scripting/lua_formula_bridge.hpp @@ -0,0 +1,25 @@ +/* + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. + */ + +#ifndef LUA_FORMULA_BRIDGE_HPP_INCLUDED +#define LUA_FORMULA_BRIDGE_HPP_INCLUDED + +struct lua_State; + +namespace lua_formula_bridge { + + int intf_eval_formula(lua_State*); + +} // end namespace lua_formula_bridge + +#endif From 38198e915172edb64c9d43b76168b72cfc860953 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Thu, 10 Mar 2016 14:05:14 -0500 Subject: [PATCH 130/240] Move config_callable to callable_objects.hpp and add a comparator function --- src/formula/callable_objects.cpp | 76 +++++++++++++++++++++++++ src/formula/callable_objects.hpp | 11 ++++ src/formula/formula.cpp | 2 + src/formula/formula.hpp | 1 + src/scripting/lua_formula_bridge.cpp | 84 ++++------------------------ 5 files changed, 102 insertions(+), 72 deletions(-) diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 7208969957b3..9d18372d047e 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -13,8 +13,10 @@ */ #include "formula/callable_objects.hpp" +#include "formula/function.hpp" #include "units/unit.hpp" #include "units/formula_manager.hpp" +#include "config.hpp" template variant convert_map( const std::map& input_map ) { @@ -459,6 +461,80 @@ int unit_type_callable::do_compare(const formula_callable* callable) const return u_.id().compare(u_callable->u_.id()); } +class fai_variant_visitor : public boost::static_visitor { +public: + variant operator()(bool b) const {return variant(b ? 1 : 0);} + variant operator()(int i) const {return variant(i);} + variant operator()(unsigned long long i) const {return variant(i);} + variant operator()(double i) const {return variant(i * 1000, variant::DECIMAL_VARIANT);} + variant operator()(const std::string& s) const {return variant(s);} // TODO: Should comma-separated lists of stuff be returned as a list? The challenge is to distinguish them from ordinary strings that happen to contain a comma (or should we assume that such strings will be translatable?) + variant operator()(const t_string& s) const {return variant(s.str());} + variant operator()(boost::blank) const {return variant();} +}; + +variant config_callable::get_value(const std::string& key) const +{ + if(cfg_.has_attribute(key)) { + return cfg_[key].apply_visitor(fai_variant_visitor()); + } else if(cfg_.has_child(key)) { + std::vector result; + for(const auto& child : cfg_.child_range(key)) { + result.push_back(variant(new config_callable(child))); + } + return variant(&result); + } else if(key == "__all_children") { + std::vector result; + for(const auto& child : cfg_.all_children_range()) { + const variant cfg_child(new config_callable(child.cfg)); + const variant kv(new game_logic::key_value_pair(variant(child.key), cfg_child)); + result.push_back(kv); + } + return variant(&result); + } else if(key == "__children") { + std::map > build; + for(const auto& child : cfg_.all_children_range()) { + const variant cfg_child(new config_callable(child.cfg)); + build[child.key].push_back(cfg_child); + } + std::map result; + for(auto& p : build) { + result[variant(p.first)] = variant(&p.second); + } + return variant(&result); + } else if(key == "__attributes") { + std::map result; + for(const auto& val : cfg_.attribute_range()) { + result[variant(val.first)] = val.second.apply_visitor(fai_variant_visitor()); + } + return variant(&result); + } else return variant(); +} + +void config_callable::get_inputs(std::vector* inputs) const +{ + inputs->push_back(game_logic::formula_input("__all_children", game_logic::FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("__children", game_logic::FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("__attributes", game_logic::FORMULA_READ_ONLY)); + for(const auto& val : cfg_.attribute_range()) { + if(val.first.find_first_not_of(game_logic::formula::id_chars) != std::string::npos) { + inputs->push_back(game_logic::formula_input(val.first, game_logic::FORMULA_READ_ONLY)); + } + } +} + +int config_callable::do_compare(const game_logic::formula_callable* callable) const +{ + const config_callable* cfg_callable = dynamic_cast(callable); + if(cfg_callable == NULL) { + return formula_callable::do_compare(callable); + } + + if(cfg_ == cfg_callable->get_config()) { + return 0; + } + return cfg_.hash().compare(cfg_callable->get_config().hash()); +} + variant terrain_callable::get_value(const std::string& key) const { if(key == "x") { diff --git a/src/formula/callable_objects.hpp b/src/formula/callable_objects.hpp index e1a5aef82782..40854cd6d068 100644 --- a/src/formula/callable_objects.hpp +++ b/src/formula/callable_objects.hpp @@ -186,6 +186,17 @@ class unit_type_callable : public game_logic::formula_callable { const unit_type& u_; }; +class config_callable : public game_logic::formula_callable { +public: + config_callable(const config& c) : cfg_(c) {} + variant get_value(const std::string& key) const; + void get_inputs(std::vector* inputs) const; + int do_compare(const formula_callable* callable) const; + const config& get_config() const {return cfg_;} +private: + const config& cfg_; +}; + CALLABLE_WRAPPER_START(team) CALLABLE_WRAPPER_INPUT(side) diff --git a/src/formula/formula.cpp b/src/formula/formula.cpp index 6186396370fa..8d8a9133477c 100644 --- a/src/formula/formula.cpp +++ b/src/formula/formula.cpp @@ -24,6 +24,8 @@ namespace game_logic { +const char*const formula::id_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; + void formula_callable::set_value(const std::string& key, const variant& /*value*/) { std::cerr << "ERROR: cannot set key '" << key << "' on object" << std::endl; diff --git a/src/formula/formula.hpp b/src/formula/formula.hpp index fb7e93ff3a79..ddcd9dad01e7 100644 --- a/src/formula/formula.hpp +++ b/src/formula/formula.hpp @@ -62,6 +62,7 @@ class formula { ~formula(); const std::string& str() const { return str_; } + static const char*const id_chars; private: variant execute(const formula_callable& variables, formula_debugger *fdb = nullptr) const; variant execute(formula_debugger *fdb) const; diff --git a/src/scripting/lua_formula_bridge.cpp b/src/scripting/lua_formula_bridge.cpp index 8fc9ffc67768..fa9bd1ec1194 100644 --- a/src/scripting/lua_formula_bridge.cpp +++ b/src/scripting/lua_formula_bridge.cpp @@ -22,14 +22,11 @@ #include "lua/lua.h" #include "formula/callable_objects.hpp" #include "formula/formula.hpp" -#include "formula/function.hpp" #include "variable.hpp" void luaW_pushfaivariant(lua_State* L, variant val); variant luaW_tofaivariant(lua_State* L, int i); -static const char*const formula_id_chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_"; - using namespace game_logic; class lua_callable : public formula_callable { @@ -69,7 +66,7 @@ class lua_callable : public formula_callable { for(lua_pushnil(mState); lua_next(mState, table_i); lua_pop(mState,1)) { if(lua_isstring(mState, -2) && !lua_isnumber(mState, -2)) { std::string key = lua_tostring(mState, -2); - if(key.find_first_not_of(formula_id_chars) != std::string::npos) { + if(key.find_first_not_of(formula::id_chars) != std::string::npos) { inputs->push_back(formula_input(key, FORMULA_READ_ONLY)); } } @@ -77,69 +74,6 @@ class lua_callable : public formula_callable { } }; -class fai_variant_visitor : public boost::static_visitor { -public: - variant operator()(bool b) const {return variant(b ? 1 : 0);} - variant operator()(int i) const {return variant(i);} - variant operator()(unsigned long long i) const {return variant(i);} - variant operator()(double i) const {return variant(i * 1000, variant::DECIMAL_VARIANT);} - variant operator()(const std::string& s) const {return variant(s);} // TODO: Should comma-separated lists of stuff be returned as a list? The challenge is to distinguish them from ordinary strings that happen to contain a comma (or should we assume that such strings will be translatable?) - variant operator()(const t_string& s) const {return variant(s.str());} - variant operator()(boost::blank) const {return variant();} -}; - -class config_callable : public formula_callable { - const config& cfg; -public: - config_callable(const config& c) : cfg(c) {} - variant get_value(const std::string& key) const { - if(cfg.has_attribute(key)) { - return cfg[key].apply_visitor(fai_variant_visitor()); - } else if(cfg.has_child(key)) { - std::vector result; - for(const config& child : cfg.child_range(key)) { - result.push_back(variant(new config_callable(child))); - } - return variant(&result); - } else if(key == "__all_children") { - std::vector result; - for(const config::any_child& child : cfg.all_children_range()) { - const variant cfg_child(new config_callable(child.cfg)); - const variant kv(new key_value_pair(variant(child.key), cfg_child)); - result.push_back(kv); - } - return variant(&result); - } else if(key == "__children") { - std::map > build; - for(const config::any_child& child : cfg.all_children_range()) { - const variant cfg_child(new config_callable(child.cfg)); - build[child.key].push_back(cfg_child); - } - std::map result; - for(auto& p : build) { - result[variant(p.first)] = variant(&p.second); - } - return variant(&result); - } else if(key == "__attributes") { - std::map result; - for(const config::attribute& val : cfg.attribute_range()) { - result[variant(val.first)] = val.second.apply_visitor(fai_variant_visitor()); - } - return variant(&result); - } else return variant(); - } - void get_inputs(std::vector* inputs) const { - inputs->push_back(formula_input("__all_children", FORMULA_READ_ONLY)); - inputs->push_back(formula_input("__children", FORMULA_READ_ONLY)); - inputs->push_back(formula_input("__attributes", FORMULA_READ_ONLY)); - for(const config::attribute& val : cfg.attribute_range()) { - if(val.first.find_first_not_of(formula_id_chars) != std::string::npos) { - inputs->push_back(formula_input(val.first, FORMULA_READ_ONLY)); - } - } - } -}; - void luaW_pushfaivariant(lua_State* L, variant val) { if(val.is_int()) { lua_pushinteger(L, val.as_int()); @@ -165,11 +99,17 @@ void luaW_pushfaivariant(lua_State* L, variant val) { } } else if(val.is_callable()) { // First try a few special cases (well, currently, only one) - if(unit_callable* u = val.try_convert()) { - std::string id = u->query_value("id").as_string(); - luaW_getglobal(L, "wesnoth", "get_unit", NULL); - lua_pushstring(L, id.c_str()); - luaW_pcall(L, 1, 1); + if(unit_callable* u_ref = val.try_convert()) { + const unit& u = u_ref->get_unit(); + unit_map::iterator un_it = resources::units->find(u.get_location()); + if(&*un_it == &u) { + new(lua_newuserdata(L, sizeof(lua_unit))) lua_unit(u.underlying_id()); + } else { + new(lua_newuserdata(L, sizeof(lua_unit))) lua_unit(u.side(), u.underlying_id()); + } + lua_pushlightuserdata(L, getunitKey); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_setmetatable(L, -2); } else { // If those fail, convert generically to a map const formula_callable* obj = val.as_callable(); From ac4479090fef362bd491d72ee011619700dc21eb Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 21 Mar 2016 22:44:39 -0400 Subject: [PATCH 131/240] Add a comparator function for lua_callable --- src/scripting/lua_formula_bridge.cpp | 38 ++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/src/scripting/lua_formula_bridge.cpp b/src/scripting/lua_formula_bridge.cpp index fa9bd1ec1194..46b67d5f0d2e 100644 --- a/src/scripting/lua_formula_bridge.cpp +++ b/src/scripting/lua_formula_bridge.cpp @@ -24,6 +24,9 @@ #include "formula/formula.hpp" #include "variable.hpp" +#include "resources.hpp" +#include "units/map.hpp" + void luaW_pushfaivariant(lua_State* L, variant val); variant luaW_tofaivariant(lua_State* L, int i); @@ -72,6 +75,41 @@ class lua_callable : public formula_callable { } } } + int do_compare(const formula_callable* other) const { + const lua_callable* lua = dynamic_cast(other); + if(lua == NULL) { + return formula_callable::do_compare(other); + } + if(mState == lua->mState) { // Which should always be the case, but let's be safe here + if(lua_compare(mState, table_i, lua->table_i, LUA_OPEQ)) { + return 0; + } + int top = lua_gettop(mState); + if(lua_getmetatable(mState, table_i)) { + lua_getfield(mState, -1, "__lt"); + if(!lua_isnoneornil(mState, -1)) { + if(lua_getmetatable(mState, lua->table_i)) { + lua_getfield(mState, -1, "__lt"); + if(!lua_isnoneornil(mState, -1)) { + lua_settop(mState, top); + return lua_compare(mState, table_i, lua->table_i, LUA_OPLT) ? -1 : 1; + } + if(lua_compare(mState, -4, -2, LUA_OPEQ)) { + lua_settop(mState, top); + return 0; + } + const void* lhs = lua_topointer(mState, -4); + const void* rhs = lua_topointer(mState, -2); + lua_settop(mState, top); + return lhs < rhs ? -1 : (lhs > rhs ? 1 : 0); + } + } + } + lua_settop(mState, top); + return lua_topointer(mState, -2) < lua_topointer(mState, -1) ? -1 : 1; + } + return mState < lua->mState ? -1 : 1; + } }; void luaW_pushfaivariant(lua_State* L, variant val) { From 5bb6c30b057d8b78363867e178d525123d4d698a Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 18 Mar 2016 14:40:43 -0400 Subject: [PATCH 132/240] Lua API: Add wesnoth.compile_formula which returns a callable userdata --- src/scripting/game_lua_kernel.cpp | 4 ++ src/scripting/lua_formula_bridge.cpp | 81 ++++++++++++++++++++++++++-- src/scripting/lua_formula_bridge.hpp | 21 ++++++++ src/scripting/lua_types.cpp | 2 + src/scripting/lua_types.hpp | 1 + 5 files changed, 104 insertions(+), 5 deletions(-) diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index a07470b7abce..1499f4ddcba2 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -4257,6 +4257,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "add_known_unit", &intf_add_known_unit }, { "add_modification", &intf_add_modification }, { "advance_unit", &intf_advance_unit }, + { "compile_formula", &lua_formula_bridge::intf_compile_formula}, { "copy_unit", &intf_copy_unit }, { "create_unit", &intf_create_unit }, { "debug", &intf_debug }, @@ -4455,6 +4456,9 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle lua_pushstring(L, "unit variables"); lua_setfield(L, -2, "__metatable"); lua_rawset(L, LUA_REGISTRYINDEX); + + // Create formula bridge metatables + cmd_log_ << lua_formula_bridge::register_metatables(L); // Create the vconfig metatable. cmd_log_ << lua_common::register_vconfig_metatable(L); diff --git a/src/scripting/lua_formula_bridge.cpp b/src/scripting/lua_formula_bridge.cpp index 46b67d5f0d2e..9507236dea81 100644 --- a/src/scripting/lua_formula_bridge.cpp +++ b/src/scripting/lua_formula_bridge.cpp @@ -201,11 +201,14 @@ variant luaW_tofaivariant(lua_State* L, int i) { */ int lua_formula_bridge::intf_eval_formula(lua_State *L) { - using namespace game_logic; - if(!lua_isstring(L, 1)) { - luaL_typerror(L, 1, "string"); + bool need_delete = false; + fwrapper* form; + if(luaW_hasmetatable(L, 1, formulaKey)) { + form = static_cast(lua_touserdata(L, 1)); + } else { + need_delete = true; + form = new fwrapper(luaL_checkstring(L, 1)); } - const formula form(lua_tostring(L, 1)); boost::shared_ptr context, fallback; if(unit* u = luaW_tounit(L, 2)) { context.reset(new unit_callable(*u)); @@ -214,7 +217,75 @@ int lua_formula_bridge::intf_eval_formula(lua_State *L) } else { context.reset(new map_formula_callable); } - variant result = form.evaluate(*context); + variant result = form->evaluate(*context); luaW_pushfaivariant(L, result); + if(need_delete) { + delete form; + } return 1; } + +int lua_formula_bridge::intf_compile_formula(lua_State* L) +{ + if(!lua_isstring(L, 1)) { + luaL_typerror(L, 1, "string"); + } + new(lua_newuserdata(L, sizeof(fwrapper))) fwrapper(lua_tostring(L, 1)); + lua_pushlightuserdata(L, formulaKey); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_setmetatable(L, -2); + return 1; +} + +lua_formula_bridge::fwrapper::fwrapper(const std::string& code, game_logic::function_symbol_table* functions) + : formula_ptr(new formula(code, functions)) +{ +} + +std::string lua_formula_bridge::fwrapper::str() const +{ + if(formula_ptr) { + return formula_ptr->str(); + } + return ""; +} + +variant lua_formula_bridge::fwrapper::evaluate(const formula_callable& variables, formula_debugger* fdb) const +{ + if(formula_ptr) { + return formula_ptr->evaluate(variables, fdb); + } + return variant(); +} + +static int impl_formula_collect(lua_State* L) +{ + lua_formula_bridge::fwrapper* form = static_cast(lua_touserdata(L, 1)); + form->~fwrapper(); + return 0; +} + +static int impl_formula_tostring(lua_State* L) +{ + lua_formula_bridge::fwrapper* form = static_cast(lua_touserdata(L, 1)); + const std::string str = form->str(); + lua_pushlstring(L, str.c_str(), str.size()); + return 1; +} + +std::string lua_formula_bridge::register_metatables(lua_State* L) +{ + lua_pushlightuserdata(L, formulaKey); + lua_createtable(L, 0, 4); + lua_pushcfunction(L, impl_formula_collect); + lua_setfield(L, -2, "__gc"); + lua_pushcfunction(L, impl_formula_tostring); + lua_setfield(L, -2, "__tostring"); + lua_pushcfunction(L, intf_eval_formula); + lua_setfield(L, -2, "__call"); + lua_pushstring(L, "formula"); + lua_setfield(L, -2, "__metatable"); + lua_rawset(L, LUA_REGISTRYINDEX); + + return "Adding formula metatable..."; +} diff --git a/src/scripting/lua_formula_bridge.hpp b/src/scripting/lua_formula_bridge.hpp index 8cc8fd4ba9bc..f64b7f434b38 100644 --- a/src/scripting/lua_formula_bridge.hpp +++ b/src/scripting/lua_formula_bridge.hpp @@ -14,11 +14,32 @@ #ifndef LUA_FORMULA_BRIDGE_HPP_INCLUDED #define LUA_FORMULA_BRIDGE_HPP_INCLUDED +#include +#include + struct lua_State; +class variant; +namespace game_logic { + class formula; + class function_symbol_table; + class formula_debugger; + class formula_callable; +} + namespace lua_formula_bridge { int intf_eval_formula(lua_State*); + int intf_compile_formula(lua_State*); + std::string register_metatables(lua_State*); + + class fwrapper { + boost::shared_ptr formula_ptr; + public: + fwrapper(const std::string& code, game_logic::function_symbol_table* functions = NULL); + std::string str() const; + variant evaluate(const game_logic::formula_callable& variables, game_logic::formula_debugger* fdb = NULL) const; + }; } // end namespace lua_formula_bridge diff --git a/src/scripting/lua_types.cpp b/src/scripting/lua_types.cpp index c3c9153b318f..e395b9635ba9 100644 --- a/src/scripting/lua_types.cpp +++ b/src/scripting/lua_types.cpp @@ -21,6 +21,7 @@ static char const v_unitvarKey = 0; static char const v_ustatusKey = 0; static char const v_uattacksKey = 0; static char const v_uattackKey = 0; +static char const v_formulaKey = 0; luatypekey const executeKey = static_cast(const_cast(&v_executeKey)); @@ -29,3 +30,4 @@ luatypekey const unitvarKey = static_cast(const_cast(&v_unitvarK luatypekey const ustatusKey = static_cast(const_cast(&v_ustatusKey)); luatypekey const uattacksKey = static_cast(const_cast(&v_uattacksKey)); luatypekey const uattackKey = static_cast(const_cast(&v_uattackKey)); +luatypekey const formulaKey = static_cast(const_cast(&v_formulaKey)); diff --git a/src/scripting/lua_types.hpp b/src/scripting/lua_types.hpp index 71f5e64451ed..dd5d2fd7d068 100644 --- a/src/scripting/lua_types.hpp +++ b/src/scripting/lua_types.hpp @@ -25,5 +25,6 @@ extern luatypekey const unitvarKey; extern luatypekey const ustatusKey; extern luatypekey const uattacksKey; extern luatypekey const uattackKey; +extern luatypekey const formulaKey; #endif From 5fdad345f243d7d9a7a72fe24c7e31dc24ff3cab Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 19 Mar 2016 00:36:52 -0400 Subject: [PATCH 133/240] Formula engine: Generalize system of defining and instantiating functions --- src/ai/formula/ai.cpp | 3 +- src/ai/formula/function_table.cpp | 184 ++++++++++++------------------ src/ai/formula/function_table.hpp | 12 +- src/formula/formula.cpp | 6 +- src/formula/function.cpp | 75 +++--------- src/formula/function.hpp | 46 +++++--- 6 files changed, 128 insertions(+), 198 deletions(-) diff --git a/src/ai/formula/ai.cpp b/src/ai/formula/ai.cpp index 76e81b739501..fc7c5387bf2a 100644 --- a/src/ai/formula/ai.cpp +++ b/src/ai/formula/ai.cpp @@ -561,7 +561,8 @@ variant formula_ai::execute_variant(const variant& var, ai_context &ai_, bool co void formula_ai::add_formula_function(const std::string& name, const_formula_ptr formula, const_formula_ptr precondition, const std::vector& args) { - function_table_.add_formula_function(name,formula,precondition,args); + formula_function_ptr fcn(new user_formula_function(name,formula,precondition,args)); + function_table_.add_function(name, fcn); } namespace { diff --git a/src/ai/formula/function_table.cpp b/src/ai/formula/function_table.cpp index f22bc9dd49c6..8a72d55d237c 100644 --- a/src/ai/formula/function_table.cpp +++ b/src/ai/formula/function_table.cpp @@ -376,7 +376,7 @@ class calculate_map_ownership_function : public function_expression { class nearest_loc_function : public function_expression { public: - nearest_loc_function(const args_list& args, const formula_ai& /*ai*/) + nearest_loc_function(const args_list& args) : function_expression("nearest_loc", args, 2, 2) { } @@ -409,7 +409,7 @@ class nearest_loc_function : public function_expression { class adjacent_locs_function : public function_expression { public: - adjacent_locs_function(const args_list& args, const formula_ai& /*ai*/) + adjacent_locs_function(const args_list& args) : function_expression("adjacent_locs", args, 1, 1) { } @@ -433,7 +433,7 @@ class adjacent_locs_function : public function_expression { class locations_in_radius_function : public function_expression { public: - locations_in_radius_function(const args_list& args, const formula_ai& /*ai*/) + locations_in_radius_function(const args_list& args) : function_expression("locations_in_radius", args, 2, 2) { } @@ -505,7 +505,7 @@ class run_file_function : public function_expression { class castle_locs_function : public function_expression { public: - castle_locs_function(const args_list& args, const formula_ai& /*ai*/) + castle_locs_function(const args_list& args) : function_expression("castle_locs", args, 1, 1) { } @@ -565,7 +565,7 @@ class castle_locs_function : public function_expression { */ class timeofday_modifier_function : public function_expression { public: - timeofday_modifier_function(const args_list& args, const formula_ai& /*ai*/) + timeofday_modifier_function(const args_list& args) : function_expression("timeofday_modifier", args, 1, 2) { } @@ -725,10 +725,9 @@ class close_enemies_function : public function_expression { const formula_ai& ai_; }; - class calculate_outcome_function : public function_expression { public: - calculate_outcome_function(const args_list& args, const formula_ai& /*ai*/) + calculate_outcome_function(const args_list& args) : function_expression( "calculate_outcome", args, 3, 4) { } @@ -812,7 +811,7 @@ class calculate_outcome_function : public function_expression { class outcomes_function : public function_expression { public: - outcomes_function(const args_list& args, const formula_ai& /*ai*/) + outcomes_function(const args_list& args) : function_expression("outcomes", args, 1, 1) { } @@ -1175,7 +1174,7 @@ class fallback_function : public function_expression { class attack_function : public function_expression { public: - explicit attack_function(const args_list& args, const formula_ai& /*ai*/) + explicit attack_function(const args_list& args) : function_expression("attack", args, 3, 4) {} private: @@ -1303,7 +1302,7 @@ class is_unowned_village_function : public function_expression { class unit_at_function : public function_expression { public: - unit_at_function(const args_list& args, const formula_ai& /*ai*/) + unit_at_function(const args_list& args) : function_expression("unit_at", args, 1, 1) {} private: @@ -1354,7 +1353,7 @@ class unit_moves_function : public function_expression { class units_can_reach_function : public function_expression { public: - units_can_reach_function(const args_list& args, const formula_ai& /*ai*/) + units_can_reach_function(const args_list& args) : function_expression("units_can_reach", args, 2, 2) {} private: @@ -1378,7 +1377,7 @@ class units_can_reach_function : public function_expression { class defense_on_function : public function_expression { public: - defense_on_function(const args_list& args, const formula_ai& /*ai*/) + defense_on_function(const args_list& args) : function_expression("defense_on", args, 2, 2) {} private: @@ -1428,7 +1427,7 @@ class defense_on_function : public function_expression { class chance_to_hit_function : public function_expression { public: - chance_to_hit_function(const args_list& args, const formula_ai& /*ai*/) + chance_to_hit_function(const args_list& args) : function_expression("chance_to_hit", args, 2, 2) {} private: @@ -1472,7 +1471,7 @@ class chance_to_hit_function : public function_expression { class movement_cost_function : public function_expression { public: - movement_cost_function(const args_list& args, const formula_ai& /*ai*/) + movement_cost_function(const args_list& args) : function_expression("movement_cost", args, 2, 2) {} private: @@ -1533,9 +1532,7 @@ class is_avoided_location_function : public function_expression { class max_possible_damage_function : public function_expression { public: - max_possible_damage_function( - const args_list& args - , const formula_ai& /*ai*/) + max_possible_damage_function(const args_list& args) : function_expression("max_possible_damage", args, 2, 2) {} private: @@ -1587,9 +1584,7 @@ class max_possible_damage_function : public function_expression { class max_possible_damage_with_retaliation_function : public function_expression { public: - max_possible_damage_with_retaliation_function( - const args_list& args - , const formula_ai& /*ai*/) + max_possible_damage_with_retaliation_function(const args_list& args) : function_expression("max_possible_damage_with_retaliation", args, 2, 2) {} private: @@ -1637,96 +1632,69 @@ class max_possible_damage_with_retaliation_function : public function_expression } }; -} +template +class ai_formula_function : public formula_function { +protected: + formula_ai& ai_; +public: + ai_formula_function(const std::string& name, ai::formula_ai& ai) : formula_function(name), ai_(ai) {} + function_expression_ptr generate_function_expression(const std::vector& args) const { + return function_expression_ptr(new T(args, ai_)); + } +}; +} -expression_ptr ai_function_symbol_table::create_function(const std::string &fn, - const std::vector& args) const { - if(fn == "outcomes") { - return expression_ptr(new outcomes_function(args, ai_)); - //} else if(fn == "evaluate_for_position") { - // return expression_ptr(new evaluate_for_position_function(args, ai_)); - } else if(fn == "move") { - return expression_ptr(new move_function(args)); - } else if(fn == "move_partial") { - return expression_ptr(new move_partial_function(args)); - } else if(fn == "attack") { - return expression_ptr(new attack_function(args, ai_)); - } else if(fn == "rate_action") { - return expression_ptr(new rate_action_function(args, ai_)); - } else if(fn == "recall") { - return expression_ptr(new recall_function(args)); - } else if(fn == "recruit") { - return expression_ptr(new recruit_function(args)); - } else if(fn == "safe_call") { - return expression_ptr(new safe_call_function(args)); - } else if(fn == "get_unit_type") { - return expression_ptr(new get_unit_type_function(args)); - } else if(fn == "is_avoided_location") { - return expression_ptr(new is_avoided_location_function(args,ai_)); - } else if(fn == "is_village") { - return expression_ptr(new is_village_function(args)); - } else if(fn == "is_unowned_village") { - return expression_ptr(new is_unowned_village_function(args, ai_)); - } else if(fn == "unit_at") { - return expression_ptr(new unit_at_function(args, ai_)); - } else if(fn == "unit_moves") { - return expression_ptr(new unit_moves_function(args, ai_)); - } else if(fn == "set_var") { - return expression_ptr(new set_var_function(args)); - } else if(fn == "set_unit_var") { - return expression_ptr(new set_unit_var_function(args)); - } else if(fn == "fallback") { - return expression_ptr(new fallback_function(args)); - } else if(fn == "units_can_reach") { - return expression_ptr(new units_can_reach_function(args, ai_)); - } else if(fn == "debug_label") { - return expression_ptr(new debug_label_function(args, ai_)); - } else if(fn == "defense_on") { - return expression_ptr(new defense_on_function(args, ai_)); - } else if(fn == "chance_to_hit") { - return expression_ptr(new chance_to_hit_function(args, ai_)); - } else if(fn == "movement_cost") { - return expression_ptr(new movement_cost_function(args, ai_)); - } else if(fn == "max_possible_damage") { - return expression_ptr(new max_possible_damage_function(args, ai_)); - } else if(fn == "max_possible_damage_with_retaliation") { - return expression_ptr(new max_possible_damage_with_retaliation_function(args, ai_)); - } else if(fn == "next_hop") { - return expression_ptr(new next_hop_function(args, ai_)); - } else if(fn == "adjacent_locs") { - return expression_ptr(new adjacent_locs_function(args, ai_)); - } else if(fn == "locations_in_radius") { - return expression_ptr(new locations_in_radius_function(args, ai_)); - } else if(fn == "castle_locs") { - return expression_ptr(new castle_locs_function(args, ai_)); - } else if(fn == "timeofday_modifier") { - return expression_ptr(new timeofday_modifier_function(args, ai_)); - } else if(fn == "distance_to_nearest_unowned_village") { - return expression_ptr(new distance_to_nearest_unowned_village_function(args, ai_)); - } else if(fn == "shortest_path") { - return expression_ptr(new shortest_path_function(args, ai_)); - } else if(fn == "simplest_path") { - return expression_ptr(new simplest_path_function(args, ai_)); - } else if(fn == "nearest_keep") { - return expression_ptr(new nearest_keep_function(args, ai_)); - } else if(fn == "suitable_keep") { - return expression_ptr(new suitable_keep_function(args, ai_)); - } else if(fn == "nearest_loc") { - return expression_ptr(new nearest_loc_function(args, ai_)); - } else if(fn == "find_shroud") { - return expression_ptr(new find_shroud_function(args, ai_)); - } else if(fn == "close_enemies") { - return expression_ptr(new close_enemies_function(args, ai_)); - } else if(fn == "calculate_outcome") { - return expression_ptr(new calculate_outcome_function(args, ai_)); - } else if(fn == "run_file") { - return expression_ptr(new run_file_function(args, ai_)); - } else if(fn == "calculate_map_ownership") { - return expression_ptr(new calculate_map_ownership_function(args, ai_)); - } else { - return function_symbol_table::create_function(fn, args); - } +// First macro is for functions taking an additional formula_ai argument. +// Functions using the second macro could potentially be made core. +#define AI_FUNCTION(name) add_function(#name, formula_function_ptr( \ + new ai_formula_function(#name, ai))) +#define FUNCTION(name) add_function(#name, formula_function_ptr( \ + new builtin_formula_function(#name))) + +ai_function_symbol_table::ai_function_symbol_table(ai::formula_ai& ai) { + FUNCTION(outcomes); + //AI_FUNCTION(evaluate_for_position); + FUNCTION(move); + FUNCTION(move_partial); + FUNCTION(attack); + AI_FUNCTION(rate_action); + FUNCTION(recall); + FUNCTION(recruit); + FUNCTION(safe_call); + FUNCTION(get_unit_type); + AI_FUNCTION(is_avoided_location); + FUNCTION(is_village); + AI_FUNCTION(is_unowned_village); + FUNCTION(unit_at); + AI_FUNCTION(unit_moves); + FUNCTION(set_var); + FUNCTION(set_unit_var); + FUNCTION(fallback); + FUNCTION(units_can_reach); + AI_FUNCTION(debug_label); + FUNCTION(defense_on); + FUNCTION(chance_to_hit); + FUNCTION(movement_cost); + FUNCTION(max_possible_damage); + FUNCTION(max_possible_damage_with_retaliation); + AI_FUNCTION(next_hop); + FUNCTION(adjacent_locs); + FUNCTION(locations_in_radius); + FUNCTION(castle_locs); + FUNCTION(timeofday_modifier); + AI_FUNCTION(distance_to_nearest_unowned_village); + AI_FUNCTION(shortest_path); + AI_FUNCTION(simplest_path); + AI_FUNCTION(nearest_keep); + AI_FUNCTION(suitable_keep); + FUNCTION(nearest_loc); + AI_FUNCTION(find_shroud); + AI_FUNCTION(close_enemies); + FUNCTION(calculate_outcome); + AI_FUNCTION(run_file); + AI_FUNCTION(calculate_map_ownership); } +#undef FUNCTION } diff --git a/src/ai/formula/function_table.hpp b/src/ai/formula/function_table.hpp index 55dfbc2d3a22..3ad960d83322 100644 --- a/src/ai/formula/function_table.hpp +++ b/src/ai/formula/function_table.hpp @@ -28,17 +28,7 @@ namespace game_logic { class ai_function_symbol_table : public function_symbol_table { public: - explicit ai_function_symbol_table(ai::formula_ai& ai) : - ai_(ai), - move_functions() - {} - - expression_ptr create_function(const std::string& fn, - const std::vector& args) const; - -private: - ai::formula_ai& ai_; - std::set move_functions; + explicit ai_function_symbol_table(ai::formula_ai& ai); }; } diff --git a/src/formula/formula.cpp b/src/formula/formula.cpp index 8d8a9133477c..ce0fb3438bbb 100644 --- a/src/formula/formula.cpp +++ b/src/formula/formula.cpp @@ -1019,10 +1019,11 @@ expression_ptr parse_expression(const token* i1, const token* i2, function_symbo if(symbols == nullptr) { throw formula_error("Function symbol table required but not present", "",*i1->filename, i1->line_number); } - symbols->add_formula_function(formula_name, + symbols->add_function(formula_name, + formula_function_ptr(new user_formula_function(formula_name, const_formula_ptr(new formula(beg, i1, symbols)), formula::create_optional_formula(precond, symbols), - args); + args))); if((i1 == i2) || (i1 == (i2-1))) { return expression_ptr(new function_list_expression(symbols)); } @@ -1347,6 +1348,7 @@ formula::formula(const std::string& str, function_symbol_table* symbols) : expr_ = expression_ptr(new null_expression()); } } + formula::formula(const token* i1, const token* i2, function_symbol_table* symbols) : expr_(), str_(), diff --git a/src/formula/function.cpp b/src/formula/function.cpp index ca5d5bec27a4..a8f69f4d677e 100644 --- a/src/formula/function.cpp +++ b/src/formula/function.cpp @@ -1447,21 +1447,21 @@ variant formula_function_expression::execute(const formula_callable& variables, return res; } -function_expression_ptr formula_function::generate_function_expression(const std::vector& args) const +function_expression_ptr user_formula_function::generate_function_expression(const std::vector& args) const { return function_expression_ptr(new formula_function_expression(name_, args, formula_, precondition_, args_)); } -void function_symbol_table::add_formula_function(const std::string& name, const_formula_ptr formula, const_formula_ptr precondition, const std::vector& args) +void function_symbol_table::add_function(const std::string& name, formula_function_ptr fcn) { - custom_formulas_[name] = formula_function(name, formula, precondition, args); + custom_formulas_[name] = fcn; } expression_ptr function_symbol_table::create_function(const std::string& fn, const std::vector& args) const { - const std::map::const_iterator i = custom_formulas_.find(fn); + const functions_map::const_iterator i = custom_formulas_.find(fn); if(i != custom_formulas_.end()) { - return i->second.generate_function_expression(args); + return i->second->generate_function_expression(args); } return expression_ptr(); @@ -1470,7 +1470,7 @@ expression_ptr function_symbol_table::create_function(const std::string& fn, con std::vector function_symbol_table::get_function_names() const { std::vector res; - for(std::map::const_iterator iter = custom_formulas_.begin(); iter != custom_formulas_.end(); ++iter ) { + for(functions_map::const_iterator iter = custom_formulas_.begin(); iter != custom_formulas_.end(); ++iter ) { res.push_back((*iter).first); } return res; @@ -1478,45 +1478,12 @@ std::vector function_symbol_table::get_function_names() const namespace { -class base_function_creator { -public: - virtual expression_ptr create_function(const std::vector& args) const = 0; - virtual ~base_function_creator() {} -}; - -template -class function_creator : public base_function_creator { -public: - virtual expression_ptr create_function(const std::vector& args) const { - return expression_ptr(new T(args)); - } - virtual ~function_creator() {} -}; - -typedef std::map functions_map; - -// Takes ownership of the pointers, deleting them at program termination to -// suppress valgrind false positives -struct functions_map_manager { - functions_map map_; - ~functions_map_manager() { - for (functions_map::value_type & v : map_) { - delete(v.second); - } - } -}; - -functions_map& get_functions_map() { - - static functions_map_manager map_man; - functions_map & functions_table = map_man.map_; - -#ifdef HAVE_VISUAL_LEAK_DETECTOR - VLDDisable(); -#endif +function_symbol_table& get_functions_map() { + static function_symbol_table functions_table; if(functions_table.empty()) { -#define FUNCTION(name) functions_table[#name] = new function_creator(); +#define FUNCTION(name) functions_table.add_function(#name, \ + formula_function_ptr(new builtin_formula_function(#name))) FUNCTION(debug); FUNCTION(dir); FUNCTION(if); @@ -1525,7 +1492,7 @@ functions_map& get_functions_map() { FUNCTION(min); FUNCTION(max); FUNCTION(choose); - FUNCTION(debug_float); + FUNCTION(debug_float); FUNCTION(debug_print); FUNCTION(debug_profile); FUNCTION(wave); @@ -1596,26 +1563,18 @@ expression_ptr create_function(const std::string& fn, return res; } } - - //DBG_NG << "FN: '" << fn << "' " << fn.size() << "\n"; - - functions_map::const_iterator i = get_functions_map().find(fn); - if(i == get_functions_map().end()) { - throw formula_error("Unknow function: " + fn, "", "", 0); + + expression_ptr res(get_functions_map().create_function(fn, args)); + if(!res) { + throw formula_error("Unknown function: " + fn, "", "", 0); } - return i->second->create_function(args); + return res; } std::vector builtin_function_names() { - std::vector res; - const functions_map& m = get_functions_map(); - for(functions_map::const_iterator i = m.begin(); i != m.end(); ++i) { - res.push_back(i->first); - } - - return res; + return get_functions_map().get_function_names(); } } diff --git a/src/formula/function.hpp b/src/formula/function.hpp index fcf346414c70..32e407e20783 100644 --- a/src/formula/function.hpp +++ b/src/formula/function.hpp @@ -96,38 +96,48 @@ class formula_function_expression : public function_expression { typedef boost::shared_ptr function_expression_ptr; class formula_function { +protected: std::string name_; +public: + formula_function(const std::string name) : name_(name) {} + virtual function_expression_ptr generate_function_expression(const std::vector& args) const = 0; + virtual ~formula_function() {} +}; + +class user_formula_function : public formula_function { const_formula_ptr formula_; const_formula_ptr precondition_; std::vector args_; public: - formula_function() : - name_(), - formula_(), - precondition_(), - args_() - { - } - - formula_function(const std::string& name, const_formula_ptr formula, const_formula_ptr precondition, const std::vector& args) : name_(name), formula_(formula), precondition_(precondition), args_(args) + user_formula_function(const std::string& name, const_formula_ptr formula, const_formula_ptr precondition, const std::vector& args) + : formula_function(name) + , formula_(formula) + , precondition_(precondition) + , args_(args) {} function_expression_ptr generate_function_expression(const std::vector& args) const; }; -class function_symbol_table { - std::map custom_formulas_; +template +class builtin_formula_function : public formula_function { public: - function_symbol_table() : - custom_formulas_() - { + builtin_formula_function(const std::string& name) : formula_function(name) {} + function_expression_ptr generate_function_expression(const std::vector& args) const { + return function_expression_ptr(new T(args)); } +}; - virtual ~function_symbol_table() {} - virtual void add_formula_function(const std::string& name, const_formula_ptr formula, const_formula_ptr precondition, const std::vector& args); - virtual expression_ptr create_function(const std::string& fn, - const std::vector& args) const; +typedef boost::shared_ptr formula_function_ptr; +typedef std::map functions_map; + +class function_symbol_table { + functions_map custom_formulas_; +public: + void add_function(const std::string& name, formula_function_ptr fcn); + expression_ptr create_function(const std::string& fn, const std::vector& args) const; std::vector get_function_names() const; + bool empty() {return custom_formulas_.empty();} }; expression_ptr create_function(const std::string& fn, From b503b6cfe107720f9f05e497cb9158e526e3cbf8 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 19 Mar 2016 00:37:29 -0400 Subject: [PATCH 134/240] Lua formula bridge now recognizes location objects --- src/scripting/lua_formula_bridge.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/src/scripting/lua_formula_bridge.cpp b/src/scripting/lua_formula_bridge.cpp index 9507236dea81..477570399132 100644 --- a/src/scripting/lua_formula_bridge.cpp +++ b/src/scripting/lua_formula_bridge.cpp @@ -136,7 +136,7 @@ void luaW_pushfaivariant(lua_State* L, variant val) { lua_settable(L, -3); } } else if(val.is_callable()) { - // First try a few special cases (well, currently, only one) + // First try a few special cases if(unit_callable* u_ref = val.try_convert()) { const unit& u = u_ref->get_unit(); unit_map::iterator un_it = resources::units->find(u.get_location()); @@ -148,6 +148,8 @@ void luaW_pushfaivariant(lua_State* L, variant val) { lua_pushlightuserdata(L, getunitKey); lua_rawget(L, LUA_REGISTRYINDEX); lua_setmetatable(L, -2); + } else if(location_callable* loc_ref = val.try_convert()) { + luaW_pushlocation(L, loc_ref->loc()); } else { // If those fail, convert generically to a map const formula_callable* obj = val.as_callable(); @@ -181,12 +183,15 @@ variant luaW_tofaivariant(lua_State* L, int i) { case LUA_TUSERDATA: static t_string tstr; static vconfig vcfg = vconfig::unconstructed_vconfig(); + static map_location loc; if(luaW_totstring(L, i, tstr)) { return variant(tstr.str()); } else if(luaW_tovconfig(L, i, vcfg)) { return variant(new config_callable(vcfg.get_parsed_config())); } else if(unit* u = luaW_tounit(L, i)) { return variant(new unit_callable(*u)); + } else if(luaW_tolocation(L, i, loc)) { + return variant(new location_callable(loc)); } break; } From 5c9923dabaf2806e0ba45708a958f64f94f9a316 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 08:27:15 -0400 Subject: [PATCH 135/240] Formula engine: Add pair() function --- changelog | 4 ++++ src/formula/function.cpp | 43 +++++++++++++++++++++++++++++++--------- src/formula/function.hpp | 2 ++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/changelog b/changelog index 913b712b57ee..57f61852ffe5 100644 --- a/changelog +++ b/changelog @@ -214,6 +214,7 @@ Version 1.13.4+dev: This counts backwards from the specified offset A size of -1 is the same as 1. * if() can take two arguments; returns null if the condition is false + * tolist() will now invert the effect of tomap() * debug_print() now shows in console if debug mode is on * New core functions: * Trig functions tan, acos, asin, atan have been added. (Sin and cos @@ -230,6 +231,9 @@ Version 1.13.4+dev: * replace() replaces a sequence within a string * type() function checks the type of a formula result * distance_between() - this was promoted from FormulaAI to core + * pair() function that produces a key-value pair suitable for + passing to tomap() - this also means key-value pairs are now + serializable (relevant in FormulaAI) * Bugfixes: * Dice operator is now synced (where possible) * Modulus (%) operator now works on decimal numbers diff --git a/src/formula/function.cpp b/src/formula/function.cpp index a8f69f4d677e..565fac7252fc 100644 --- a/src/formula/function.cpp +++ b/src/formula/function.cpp @@ -406,11 +406,16 @@ class tomap_function : public function_expression { } else { for(variant_iterator it = var_1.begin(); it != var_1.end(); ++it) { - std::map::iterator map_it = tmp.find( *it ); - if (map_it == tmp.end()) - tmp[ *it ] = variant( 1 ); - else - map_it->second = variant(map_it->second.as_int() + 1); + if (key_value_pair* kv = (*it).try_convert()) + tmp[kv->query_value("key")] = kv->query_value("value"); + else { + std::map::iterator map_it = tmp.find( *it ); + if (map_it == tmp.end()) { + tmp[*it] = variant(1); + } else { + map_it->second = variant(map_it->second.as_int() + 1); + } + } } } @@ -1355,6 +1360,20 @@ class loc_function : public function_expression { } }; +class pair_function : public function_expression { +public: + explicit pair_function(const args_list& args) + : function_expression("pair", args, 2, 2) + {} +private: + variant execute(const formula_callable& variables, formula_debugger *fdb) const { + return variant(new key_value_pair( + args()[0]->evaluate(variables,add_debug_info(fdb,0,"pair:key")), + args()[1]->evaluate(variables,add_debug_info(fdb,1,"pair_value")) + )); + } +}; + class distance_between_function : public function_expression { public: explicit distance_between_function(const args_list& args) @@ -1402,6 +1421,15 @@ void key_value_pair::get_inputs(std::vector* inputs) inputs->push_back(game_logic::formula_input("value", game_logic::FORMULA_READ_ONLY)); } + +void key_value_pair::serialize_to_string(std::string& str) const { + str += "pair("; + key_.serialize_to_string(str); + str += ","; + value_.serialize_to_string(str); + str += ")"; +} + formula_function_expression::formula_function_expression(const std::string& name, const args_list& args, const_formula_ptr formula, const_formula_ptr precondition, const std::vector& arg_names) : function_expression(name, args, arg_names.size(), arg_names.size()), formula_(formula), precondition_(precondition), arg_names_(arg_names), star_arg_(-1) @@ -1516,6 +1544,7 @@ function_symbol_table& get_functions_map() { FUNCTION(round); FUNCTION(as_decimal); FUNCTION(refcount); + FUNCTION(pair); FUNCTION(loc); FUNCTION(distance_between); FUNCTION(index_of); @@ -1544,10 +1573,6 @@ function_symbol_table& get_functions_map() { #undef FUNCTION } -#ifdef HAVE_VISUAL_LEAK_DETECTOR - VLDEnable(); -#endif - return functions_table; } diff --git a/src/formula/function.hpp b/src/formula/function.hpp index 32e407e20783..4d72351768f6 100644 --- a/src/formula/function.hpp +++ b/src/formula/function.hpp @@ -80,6 +80,8 @@ class key_value_pair : public formula_callable { void get_inputs(std::vector* inputs) const; public: explicit key_value_pair(const variant& key, const variant& value) : key_(key), value_(value) {} + + void serialize_to_string(std::string& str) const; }; class formula_function_expression : public function_expression { From 0688e6df8f9ecf3c589da916fbd2e41b952f146d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 09:30:17 -0400 Subject: [PATCH 136/240] Formula engine: Expose WML unit/side variables --- changelog | 5 +++++ src/formula/callable_objects.cpp | 3 +++ src/formula/callable_objects.hpp | 3 +++ 3 files changed, 11 insertions(+) diff --git a/changelog b/changelog index 57f61852ffe5..da8f1a9f38cc 100644 --- a/changelog +++ b/changelog @@ -179,6 +179,11 @@ Version 1.13.4+dev: * Nearly all unit type, side, weapon, and terrain attributes available to Lua code are now also exposed to WFL. The exceptions are mainly translatable strings. + * Unit and side WML variables are now accessible under "wml_vars". + Since WML variables don't easily translate to formula variables, the + special attributes __all_children, __children, and __attributes provide + specialized views of the variables config as a list, string-list map, + and string-value map, respectively. * The 'special' attribute of weapons was renamed to 'specials', and it now contains the special IDs rather than their translateable names. * New syntax features: diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 9d18372d047e..83d9bbe3f574 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -309,6 +309,8 @@ variant unit_callable::get_value(const std::string& key) const } else { return variant(); } + } else if(key == "wml_vars") { + return variant(new config_callable(u_.variables())); } else if(key == "n" || key == "s" || key == "ne" || key == "se" || key == "nw" || key == "sw" || key == "lawful" || key == "neutral" || key == "chaotic" || key == "liminal" || key == "male" || key == "female") { return variant(key); } else { @@ -357,6 +359,7 @@ void unit_callable::get_inputs(std::vector* inputs) c inputs->push_back(game_logic::formula_input("alignment", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("facing", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("vars", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("wml_vars", FORMULA_READ_ONLY)); } int unit_callable::do_compare(const formula_callable* callable) const diff --git a/src/formula/callable_objects.hpp b/src/formula/callable_objects.hpp index 40854cd6d068..3d6766df4389 100644 --- a/src/formula/callable_objects.hpp +++ b/src/formula/callable_objects.hpp @@ -224,6 +224,7 @@ CALLABLE_WRAPPER_INPUT(carryover_bonus) CALLABLE_WRAPPER_INPUT(carryover_percentage) CALLABLE_WRAPPER_INPUT(carryover_add) CALLABLE_WRAPPER_INPUT(recruit) +CALLABLE_WRAPPER_INPUT(wml_vars) CALLABLE_WRAPPER_INPUT_END CALLABLE_WRAPPER_FN(side) CALLABLE_WRAPPER_FN2(id, save_id) @@ -258,6 +259,8 @@ CALLABLE_WRAPPER_FN(carryover_add) result.push_back(variant(*it)); } return variant(&result); + } else if(key == "wml_vars") { + return variant(new config_callable(object_.variables())); } else CALLABLE_WRAPPER_END From 9fc19a9fbde34fcf90cd2efe44e7d0de68781cd2 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 01:07:52 +1100 Subject: [PATCH 137/240] Convert two remaining cases of BOOST_FOREACH to range-for --- src/tracer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/tracer.cpp b/src/tracer.cpp index 034e0699c6cd..715e2a6244e8 100644 --- a/src/tracer.cpp +++ b/src/tracer.cpp @@ -33,7 +33,7 @@ ttracer::tprint::~tprint() typedef std::pair, int> thack; size_t maximum_length = 0; - BOOST_FOREACH(const thack& counter, tracer->counters) { + for(const thack& counter : tracer->counters) { maximum_length = std::max( maximum_length , counter.first.second.length()); @@ -43,7 +43,7 @@ ttracer::tprint::~tprint() std::ios_base::left , std::ios_base::adjustfield); - BOOST_FOREACH(const thack& counter, tracer->counters) { + for(const thack& counter : tracer->counters) { std::cerr << "Marker: " << std::left << std::setw(maximum_length) << counter.first.second From 20b07c63791c1c1add1ed2b9655808739a4a12f6 Mon Sep 17 00:00:00 2001 From: mattsc Date: Sat, 2 Apr 2016 07:54:52 -0700 Subject: [PATCH 138/240] Micro AIs: internal changes to AI and CA ID handling This is needed to fix some corner cases of multiple Micro AI changes during a scenario, such as for the bats in the Goto test scenario. --- data/ai/micro_ais/micro_ai_helper.lua | 62 ++++++++++++++++----------- data/ai/micro_ais/scenarios/goto.cfg | 3 ++ 2 files changed, 40 insertions(+), 25 deletions(-) diff --git a/data/ai/micro_ais/micro_ai_helper.lua b/data/ai/micro_ais/micro_ai_helper.lua index 9391f63a3a47..2e5a747b691c 100644 --- a/data/ai/micro_ais/micro_ai_helper.lua +++ b/data/ai/micro_ais/micro_ai_helper.lua @@ -6,20 +6,33 @@ local MAIUV = wesnoth.require "ai/micro_ais/micro_ai_unit_variables.lua" local micro_ai_helper = {} -function micro_ai_helper.add_CAs(side, CA_parms, CA_cfg) +function micro_ai_helper.add_CAs(side, ca_id_core, CA_parms, CA_cfg) -- Add the candidate actions defined in @CA_parms to the AI of @side - -- @CA_parms is an array of tables, one for each CA to be added (CA setup parameters) - -- and also contains one key: ai_id - -- @CA_cfg is a table with the parameters passed to the eval/exec functions + -- @ca_id_core: ca_id= key from the [micro_ai] tag + -- @CA_parms: array of tables, one for each CA to be added (CA setup parameters) + -- Also contains one key: ai_id + -- @CA_cfg: table with the parameters passed to the eval/exec functions -- -- Required keys for each table of @CA_parms: -- - ca_id: is used for CA id/name -- - location: the path+file name for the external CA file -- - score: the evaluation score - -- We need to make sure that the id/name of each CA are unique. - -- We do this by checking if CAs starting with ai_id exist already - -- If yes, we add numbers to the end of ai_id until we find an id that does not exist yet + -- About ai_id, ca_id_core and ca_id: + -- ai_id: If the AI stores information in the [data] variable, we need to + -- ensure that it is uniquely attributed to this AI, and not to a separate + -- AI of the same type. ai_id is used for this and must therefore be unique. + -- We ensure this by checking if CAs or [data][micro_ai] tags using the + -- default ai_id value exist already and if so, by adding numbers to the end + -- until we find an id that is not used yet. + -- ca_id_core: This is used as base for the id= and name= keys of the + -- [candidate_action] tags. If [micro_ai]ca_id= is given, we use it as is + -- without checking if an AI with this id already exists. This is required in + -- order to ensure that removal with action=delete is possible and it is the + -- responsibility of the user to ensure uniqueness. If [micro_ai]ca_id= is not + -- given, use ai_id for ca_id_core, which also makes ids unique for this case. + -- ca_id: This is specific to the individual CAs of an AI and is added to + -- ca_id_core for the names and ids of each CA. local ai_id, id_found = CA_parms.ai_id, true @@ -59,9 +72,12 @@ function micro_ai_helper.add_CAs(side, CA_parms, CA_cfg) n = n + 1 end + -- For CA ids and names, use value of [micro_ai]ca_id= if given, ai_id otherwise + ca_id_core = ca_id_core or ai_id + -- Now add the CAs for _,parms in ipairs(CA_parms) do - local ca_id = ai_id .. '_' .. parms.ca_id + local ca_id = ca_id_core .. '_' .. parms.ca_id -- Always pass the ai_id and ca_score to the eval/exec functions CA_cfg.ai_id = ai_id @@ -86,14 +102,18 @@ function micro_ai_helper.add_CAs(side, CA_parms, CA_cfg) end end -function micro_ai_helper.delete_CAs(side, CA_parms) +function micro_ai_helper.delete_CAs(side, ca_id_core, CA_parms) -- Delete the candidate actions defined in @CA_parms from the AI of @side - -- @CA_parms is an array of tables, one for each CA to be removed - -- We can simply pass the one used for add_CAs(), although only the - -- CA_parms.ca_id field is needed + -- @ca_id_core: ca_id= key from the [micro_ai] tag + -- @CA_parms: array of tables, one for each CA to be removed + -- We can simply pass the one used for add_CAs(), although only the + -- CA_parms.ca_id field is needed + + -- For CA ids, use value of [micro_ai]ca_id= if given, ai_id otherwise + ca_id_core = ca_id_core or CA_parms.ai_id for _,parms in ipairs(CA_parms) do - local ca_id = CA_parms.ai_id .. '_' .. parms.ca_id + local ca_id = ca_id_core .. '_' .. parms.ca_id W.modify_ai { side = side, @@ -156,16 +176,8 @@ function micro_ai_helper.delete_aspects(side, aspect_parms) end function micro_ai_helper.micro_ai_setup(cfg, CA_parms, required_keys, optional_keys) - -- If cfg.ca_id is set, it gets used as the ai_id= key - -- This allows for selective removal of CAs - -- Note: the ca_id key of the [micro_ai] tag should really be renamed to ai_id, - -- but that would mean breaking backward compatibility, so we'll just deal with it internally instead - - CA_parms.ai_id = cfg.ca_id or CA_parms.ai_id - - -- If action=delete, we do that and are done if (cfg.action == 'delete') then - micro_ai_helper.delete_CAs(cfg.side, CA_parms) + micro_ai_helper.delete_CAs(cfg.side, cfg.ca_id, CA_parms) return end @@ -203,10 +215,10 @@ function micro_ai_helper.micro_ai_setup(cfg, CA_parms, required_keys, optional_k end -- Finally, set up the candidate actions themselves - if (cfg.action == 'add') then micro_ai_helper.add_CAs(cfg.side, CA_parms, CA_cfg) end + if (cfg.action == 'add') then micro_ai_helper.add_CAs(cfg.side, cfg.ca_id, CA_parms, CA_cfg) end if (cfg.action == 'change') then - micro_ai_helper.delete_CAs(cfg.side, CA_parms, cfg.id) - micro_ai_helper.add_CAs(cfg.side, CA_parms, CA_cfg) + micro_ai_helper.delete_CAs(cfg.side, cfg.ca_id, CA_parms) + micro_ai_helper.add_CAs(cfg.side, cfg.ca_id, CA_parms, CA_cfg) end end diff --git a/data/ai/micro_ais/scenarios/goto.cfg b/data/ai/micro_ais/scenarios/goto.cfg index e549d7097af9..c955ac888ee1 100644 --- a/data/ai/micro_ais/scenarios/goto.cfg +++ b/data/ai/micro_ais/scenarios/goto.cfg @@ -298,6 +298,7 @@ side=7 ai_type=goto action=add + ca_id=bats [filter_location] x=1,1,44,44 @@ -719,6 +720,7 @@ Note: The messengers are controlled by Goto Micro AI definitions that differ by side=7 ai_type=goto action=change + ca_id=bats [filter_location] x,y=35,13 @@ -759,6 +761,7 @@ Note: The messengers are controlled by Goto Micro AI definitions that differ by side=7 ai_type=goto action=change + ca_id=bats [filter_location] x=1,1,44,44 From 7c37ad57bd5858bc15a10d1e9f0deaa57a22467a Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 16 Mar 2016 17:32:27 -0400 Subject: [PATCH 139/240] Two new [message] features - ~LEFT() does the opposite of ~RIGHT(), but takes higher priority; use it to force an image to the left that's normally on the right (eg female silver mage) - image=~RIGHT() means "use normal portrait, but on the right" --- data/core/units/humans/Mage_Silver.cfg | 2 +- data/lua/wml/message.lua | 34 +++++++++++++++++--------- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/data/core/units/humans/Mage_Silver.cfg b/data/core/units/humans/Mage_Silver.cfg index cd5a0c668ca7..1fefde626fb4 100644 --- a/data/core/units/humans/Mage_Silver.cfg +++ b/data/core/units/humans/Mage_Silver.cfg @@ -161,7 +161,7 @@ Silver magi are often more physically adept than other magi, and their skills ar name= _ "female^Silver Mage" gender=female image="units/human-magi/silver-mage+female.png" - profile="portraits/humans/mage-silver+female.png" + profile="portraits/humans/mage-silver+female.png~LEFT()" die_sound={SOUND_LIST:HUMAN_FEMALE_DIE} {DEFENSE_ANIM "units/human-magi/silver-mage+female-defend.png" "units/human-magi/silver-mage+female.png" {SOUND_LIST:HUMAN_FEMALE_HIT} } [attack_anim] diff --git a/data/lua/wml/message.lua b/data/lua/wml/message.lua index 01c8f61137ae..8f5b3629bca9 100644 --- a/data/lua/wml/message.lua +++ b/data/lua/wml/message.lua @@ -13,16 +13,36 @@ end local function get_image(cfg, speaker) local image = cfg.image + local left_side = true + + if image == "~RIGHT()" then + image = nil + left_side = false + end if speaker and (image == nil or image == "") then image = speaker.portrait end + if image:find("~RIGHT%(%)") then + left_side = false + -- The percent signs escape the parentheses for a literal match + image = image:gsub("~RIGHT%(%)", "") + end + + if image:find("~LEFT%(%)") then + -- This currently overrides ~RIGHT() + -- Use if a portrait defaults to ~RIGHT(), + -- or in [unit_type] to force it to left. + left_side = true + image = image:gsub("~LEFT%(%)", "") + end + if image == "none" or image == nil then - return "" + return "", true end - return image + return image, left_side end local function get_caption(cfg, speaker) @@ -53,17 +73,9 @@ local function get_speaker(cfg) end local function message_user_choice(cfg, speaker, options, text_input) - local image = get_image(cfg, speaker) + local image, left_side = get_image(cfg, speaker) local caption = get_caption(cfg, speaker) - local left_side = true - -- If this doesn't work, might need tostring() - if image:find("~RIGHT()") then - left_side = false - -- The percent signs escape the parentheses for a literal match - image = image:gsub("~RIGHT%(%)", "") - end - local msg_cfg = { left_side = left_side, title = caption, From ca512b20c245da41d3d6e61344ebd45028b30988 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 16:01:34 -0400 Subject: [PATCH 140/240] Fix several more cases of missed BOOST_FOREACH and FOREACH --- src/campaign_server/addon_utils.cpp | 6 +++--- src/campaign_server/blacklist.cpp | 4 ++-- src/campaign_server/campaign_server.cpp | 10 +++++----- src/gui/dialogs/multiplayer/mp_create_game.cpp | 2 +- src/gui/widgets/debug.cpp | 4 ++-- src/tests/create_images.cpp | 4 ++-- src/tools/exploder_cutter.cpp | 4 ++-- src/tools/sdl2/sdl2.cpp | 5 +++-- src/wesmage/filter.cpp | 2 +- src/wesmage/options.cpp | 4 ++-- src/wesmage/wesmage.cpp | 2 +- 11 files changed, 24 insertions(+), 23 deletions(-) diff --git a/src/campaign_server/addon_utils.cpp b/src/campaign_server/addon_utils.cpp index 082584d857fc..1ab5757ea18f 100644 --- a/src/campaign_server/addon_utils.cpp +++ b/src/campaign_server/addon_utils.cpp @@ -42,7 +42,7 @@ std::string fast_interpolate_variables_into_string(const std::string &str, const std::string res = str; if(symbols) { - BOOST_FOREACH(const plain_string_map::value_type& sym, *symbols) { + for(const plain_string_map::value_type& sym : *symbols) { res = utils::replace(res, "$" + sym.first, sym.second); } } @@ -68,7 +68,7 @@ std::string format_addon_feedback_url(const std::string& format, const config& p // Percent-encode parameter values for URL interpolation. This is // VERY important since otherwise people could e.g. alter query // strings from the format string. - BOOST_FOREACH(const config::attribute& a, attrs) { + for(const config::attribute& a : attrs) { escaped[a.first] = utils::urlencode(a.second.str()); } @@ -92,7 +92,7 @@ std::string format_addon_feedback_url(const std::string& format, const config& p void find_translations(const config& base_dir, config& addon) { - BOOST_FOREACH(const config &dir, base_dir.child_range("dir")) + for(const config &dir : base_dir.child_range("dir")) { if(dir["name"] == "LC_MESSAGES") { addon.add_child("translation")["language"] = base_dir["name"]; diff --git a/src/campaign_server/blacklist.cpp b/src/campaign_server/blacklist.cpp index a01be4b592c1..2b0a5896968e 100644 --- a/src/campaign_server/blacklist.cpp +++ b/src/campaign_server/blacklist.cpp @@ -94,7 +94,7 @@ bool blacklist::is_in_globlist(const std::string& str, const blacklist::globlist if (!str.empty()) { const std::string& lc_str = utf8::lowercase(str); - BOOST_FOREACH(const std::string& glob, glist) + for(const std::string& glob : glist) { const std::string& lc_glob = utf8::lowercase(glob); if (utils::wildcard_string_match(lc_str, lc_glob)) { @@ -111,7 +111,7 @@ bool blacklist::is_in_ip_masklist(const std::string& ip, const blacklist::globli { if (!ip.empty()) { - BOOST_FOREACH(const std::string& ip_mask, mlist) + for(const std::string& ip_mask : mlist) { if (ip_matches(ip, ip_mask)) { LOG_BL << "Blacklisted IP found: " << ip << " (" << ip_mask << ")\n"; diff --git a/src/campaign_server/campaign_server.cpp b/src/campaign_server/campaign_server.cpp index 9adcd5994568..751ffc2e081c 100644 --- a/src/campaign_server/campaign_server.cpp +++ b/src/campaign_server/campaign_server.cpp @@ -162,7 +162,7 @@ server::server(const std::string& cfg_file, size_t min_threads, size_t max_threa // Ensure all campaigns to use secure hash passphrase storage if(!read_only_) { - BOOST_FOREACH(config& campaign, campaigns().child_range("campaign")) { + for(config& campaign : campaigns().child_range("campaign")) { // Campaign already has a hashed password if (campaign["passphrase"].empty()) { continue; @@ -513,7 +513,7 @@ void server::handle_request_campaign_list(const server::request& req) const std::string& name = req.cfg["name"]; const std::string& lang = req.cfg["language"]; - BOOST_FOREACH(const config& i, campaigns().child_range("campaign")) + for(const config& i : campaigns().child_range("campaign")) { if(!name.empty() && name != i["name"]) { continue; @@ -531,7 +531,7 @@ void server::handle_request_campaign_list(const server::request& req) if(!lang.empty()) { bool found = false; - BOOST_FOREACH(const config& j, i.child_range("translation")) + for(const config& j : i.child_range("translation")) { if(j["language"] == lang) { found = true; @@ -547,7 +547,7 @@ void server::handle_request_campaign_list(const server::request& req) campaign_list.add_child("campaign", i); } - BOOST_FOREACH(config& j, campaign_list.child_range("campaign")) + for(config& j : campaign_list.child_range("campaign")) { j["passphrase"] = ""; j["passhash"] = ""; @@ -634,7 +634,7 @@ void server::handle_upload(const server::request& req) const std::string& lc_name = utf8::lowercase(name); passed_name_utf8_check = true; - BOOST_FOREACH(config& c, campaigns().child_range("campaign")) + for(config& c : campaigns().child_range("campaign")) { if(utf8::lowercase(c["name"]) == lc_name) { campaign = &c; diff --git a/src/gui/dialogs/multiplayer/mp_create_game.cpp b/src/gui/dialogs/multiplayer/mp_create_game.cpp index b9a7331bdcde..b3f0f3a1d2bb 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.cpp @@ -103,7 +103,7 @@ void tmp_create_game::pre_show(twindow& window) filesystem::get_files_in_dir(filesystem::get_user_data_dir() + "/editor/maps", &maps, nullptr, filesystem::FILE_NAME_ONLY); - FOREACH(const AUTO& map, maps) { + for(const auto& map : maps) { std::map item; item.insert(std::make_pair("label", map)); list->add_row(item); diff --git a/src/gui/widgets/debug.cpp b/src/gui/widgets/debug.cpp index 50947836a932..b9a248815b75 100644 --- a/src/gui/widgets/debug.cpp +++ b/src/gui/widgets/debug.cpp @@ -122,7 +122,7 @@ void tdebug_layout_graph::set_level(const std::string& level) std::vector params = utils::split(level); - FOREACH(const AUTO & param, params) + for(const auto & param : params) { if(param == "all") { level_ = ALL; @@ -150,7 +150,7 @@ void tdebug_layout_graph::set_domain(const std::string& domain) std::vector params = utils::split(domain); - FOREACH(const AUTO & param, params) + for(const auto & param : params) { if(param == "all") { domain_ = ALL; diff --git a/src/tests/create_images.cpp b/src/tests/create_images.cpp index 0c855eaf2128..c826a2b1d5e1 100644 --- a/src/tests/create_images.cpp +++ b/src/tests/create_images.cpp @@ -128,7 +128,7 @@ main(int argc, char* argv[]) } } - BOOST_FOREACH(const tcreator& creator, creators) { + for(const tcreator& creator : creators) { if(!filesystem::make_directory(root + creator.first)) { std::cerr << ""; return EXIT_FAILURE; @@ -138,7 +138,7 @@ main(int argc, char* argv[]) try { const surface base_image = create_image_base(root + "/base.png"); - BOOST_FOREACH(const tcreator& creator, creators) { + for(const tcreator& creator : creators) { creator.second(base_image, root + creator.first); } diff --git a/src/tools/exploder_cutter.cpp b/src/tools/exploder_cutter.cpp index e9f81ea4bf50..cf6b92e8e8e8 100644 --- a/src/tools/exploder_cutter.cpp +++ b/src/tools/exploder_cutter.cpp @@ -47,7 +47,7 @@ const config cutter::load_config(const std::string &filename) void cutter::load_masks(const config& conf) { - BOOST_FOREACH(const config &m, conf.child_range("mask")) + for(const config &m : conf.child_range("mask")) { const std::string name = m["name"]; const std::string image = get_mask_dir() + "/" + std::string(m["image"]); @@ -93,7 +93,7 @@ cutter::surface_map cutter::cut_surface(surface surf, const config& conf) { surface_map res; - BOOST_FOREACH(const config &part, conf.child_range("part")) { + for(const config &part : conf.child_range("part")) { add_sub_image(surf, res, &part); } diff --git a/src/tools/sdl2/sdl2.cpp b/src/tools/sdl2/sdl2.cpp index e3ad2cb6a131..726b9735140f 100644 --- a/src/tools/sdl2/sdl2.cpp +++ b/src/tools/sdl2/sdl2.cpp @@ -28,6 +28,7 @@ #include #include +#include std::vector windows; @@ -93,7 +94,7 @@ static void draw_command_history(sdl::twindow& window, const std::deque& history) { unsigned offset = 535; - BOOST_REVERSE_FOREACH(const std::string & item, history) + for(const std::string & item : boost::adaptors::reverse(history)) { draw_text(window, item, 25, offset); offset -= 25; @@ -166,7 +167,7 @@ int main() dirty = false; } window.render(); - BOOST_FOREACH(sdl::twindow * window, windows) + for(sdl::twindow * window : windows) { if(window) { window->render(); diff --git a/src/wesmage/filter.cpp b/src/wesmage/filter.cpp index 4030e363ddc7..d4b2f1ea535c 100644 --- a/src/wesmage/filter.cpp +++ b/src/wesmage/filter.cpp @@ -241,7 +241,7 @@ filter_list() { std::vector result; typedef std::pair thack; - BOOST_FOREACH(const thack& filter, filters) { + for(const thack& filter : filters) { result.push_back(filter.second.description); } return result; diff --git a/src/wesmage/options.cpp b/src/wesmage/options.cpp index 20ee74ddc47b..d89b9d8efa1f 100644 --- a/src/wesmage/options.cpp +++ b/src/wesmage/options.cpp @@ -94,7 +94,7 @@ operator<<( , const tfilter_description& fd) { print_option(stream, fd.name, fd.description); - BOOST_FOREACH(const tfilter_description::tparameter& p, fd.parameters) { + for(const tfilter_description::tparameter& p : fd.parameters) { print_option( stream , " * " + p.name + " (" + p.type + ")" @@ -135,7 +135,7 @@ print_help(const int exit_status) "\n" "The following filters are currently implemented:\n" ; - BOOST_FOREACH(const tfilter_description& filter, filter_list()) { + for(const tfilter_description& filter : filter_list()) { std::cout << filter; } diff --git a/src/wesmage/wesmage.cpp b/src/wesmage/wesmage.cpp index 48261a6dafe7..f718bee5e7f6 100644 --- a/src/wesmage/wesmage.cpp +++ b/src/wesmage/wesmage.cpp @@ -81,7 +81,7 @@ main(int argc, char* argv[]) const clock_t begin = options.time ? get_begin_time() : 0; for(int i = 0; i < options.count; ++i) { - BOOST_FOREACH(const std::string& filter, options.filters) { + for(const std::string& filter : options.filters) { filter_apply(surfaces[i], filter); } } From b8441bba2437a12d9bd11d01a00488364c62009d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 16:05:28 -0400 Subject: [PATCH 141/240] Update scons and CMake --- src/CMakeLists.txt | 1 + src/SConscript | 1 + 2 files changed, 2 insertions(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index ce278839050e..ca40fc0c7c48 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -934,6 +934,7 @@ set(wesnoth-main_SRC scripting/lua_common.cpp scripting/lua_cpp_function.cpp scripting/lua_fileops.cpp + scripting/lua_formula_bridge.cpp scripting/lua_gui2.cpp scripting/lua_kernel_base.cpp scripting/lua_map_location_ops.cpp diff --git a/src/SConscript b/src/SConscript index c4d977a51966..d7bd2b41c1a1 100644 --- a/src/SConscript +++ b/src/SConscript @@ -511,6 +511,7 @@ wesnoth_sources = Split(""" scripting/lua_common.cpp scripting/lua_cpp_function.cpp scripting/lua_fileops.cpp + scripting/lua_formula_bridge.cpp scripting/lua_gui2.cpp scripting/lua_kernel_base.cpp scripting/lua_map_location_ops.cpp From 1cc86a14af0b46cac24ca662b2ed6ffbcf15f9f4 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Sun, 3 Apr 2016 00:55:42 +0200 Subject: [PATCH 142/240] simplify start_local_game_commandline This makes start_local_game_commandline use the same functions that are also used during normal gamestate inilisation in create_engine. This specially fixes recuitlists in games stated via -m which was broken since 09d40339168e322e4a1ab5dda3273db9ecfdb07b --- src/game_initialization/connect_engine.cpp | 10 ++- src/game_initialization/multiplayer.cpp | 93 +++++++--------------- 2 files changed, 35 insertions(+), 68 deletions(-) diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index 35047fda5d98..cd2819c587b5 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -489,10 +489,14 @@ void connect_engine::start_game_commandline( for (const mp_option& option : *cmdline_opts.multiplayer_side) { if (option.get<0>() == num) { - DBG_MP << "\tsetting side " << option.get<0>() << - "\tfaction: " << option.get<1>() << std::endl; + if (std::find_if(era_factions_.begin(), era_factions_.end(), [&option](const config* faction) { return (*faction)["id"] == option.get<1>(); }) != era_factions_.end()) { + DBG_MP << "\tsetting side " << option.get<0>() << "\tfaction: " << option.get<1>() << std::endl; - side->set_faction_commandline(option.get<1>()); + side->set_faction_commandline(option.get<1>()); + } + else { + ERR_MP << "failed to set side " << option.get<0>() << " to faction " << option.get<1>() << std::endl; + } } } } diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index 12f59e3b31ad..3978452fe9a2 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -14,6 +14,7 @@ #include "multiplayer.hpp" #include "addon/manager.hpp" // for get_installed_addons +#include "config_assign.hpp" #include "dialogs.hpp" #include "formula/string_utils.hpp" #include "game_preferences.hpp" @@ -802,74 +803,36 @@ void start_local_game_commandline(CVideo& video, const config& game_config, // None of the other parameters need to be set, as their creation values above are good enough for CL mode. // In particular, we do not want to use the preferences values. - // scope for config objects that will become invalid after reload - { - // Override era, faction (side) and scenario if set on the commandline - if (cmdline_opts.multiplayer_era) - parameters.mp_era = *cmdline_opts.multiplayer_era; - const config& era_cfg_preload = game_config.find_child("era", "id", parameters.mp_era); - if (!era_cfg_preload) { - std::cerr << "Could not find era '" << parameters.mp_era << "'\n"; - return; - } - - if (cmdline_opts.multiplayer_scenario) - parameters.name = *cmdline_opts.multiplayer_scenario; - const config &level_preload = game_config.find_child("multiplayer", "id", parameters.name); - if (!level_preload) { - std::cerr << "Could not find scenario '" << parameters.name << "'\n"; - return; - } - - game_classification classification; - classification.campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER; - classification.scenario_define = level_preload["define"].str(); - classification.era_define = era_cfg_preload["define"].str(); - game_config_manager::get()->load_game_config_for_game(classification); + state.classification().campaign_type = game_classification::CAMPAIGN_TYPE::MULTIPLAYER; + //[era] define. + if (cmdline_opts.multiplayer_era) { + parameters.mp_era = *cmdline_opts.multiplayer_era; } - - const config& era_cfg = game_config_manager::get()->game_config().find_child("era", "id", parameters.mp_era); - const config& level = game_config_manager::get()->game_config().find_child("multiplayer", "id", parameters.name); - - if (cmdline_opts.multiplayer_side) { - for(std::vector >::const_iterator - it=cmdline_opts.multiplayer_side->begin(); it!=cmdline_opts.multiplayer_side->end(); ++it) - { - const config *faction = &era_cfg.find_child("multiplayer_side", "id", it->get<1>()); - if (!*faction) { - std::cerr << "Could not find faction '" << it->get<1>() << "'\n"; - return; - } - } + if (const config& cfg_era = game_config.find_child("era", "id", parameters.mp_era)) { + state.classification().era_define = cfg_era["define"]; } - - - // Should the map be randomly generated? - if (level["map_generation"].empty()) { - DBG_MP << "using scenario map" << std::endl; - state.set_scenario(level); - } else { - DBG_MP << "generating random map" << std::endl; - util::scoped_ptr generator(nullptr); - generator.assign(create_map_generator(level["map_generation"], level.child("generator"))); - state.set_scenario(generator->create_scenario()); - - // Set the scenario to have placing of sides - // based on the terrain they prefer - state.get_starting_pos()["modify_placing"] = "true"; - - util::unique_ptr map; - const int map_positions = level.child("generator")["players"]; - DBG_MP << "map positions: " << map_positions << std::endl; - - for (int pos = state.get_starting_pos().child_count("side"); pos < map_positions; ++pos) { - config& side = state.get_starting_pos().add_child("side"); - side["side"] = pos + 1; - side["team_name"] = pos + 1; - side["canrecruit"] = true; - side["controller"] = "human"; - } + else { + std::cerr << "Could not find era '" << parameters.mp_era << "'\n"; + return; + } + //[multiplayer] define. + if (cmdline_opts.multiplayer_scenario) { + parameters.name = *cmdline_opts.multiplayer_scenario; + } + if (const config& cfg_multiplayer = game_config.find_child("multiplayer", "id", parameters.name)) { + state.classification().scenario_define = cfg_multiplayer["define"]; + } + else { + std::cerr << "Could not find [multiplayer] '" << parameters.name << "'\n"; + return; } + game_config_manager::get()->load_game_config_for_game(state.classification()); + state.set_carryover_sides_start( + config_of("next_scenario", parameters.name) + ); + state.expand_random_scenario(); + state.expand_mp_events(); + state.expand_mp_options(); // Should number of turns be determined from scenario data? if (parameters.use_map_settings && state.get_starting_pos()["turns"]) { From bc84ecf743d8ccc73071476a8057018c0728e2ba Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Sun, 3 Apr 2016 02:07:49 +0200 Subject: [PATCH 143/240] Attempt to fix gcc compilation --- src/game_initialization/multiplayer.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index 3978452fe9a2..45488f9ddc41 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -809,7 +809,7 @@ void start_local_game_commandline(CVideo& video, const config& game_config, parameters.mp_era = *cmdline_opts.multiplayer_era; } if (const config& cfg_era = game_config.find_child("era", "id", parameters.mp_era)) { - state.classification().era_define = cfg_era["define"]; + state.classification().era_define = cfg_era["define"].str(); } else { std::cerr << "Could not find era '" << parameters.mp_era << "'\n"; @@ -820,7 +820,7 @@ void start_local_game_commandline(CVideo& video, const config& game_config, parameters.name = *cmdline_opts.multiplayer_scenario; } if (const config& cfg_multiplayer = game_config.find_child("multiplayer", "id", parameters.name)) { - state.classification().scenario_define = cfg_multiplayer["define"]; + state.classification().scenario_define = cfg_multiplayer["define"].str(); } else { std::cerr << "Could not find [multiplayer] '" << parameters.name << "'\n"; From 479f1b3d52633ec0667e48d9256e8c5e836cd754 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Sun, 3 Apr 2016 02:38:54 +0200 Subject: [PATCH 144/240] also allow c++1y in SConstruct --- SConstruct | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SConstruct b/SConstruct index 86d505b67dca..3dc2bae88750 100755 --- a/SConstruct +++ b/SConstruct @@ -103,7 +103,7 @@ opts.AddVariables( BoolVariable('ccache', "Use ccache", False), ('ctool', 'Set c compiler command if not using standard compiler.'), ('cxxtool', 'Set c++ compiler command if not using standard compiler.'), - EnumVariable('cxx_std', 'Target c++ std version', '11', ['11', '14']), + EnumVariable('cxx_std', 'Target c++ std version', '11', ['11', '14', '1y']), BoolVariable('openmp', 'Enable openmp use.', False), BoolVariable("fast", "Make scons faster at cost of less precise dependency tracking.", False), BoolVariable("lockfile", "Create a lockfile to prevent multiple instances of scons from being run at the same time on this working copy.", False), From 0cdd8b7180b31fbc19fa115a3d4bbb0e32642e21 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 21:13:16 +1100 Subject: [PATCH 145/240] GUI2: draw buttons procedurally and increase default size --- data/gui/widget/button_default.cfg | 152 +++++++++++++++--- .../button_normal/background-active.png | Bin 0 -> 2153 bytes .../button_normal/background-pressed.png | Bin 0 -> 1674 bytes images/buttons/button_normal/background.png | Bin 0 -> 1907 bytes 4 files changed, 128 insertions(+), 24 deletions(-) create mode 100644 images/buttons/button_normal/background-active.png create mode 100644 images/buttons/button_normal/background-pressed.png create mode 100644 images/buttons/button_normal/background.png diff --git a/data/gui/widget/button_default.cfg b/data/gui/widget/button_default.cfg index 1f78aa3001e9..9ad750d99b20 100644 --- a/data/gui/widget/button_default.cfg +++ b/data/gui/widget/button_default.cfg @@ -3,7 +3,115 @@ ### Definition of the default button. ### -#define _GUI_RESOLUTION RESOLUTION MIN_WIDTH DEFAULT_WIDTH HEIGHT EXTRA_WIDTH EXTRA_HEIGHT FONT_SIZE BASE_NAME SUFFIX IPF +#define _GUI_BORDER_COLOR_ALPHA ALPHA +"162, 127, 68, {ALPHA}" #enddef + +#define _GUI_BORDER_COLOR_DARK_ALPHA ALPHA +"114, 79, 46, {ALPHA}" #enddef + +#define _GUI_POINT X Y COLOR + [line] + x1 = {X} + y1 = {Y} + x2 = {X} + y2 = {Y} + + thickness = 1 + color = {COLOR} + [/line] +#enddef + +#define _GUI_STATE BACKGROUND_IMAGE BORDER_COLOR BORDER_COLOR_DARK HIGHLIGHT_LINE_COLOR IPF + [image] + w = "(width)" + h = "(height)" + name = "buttons/button_normal/{BACKGROUND_IMAGE}.png{IPF}" + [/image] + + [rectangle] + x = 0 + y = 0 + w = "(width)" + h = "(height)" + + border_thickness = 1 + border_color = {BORDER_COLOR} + [/rectangle] + + [rectangle] + x = 1 + y = 1 + w = "(width - 2)" + h = "(height - 2)" + + border_thickness = 1 + border_color = "1, 10, 16, 255" + [/rectangle] + + # + # Darken borders along the left and bottom + # + + [line] + x1 = 0 + y1 = 0 + x2 = 0 + y2 = "(height - 1)" + + thickness = 1 + color = {BORDER_COLOR_DARK} + [/line] + + [line] + x1 = 0 + y1 = "(height - 1)" + x2 = "(width - 1)" + y2 = "(height - 1)" + + thickness = 1 + color = {BORDER_COLOR_DARK} + [/line] + + # + # Tint lines on the top and right + # + + [line] + x1 = 3 + y1 = 2 + x2 = "(width - 3)" + y2 = 2 + + thickness = 1 + color = {HIGHLIGHT_LINE_COLOR} + [/line] + + [line] + x1 = "(width - 3)" + y1 = 2 + x2 = "(width - 3)" + y2 = "(height - 4)" + + thickness = 1 + color = {HIGHLIGHT_LINE_COLOR} + [/line] + + # + # Round the corners + # + + {_GUI_POINT 0 0 ("")} + {_GUI_POINT 0 "(height - 1)" ("")} + {_GUI_POINT "(width - 1)" 0 ("")} + {_GUI_POINT "(width - 1)" "(height - 1)" ("")} + + {_GUI_POINT 1 1 {BORDER_COLOR }} + {_GUI_POINT 1 "(height - 2)" {BORDER_COLOR_DARK}} + {_GUI_POINT "(width - 2)" 1 {BORDER_COLOR }} + {_GUI_POINT "(width - 2)" "(height - 2)" {BORDER_COLOR_DARK}} +#enddef + +#define _GUI_RESOLUTION RESOLUTION MIN_WIDTH DEFAULT_WIDTH HEIGHT EXTRA_WIDTH EXTRA_HEIGHT FONT_SIZE IPF ALPHA [resolution] {RESOLUTION} @@ -25,11 +133,9 @@ [draw] - [image] - w = "(width)" - h = "(height)" - name = "buttons/{BASE_NAME}{SUFFIX}.png{IPF}" - [/image] + {_GUI_STATE "background" + ({_GUI_BORDER_COLOR_ALPHA {ALPHA}}) + ({_GUI_BORDER_COLOR_DARK_ALPHA {ALPHA}}) ("21, 79, 109, 255") {IPF}} {GUI__CENTERED_TEXT ({FONT_SIZE}) () ({GUI__FONT_COLOR_ENABLED__TITLE})} @@ -41,11 +147,9 @@ [draw] - [image] - w = "(width)" - h = "(height)" - name = "buttons/{BASE_NAME}{SUFFIX}.png~GS(){IPF}" - [/image] + {_GUI_STATE "background" + ({_GUI_BORDER_COLOR_ALPHA {ALPHA}}) + ({_GUI_BORDER_COLOR_DARK_ALPHA {ALPHA}}) ("1, 10, 16, 255") "~GS(){IPF}"} {GUI__CENTERED_TEXT ({FONT_SIZE}) () ({GUI__FONT_COLOR_DISABLED__TITLE})} @@ -57,11 +161,9 @@ [draw] - [image] - w = "(width)" - h = "(height)" - name = "buttons/{BASE_NAME}-pressed{SUFFIX}.png{IPF}" - [/image] + {_GUI_STATE "background-pressed" + ({_GUI_BORDER_COLOR_ALPHA {ALPHA}}) + ({_GUI_BORDER_COLOR_DARK_ALPHA {ALPHA}}) ("1, 10, 16, 255") {IPF}} {GUI__CENTERED_TEXT ({FONT_SIZE}) () ({GUI__FONT_COLOR_ENABLED__TITLE})} @@ -73,11 +175,9 @@ [draw] - [image] - w = "(width)" - h = "(height)" - name = "buttons/{BASE_NAME}-active{SUFFIX}.png{IPF}" - [/image] + {_GUI_STATE "background-active" + ({_GUI_BORDER_COLOR_ALPHA {ALPHA}}) + ({_GUI_BORDER_COLOR_DARK_ALPHA {ALPHA}}) ("12, 108, 157, 255") {IPF}} {GUI__CENTERED_TEXT ({FONT_SIZE}) () ({GUI__FONT_COLOR_ENABLED__TITLE})} @@ -93,7 +193,7 @@ id = "default" description = "Default button" - {_GUI_RESOLUTION () 40 108 22 13 4 ({GUI_NORMAL__FONT_SIZE__SMALL}) "button_normal/button_H22" () ()} + {_GUI_RESOLUTION () 40 112 26 13 4 ({GUI_NORMAL__FONT_SIZE__SMALL}) () 255} [/button_definition] @@ -102,7 +202,7 @@ id = "large" description = "Large button" - {_GUI_RESOLUTION () 80 216 44 26 4 ({GUI_NORMAL__FONT_SIZE__LARGE}) "button_normal/button_H22" "@2x" ()} + {_GUI_RESOLUTION () 40 116 30 13 4 ({GUI_NORMAL__FONT_SIZE__SMALL}) () 255} [/button_definition] @@ -111,8 +211,12 @@ id = "transparent" description = "Default transparent button" - {_GUI_RESOLUTION () 40 108 22 13 4 ({GUI_NORMAL__FONT_SIZE__SMALL}) "button_normal/button_H22" () "~O(65%)"} + {_GUI_RESOLUTION () 40 112 26 13 4 ({GUI_NORMAL__FONT_SIZE__SMALL}) "~O(65%)" 165} [/button_definition] +#undef _GUI_BORDER_COLOR_ALPHA +#undef _GUI_BORDER_COLOR_DARK_ALPHA +#undef _GUI_POINT +#undef _GUI_STATE #undef _GUI_RESOLUTION diff --git a/images/buttons/button_normal/background-active.png b/images/buttons/button_normal/background-active.png new file mode 100644 index 0000000000000000000000000000000000000000..26db4fde8883ced4c497463737f6aaf139231ce0 GIT binary patch literal 2153 zcmV-v2$uJWP)&UXIl2?o%$8fz4(^ z3xD}r$m@tIzy65`0AWD{$Ph#z?ln3H9LW1+D6v<_SvLj%ZdQ9M=((;UxH&qMh#))= z6~aNt&u)Q^eDCx1cTvIjJ@tIO?GO-%i27dVz1BzgKATgYRks~sw(U?6JYv81c~t~6 zM}D#GkN)@T_3&V-2=V8?66I81EAM4;nTD&T{i0+z zCErB|>b{ZtdjR2t2(cFW^@Z8WJ$h{ft^%Rp1_UO+crGABUK_KXrTdJcO4x!ikO;y8 zAqexdYgtD!_s~JOcU#PU45_Fh3qW{{{7kXb&Ip^6j0$UyaZIkA_oFT#U? zV7|Z|nUnC9`$c9pq4+Y8aS@0DmQ3T8=UJWsLkq;9K_v252PM+z@Lb!NXv5vXqUcKY zM&LJd!TTPR6^e4tL^|dh;K-GAy{C-4zR#rB{^{rp+)b>N!J}TiW)x7`jt(4>)GC6G ziH?D}qg=t&vfB(IU*SnRMh1j2(P9;fH8U5fXO!b5iXnuE1y2Fz8Jk^1H7PRuGR8ck z_x-}08^tp9pmJzAsSFLLa<}NK9XdX0NYdV@SM3wzyUL-QeSfW&T4$9pswcoI$W!}y z(QDIJ-{)4gNM2Xn)SPQaQA^;S8RbM~OM_u(-a8*;KH!;CbasehRg=OTMrK0*GL`w1 z-6G(QK40l8Z+fpJkhw``idJO3>7|@wt7yWBRe_7BRLlaJpu3PPh1%dCw1aaa-s2#= zs4JZqF#M`n^~^Ska&%{3^pWH`N8KY-5T&S64*H{sAU@Bef`n`lP=(-t$BQYNo~y3- zO{FSm2r-@lP{{}{TU9el=QzG{0}Zf1X6qJ@|DDGz?Fke>7yi}bORTg5s0?-0LBr|-BdY*5!law8i%8B1^pYj;B>}2R#JKaB; zBd*MfIBQxg*s4M-A9Wu|Cx6r#_e;R&1pp4mi)I}4_YBZ|k4RDBEr{mK>sq~=BsdgB z+;KCcGql8pXzfFt(>;AsnbbX%Zj=tasG`uisq5-NsJ`K*s@=fp*{cP`vV-=Phn+3s zswKWkHn#KaAigs%0-}Oh4P$0Xi;99A92|$i31Rz6EBhvuMRipjbK9%GjZwHDk`>uvTzxn*tIA zqYzL|UZw6li(O_~1=p(%^r5;oq!c*_-*xFAiipqPt+!ar>UCX{lcm!2vO)G}){^R> zrbx>BKARP#sGQ<#Su>vJ3nEzWi^>5^tUR~a+F%Gbq+5)Ld`1OaMbK`BSH6p6Pa_Vq zJMk=t`k4jq3(s><*MaFmCz)mO{hr!!HQ;oSlV2!`;`>%jaiMz7Lq~D-9a5Pvq%cqh zKXC%#t9qB`2!n4Uo~N43rn_nfJZaGccn$sf%I4B6Cj|2;+AKu{yt|1$byj3lhWN?0 z3i@W~wa}^fn*j2q$WU}BzTN_Ef+ND2U0dXtRqW*&rAXF+ujgtU?MPwwtKdatjU08i zUeI|JdfUomb9r2IHK|5dJE-OS-F?S31gYr1mcqiT7Z?KHKhlO#qno!xLDx$a`0!=u9{e)a~$(oAd2!cH==)hFbt^TN~aChtmOwaW{e`dCd z?q-s3cyGnWq2Zn7D}htAltWeEKR*(D=7>r54ekieV6fJ^=VhWzb?H?9{)VZ9rF0ID z>hD&{U`x9ktKttK!VtmN!Xt8o1({Vfxb&v*76$@Y-aofG5``Z>kw5*GsE{n&u^T1gmH~B^eQM)s!DaEf7kGEc)bRYRnzRPy*V?yQ32@D5kD|~mi<%XFfA`c3=FB5@Jzgb^{mk2X;=Jp#)tU$*a^fIcKSk1G)f?YZ zUJe^91J6P0WI5yC|JdVr{*@!?kGWl;Gu(H2MrF#FbKiSL>ipmPyFa+s{L%Mc_c}ix z{Qj(NhK}*O^Y(M|`uz9_LLbG;v0i46np!m2kf!ux*1IUA3q=5 fXX~FkVhH~Qsl7fDdy|5P00000NkvXXu0mjfe`O!7 literal 0 HcmV?d00001 diff --git a/images/buttons/button_normal/background-pressed.png b/images/buttons/button_normal/background-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..93d2ee007b91bfeafce55a651fea409d544cf5cf GIT binary patch literal 1674 zcmV;526g#~P)@VbPzZ1UWFB(|gRteOK~MzX4l{=&_;mpQr~u&b1);H?V4y$F++|VJ%10T->Z`p~vSQ`#ImWynfH)-irhFO?cnPIvFJ8 zKMAuumRH14009sb0ZCZvf>})fSvV>3nr=P(D6YfYAOZ?OA-Frx_Xi*t1nUazg4ALe zoPzf8J_h!@mGekkLAoK`H5tO!+BJwciZ4(=1gFU7=Poq03r=Yo(Vu(#`C0{_zTN<< zi!5b>%nV>QLew0S1apTNvq*nkRrEqa+yH@i-%vFp8^&oU7=aWd!M)}%IA9-*<5F~)n(vV0z|66{CwaE3M&Yd{}Fy_BPu%r&e z*uc?d%=tQ5W5vb>m-u8+vt_j8NFE<+>>gGhrZogm678~Sj2DK4yA4)c*-xwsqEkl8-A-2{d zL;wNM3iZk`VT59%Gs6bU*HYghE2A&=m7Hv~&<+y>;F@s_l4g2)A#cJj2V6(7F^sab zwW>jk4O-FHm!}Vk1>Nbrk@1#9kZs!)vVZzvBx5sF+Xh3@mXYf z1_4I?rc82HsA%MiOwH~z=Bc~B04r^`(&CiARp&+d+QIB#$)6`;i=9@nt>@HC==+;t z`yIDbj%=oswfE6F5+Ba;d}!$HeJ$=g)477xVeI9SY9 z7kjT^eYw&j&3E8wt?=|EFaJ@o$0{nPlx@k)M#pB$fPu;40^z4b&pB>8(M3Q8xG%69 zlNYoHBXZxeo6zR}@S8^X*(mG4b=S3Y#MN5NnS4T6uM4V)^L^(;-}e)VZSLHQO#lhr z=)CWo<61k&R6`mpU^AsrtVnra_3gTYFzWYyq9p`;t`xtHta@V;A! z0s3BBQg)EoJHm{h5syMQLvXOie4ETL!pY@?c`V<31}JN)npl$@Go=oz zDxl=MYR`0f`N!tn9EQXE5s{lWsw6-U`8fUOWX;6r4}aPo)V@<2%_AIGJyn>U{`*@_ zun+~a0fD6vO@YX}B%$U40G5QSrNA!w_o&)OWsQvy;9neZ|9<=KUBu zafyW2rnZ?eavPYqYF_@2+yfypG7ItXG$4}|0L5HyIW`9(z>?&abpQ3p@aKG8j~s0_I{%Qb)9ee`=aYbSU9&Om zgmrq(cWnDX;yc5|dHmd@opSn^Hs0Nk6>#y%M^9eX*XfBP%F%H6VVempDF`|B@={!EYk|NRI51L@a~ U^DXD|)c^nh07*qoM6N<$f-{PTD5 zJ3uqMUnBtlazO&P2oliQ#ukJCko~y~nikyc)&c;8dyQ>??dL`!JYdTp2?~KmC;%eg zhYPmy+VktrG$N)?eZQUSAV5G;eXjW)?WLHx1?s)otV8az4kHoLTzkGo!acy(+WyzQ z_j83{Mq+(kAPJICL_Lg|3=lOpWzamYxhMx=17i3MM0RNi6@uKMaM)T23IK!vX@hNi zfNo~6W#C%SfKG53?88H~9`K;T-iTBqN4 zEg}1_Wdl+Nd)j(nt!Lsl5DGo|D3oJCnW;TtS_YZu1$B@Bd1p~(VSL|}-GR98%wR4^ zo?{__wndNzxiXT7ouLBa_8hyvj|q@R;2Aa@*`15&gqRjl*-OHfA@11E6fmwC>%6~J z!ae|_tqJr1aa|vQ{xhK8pftPA&nKt=U_w)S4;c5I!3Qh5GWcZPJJ)5)&^aqlK-RjF z1(D!{2PDrijXTAUV6<$>laW>uA_<-E0w40%03}mn*wXj=UJ{nMZQil+u-pw6Cjz zURhi+=HE9|U?gBMfQH|t@39qfGA&*~t)RF+*g{)~5F#`Z$YuF?>P#S$U!ZMv_CH1R zAB2&+WKUFrIvAU+Yi-6f5JqAxo2-AcV8C;K^gZiTOYaG$zno_r^+vlUN&(W4f4P3RKfoFmRV?2xBd6FmI9;Qf zT^9lPA2*tXTUwqLx);f1Rc~0u)Kbn05Uw>KW*-NFmGuH5(@(y$lVr-B<@bj>pt8!% zzLJxz7MVo078F@6`Le*<8e@!rU6z$~f{kGmZCo_~-=@FlYs<0@Dk?dBClWKc5kTlp z@My@&ASkk)IP}4+Z891x!Zd|Y4~NsBd;oO3S47o}0K)T`02FYoowRCud%3*?LGG}X z`xGgXweBTHOzlHIOJHaVP_`(o>McSzn{decY(v!W7_ndO#-OQZm1+ED)LaV zqk_5CgH>&2dJo9Rsw$5*>?J-il6RVhlrrtWPd(|H6Y+3AG#jb=2`E&Z$}A`1J1THH z+oiI`fvH1MGAaD7x^tJ2&;f>*>vPbAGqQ3)_c5;?TN#Y_&hL!dYomJ4o(uzc$?=h( z;<)!w2-U`kNJhwg=DCw02Dp~LlNIm)Lol$e_^4at-+$9jOlixQnQtE;{d7Wbs3?RD z`0TuKX!f{nVSQawpTd2l=#hzC+-Y+!WlWFkRKyh8M^ddVIobbEfpyy6Jh@N^>stF1 zLwcTMuudAt54Cyho6HbVETSO_Fpztr{n}5FhHHwRrDm$Y=!J)S)`bJOac_qykSdUE zQ^$b`SQs1H#WjynvW@@yKUiPCCK0-C-1%7#=M`85NY6u#F%nG8cmhz;8ZKaUQu!R) z$hnP2okjqGxc7;|)F8A3uWV~oTk2S*kCfW!jpLMR&ve%Eee4q+Gv}1UfBYt#1$fy9 zBYtAVS>QWknpr2qHUo*MBbn{+KHH8|KE_*Fln>{Zl2j(7T^#L$afRqy1m$?WCY#4k z_Po{yyvB!MTyre78OR?CyW|gsG&B2r@7ym+!UcEO*RKpt?P>6?Eibw@Ylb1@GvH_6 zk;S{f_XikrJ=%_RL`uQvwI6cp7`sZV`j6ZLp^kn8f1L)TvkJe*rHv)_T>li7X6V;d zDq;xTu+Z#5_`r!x$1k8bAuC*M~0Cz+lTtcN(*Q1t@^Zro;rH^2r8_soI zlj&W^PigxA^#J|>et~@6KlcKAU-IlvBzQefTUSY1GNcVgJGypdxk-*ZHMjK1hO7f4 z(ccwt_q_h`ozE)C>{m+g`r0u-oab*=;^3f;Ed#Pl*jGxT87pp)tmfbTCHw1N9&YO` zTc>qC8Ptb)Cn!G^!JqoS0s4QR-($s5=iblbVDp>t`}y_w3BtZ?q%mHs?jxj>KpoqN tbvVwW-aagNxwSv}`QV(}{M@mK{{mFLtMbRsTkQY<002ovPDHLkV1k^yjpP6T literal 0 HcmV?d00001 From 00b571a8e18e7874d84d002ff34a1dd73c29d306 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 21:13:54 +1100 Subject: [PATCH 146/240] Use large buttons for main panel in titlescreen --- data/gui/window/title_screen.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gui/window/title_screen.cfg b/data/gui/window/title_screen.cfg index a8eb55f5bc29..20602e08de9e 100644 --- a/data/gui/window/title_screen.cfg +++ b/data/gui/window/title_screen.cfg @@ -236,7 +236,7 @@ horizontal_grow = "true" [button] id = {ID} - definition = "default" + definition = "large" label = {CAPTION} tooltip = {TOOLTIP} From 0708069cc2c545fdd534a27f40ede36c02643fef Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 23:31:09 +1100 Subject: [PATCH 147/240] New design for vertical scrollbars (horizontal pending) --- data/gui/macros/_initial.cfg | 12 +- data/gui/macros/vertical_scrollbar.cfg | 7 +- data/gui/widget/repeating_button_default.cfg | 17 -- .../gui/widget/repeating_button_scrollbar.cfg | 190 ++++++++++++++++++ .../gui/widget/vertical_scrollbar_default.cfg | 66 ++---- .../scrollbars/scrollbottom-active.png | Bin 101 -> 154 bytes .../scrollbottom-minimal-active.png | Bin 167 -> 0 bytes .../scrollbottom-minimal-pressed.png | Bin 167 -> 0 bytes .../scrollbars/scrollbottom-minimal.png | Bin 172 -> 0 bytes .../scrollbars/scrollbottom-pressed.png | Bin 102 -> 154 bytes images/buttons/scrollbars/scrollbottom.png | Bin 103 -> 155 bytes .../buttons/scrollbars/scrollmid-active.png | Bin 207 -> 232 bytes .../scrollbars/scrollmid-minimal-active.png | Bin 242 -> 0 bytes .../scrollbars/scrollmid-minimal-pressed.png | Bin 243 -> 0 bytes .../buttons/scrollbars/scrollmid-minimal.png | Bin 247 -> 0 bytes .../buttons/scrollbars/scrollmid-pressed.png | Bin 213 -> 231 bytes images/buttons/scrollbars/scrollmid.png | Bin 199 -> 235 bytes .../buttons/scrollbars/scrolltop-active.png | Bin 118 -> 168 bytes .../scrollbars/scrolltop-minimal-active.png | Bin 179 -> 0 bytes .../scrollbars/scrolltop-minimal-pressed.png | Bin 179 -> 0 bytes .../buttons/scrollbars/scrolltop-minimal.png | Bin 169 -> 0 bytes .../buttons/scrollbars/scrolltop-pressed.png | Bin 121 -> 169 bytes images/buttons/scrollbars/scrolltop.png | Bin 104 -> 158 bytes 23 files changed, 217 insertions(+), 75 deletions(-) create mode 100644 data/gui/widget/repeating_button_scrollbar.cfg delete mode 100644 images/buttons/scrollbars/scrollbottom-minimal-active.png delete mode 100644 images/buttons/scrollbars/scrollbottom-minimal-pressed.png delete mode 100644 images/buttons/scrollbars/scrollbottom-minimal.png delete mode 100644 images/buttons/scrollbars/scrollmid-minimal-active.png delete mode 100644 images/buttons/scrollbars/scrollmid-minimal-pressed.png delete mode 100644 images/buttons/scrollbars/scrollmid-minimal.png delete mode 100644 images/buttons/scrollbars/scrolltop-minimal-active.png delete mode 100644 images/buttons/scrollbars/scrolltop-minimal-pressed.png delete mode 100644 images/buttons/scrollbars/scrolltop-minimal.png diff --git a/data/gui/macros/_initial.cfg b/data/gui/macros/_initial.cfg index 9bf9f6d738d7..5f93746827f4 100644 --- a/data/gui/macros/_initial.cfg +++ b/data/gui/macros/_initial.cfg @@ -29,7 +29,7 @@ # If the text is too high it returns the top side. # Rounding happens to the bottom side. #define GUI__TEXT_VERTICALLY_CENTRED - "(if(text_height < height, (height - text_height + 1) / 2, 0))" + "(if(text_height < height, (height - text_height - 2) / 2, 0))" #enddef #define GUI__CENTERED_TEXT FONT_SIZE FONT_STYLE FONT_COLOR @@ -291,21 +291,21 @@ #enddef #define GUI_NORMAL__FONT_SIZE__TINY - 10 + 13 #enddef #define GUI_NORMAL__FONT_SIZE__SMALL - 12 + 15 #enddef #define GUI_NORMAL__FONT_SIZE__DEFAULT - 14 + 17 #enddef #define GUI_NORMAL__FONT_SIZE__LARGE - 18 + 20 #enddef #define GUI_NORMAL__FONT_SIZE__TITLE - 20 + 24 #enddef diff --git a/data/gui/macros/vertical_scrollbar.cfg b/data/gui/macros/vertical_scrollbar.cfg index 704c8234f08b..cb0d44cfd445 100644 --- a/data/gui/macros/vertical_scrollbar.cfg +++ b/data/gui/macros/vertical_scrollbar.cfg @@ -13,7 +13,7 @@ vertical_grow = "true" # note we want a special button definition for this later. [repeating_button] id = "_half_page_up" - definition = "up_arrow" + definition = "scrollbar_up_arrow" [/repeating_button] [/column] @@ -22,7 +22,8 @@ vertical_grow = "true" [row] - grow_factor = 1 + grow_factor = 1 + [column] vertical_grow = "true" @@ -42,7 +43,7 @@ vertical_grow = "true" # note we want a special button definition for this later. [repeating_button] id = "_half_page_down" - definition = "down_arrow" + definition = "scrollbar_down_arrow" [/repeating_button] [/column] diff --git a/data/gui/widget/repeating_button_default.cfg b/data/gui/widget/repeating_button_default.cfg index 004ca20ab15c..4025ad0a7f27 100644 --- a/data/gui/widget/repeating_button_default.cfg +++ b/data/gui/widget/repeating_button_default.cfg @@ -157,22 +157,6 @@ # Transparent arrow buttons -{_GUI_DEFINITION - "down_arrow_transparent" - "Down arrow button for a transparent scrollbar." - "buttons/button_square/button_square_25" - "icons/arrows/arrows_ornate_down_25" - "~O(65%)" -} - -{_GUI_DEFINITION - "up_arrow_transparent" - "Up arrow button for a transparent scrollbar." - "buttons/button_square/button_square_25" - "icons/arrows/arrows_ornate_up_25" - "~O(65%)" -} - {_GUI_DEFINITION "left_arrow_transparent" "Left arrow button for a transparent scrollbar." @@ -191,4 +175,3 @@ #undef _GUI_DEFINITION #undef _GUI_RESOLUTION - diff --git a/data/gui/widget/repeating_button_scrollbar.cfg b/data/gui/widget/repeating_button_scrollbar.cfg new file mode 100644 index 000000000000..838f1636509b --- /dev/null +++ b/data/gui/widget/repeating_button_scrollbar.cfg @@ -0,0 +1,190 @@ +#textdomain wesnoth-lib +### +### Definition of repeating buttons for scrollbar arrows +### + +#define _GUI_RESOLUTION RESOLUTION SIZE IMAGE_OVERLAY IPF ALPHA + [resolution] + + {RESOLUTION} + + min_width = {SIZE} + min_height = {SIZE} + + default_width = {SIZE} + default_height = {SIZE} + + max_width = {SIZE} + max_height = {SIZE} + + [state_enabled] + + [draw] + + [rectangle] + x = 0 + y = 0 + w = "(width)" + h = "(height)" + fill_color = "4, 4, 4, {ALPHA}" + [/rectangle] + + [image] + w = {SIZE} + h = {SIZE} + name = {IMAGE_OVERLAY} + ".png{IPF}" + [/image] + + [/draw] + + [/state_enabled] + + [state_disabled] + + [draw] + + [rectangle] + x = 0 + y = 0 + w = "(width)" + h = "(height)" + fill_color = "4, 4, 4, {ALPHA}" + [/rectangle] + + [image] + w = {SIZE} + h = {SIZE} + name = {IMAGE_OVERLAY} + ".png~GS(){IPF}" + [/image] + + [/draw] + + [/state_disabled] + + [state_pressed] + + [draw] + + [rectangle] + x = 0 + y = 0 + w = "(width)" + h = "(height)" + fill_color = "4, 4, 4, {ALPHA}" + [/rectangle] + + [image] + w = {SIZE} + h = {SIZE} + name = {IMAGE_OVERLAY} + "-pressed.png{IPF}" + [/image] + + [/draw] + + [/state_pressed] + + [state_focused] + + [draw] + + [rectangle] + x = 0 + y = 0 + w = "(width)" + h = "(height)" + fill_color = "4, 4, 4, {ALPHA}" + [/rectangle] + + [image] + w = {SIZE} + h = {SIZE} + name = {IMAGE_OVERLAY} + "-active.png{IPF}" + [/image] + + [/draw] + + [/state_focused] + + [/resolution] +#enddef + +#define _GUI_DEFINITION ID DESCRIPTION IMAGE_OVERLAY IPF ALPHA +[repeating_button_definition] + id = {ID} + description = {DESCRIPTION} + + {_GUI_RESOLUTION () 15 ({IMAGE_OVERLAY}) ({IPF}) ({ALPHA})} + +[/repeating_button_definition] +#enddef + +{_GUI_DEFINITION + "scrollbar_up_arrow" + "Up arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~ROTATE(-90)") + "255" +} + +{_GUI_DEFINITION + "scrollbar_down_arrow" + "Down arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~ROTATE(90)") + "255" +} + +{_GUI_DEFINITION + "scrollbar_left_arrow" + "Up arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~ROTATE(180)") + "255" +} + +{_GUI_DEFINITION + "scrollbar_right_arrow" + "Down arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)") + "255" +} + +# +# Transparent versions +# + +{_GUI_DEFINITION + "scrollbar_up_arrow_transparent" + "Up arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~ROTATE(-90)~O(65%)") + "165" +} + +{_GUI_DEFINITION + "scrollbar_down_arrow_transparent" + "Down arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~ROTATE(90)~O(65%)") + "165" +} + +{_GUI_DEFINITION + "scrollbar_left_arrow_transparent" + "Up arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~ROTATE(180)~O(65%)") + "165" +} + +{_GUI_DEFINITION + "scrollbar_right_arrow_transparent" + "Down arrow button for a scrollbar." + "icons/arrows/short_arrow_right_25" + ("~CROP(4,4,17,17)~O(65%)") + "165" +} + +#undef _GUI_DEFINITION +#undef _GUI_RESOLUTION diff --git a/data/gui/widget/vertical_scrollbar_default.cfg b/data/gui/widget/vertical_scrollbar_default.cfg index 0d95664e2927..98c2b2e2fbf1 100644 --- a/data/gui/widget/vertical_scrollbar_default.cfg +++ b/data/gui/widget/vertical_scrollbar_default.cfg @@ -3,35 +3,20 @@ ### Definition of a vertical scrollbar. ### -#define _GUI_STATE GROOVE_TOP GROOVE_BOTTOM POSITIONER_TOP POSITIONER_BOTTOM IMAGE_SUFFIX IPF +#define _GUI_STATE POSITIONER_TOP IMAGE_SUFFIX IPF [draw] # # Groove # - [image] - # 4 pixels high + [rectangle] x = 0 y = 0 - name = "buttons/scrollbars/scrollgroove-top.png{IPF}" - [/image] - - [image] - x = 0 - y = {GROOVE_TOP} - h = "(if(height - {GROOVE_TOP} - {GROOVE_BOTTOM} < 0 - , 0, height - {GROOVE_TOP} - {GROOVE_BOTTOM}))" - resize_mode = "stretch" - name = "buttons/scrollbars/scrollgroove-mid.png{IPF}" - [/image] - - [image] - # 5 pixels high - x = 0 - y = "(height - {GROOVE_BOTTOM})" - name = "buttons/scrollbars/scrollgroove-bottom.png{IPF}" - [/image] + w = "(width)" + h = "(height)" + fill_color = "4, 4, 4, 255" + [/rectangle] # # Positioner @@ -48,8 +33,8 @@ x = 0 y = "(positioner_offset + {POSITIONER_TOP})" h = "( -if(positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM} < 0 - , 0, positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM}))" +if(positioner_length - {POSITIONER_TOP} < 0 + , 0, positioner_length - {POSITIONER_TOP}))" resize_mode = "stretch" name = "buttons/scrollbars/scrollmid{IMAGE_SUFFIX}{IPF}" [/image] @@ -57,14 +42,14 @@ if(positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM} < 0 [image] # 5 pixels high x = 0 - y = "(positioner_offset + positioner_length - {POSITIONER_BOTTOM})" + y = "(positioner_offset + positioner_length)" name = "buttons/scrollbars/scrollbottom{IMAGE_SUFFIX}{IPF}" [/image] [/draw] #enddef -#define _GUI_RESOLUTION RESOLUTION WIDTH HEIGHT POSITIONER_LENGHT GROOVE_TOP GROOVE_BOTTOM POSITIONER_TOP POSITIONER_BOTTOM IPF +#define _GUI_RESOLUTION RESOLUTION WIDTH HEIGHT POSITIONER_LENGHT POSITIONER_TOP IPF [resolution] {RESOLUTION} @@ -72,7 +57,7 @@ if(positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM} < 0 min_width = {WIDTH} min_height = {HEIGHT} - default_width = {WIDTH} + default_width = 15 default_height = {HEIGHT} max_width = {WIDTH} @@ -84,19 +69,19 @@ if(positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM} < 0 bottom_offset = 0 [state_enabled] - {_GUI_STATE ({GROOVE_TOP}) ({GROOVE_BOTTOM}) ({POSITIONER_TOP}) ({POSITIONER_BOTTOM}) ".png" ({IPF}) } + {_GUI_STATE ({POSITIONER_TOP}) ".png" ({IPF}) } [/state_enabled] [state_disabled] - {_GUI_STATE ({GROOVE_TOP}) ({GROOVE_BOTTOM}) ({POSITIONER_TOP}) ({POSITIONER_BOTTOM}) ".png~GS()" ({IPF}) } + {_GUI_STATE ({POSITIONER_TOP}) ".png~GS()" ({IPF}) } [/state_disabled] [state_pressed] - {_GUI_STATE ({GROOVE_TOP}) ({GROOVE_BOTTOM}) ({POSITIONER_TOP}) ({POSITIONER_BOTTOM}) "-pressed.png" ({IPF}) } + {_GUI_STATE ({POSITIONER_TOP}) "-pressed.png" ({IPF}) } [/state_pressed] [state_focused] - {_GUI_STATE ({GROOVE_TOP}) ({GROOVE_BOTTOM}) ({POSITIONER_TOP}) ({POSITIONER_BOTTOM}) "-active.png" ({IPF}) } + {_GUI_STATE ({POSITIONER_TOP}) "-active.png" ({IPF}) } [/state_focused] [/resolution] #enddef @@ -108,27 +93,10 @@ if(positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM} < 0 # Note a scrollbar is normally sized by the item that "masters" it # that's why the default height is rather low. - {_GUI_RESOLUTION () 25 20 11 4 5 5 5 ()} + {_GUI_RESOLUTION () 25 20 11 2 ()} [/vertical_scrollbar_definition] -# -# This is meant to be used for a minimal scrollbar definition, removing the -# up/down toggle buttons and reducing the width of the bar by 8 px. -# However, since the toggle buttons on a scrollbar panel aren't definition- -# dependent, this is commented out for now. -# -#[vertical_scrollbar_definition] -# id = "minimal" -# description = "a minimal vertical scrollbar" -# -# # Note a scrollbar is normally sized by the item that "masters" it -# # that's why the default height is rather low. - -# {_GUI_RESOLUTION () 17 20 11 4 5 4 4 ()} -# -#[/vertical_scrollbar_definition] - [vertical_scrollbar_definition] id = "transparent" description = "a transparent vertical scrollbar" @@ -136,7 +104,7 @@ if(positioner_length - {POSITIONER_TOP} - {POSITIONER_BOTTOM} < 0 # Note a scrollbar is normally sized by the item that "masters" it # that's why the default height is rather low. - {_GUI_RESOLUTION () 25 20 11 4 5 5 5 "~O(65%)"} + {_GUI_RESOLUTION () 25 20 11 5 "~O(65%)"} [/vertical_scrollbar_definition] diff --git a/images/buttons/scrollbars/scrollbottom-active.png b/images/buttons/scrollbars/scrollbottom-active.png index 77ba8520324d0537bddddc04c6dee305c5d6869a..cba00efbdbd16dfc681d993c54589404882c0cf3 100644 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^{6Nga!3HGTJ=&%KDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fLWeLh5hp##wehWx~Gd{2*>s0l!S*r&M%NZ>mc;w rXGbFleEk3aKTpq^IsYX+*n1chOxWw2+e5bkwJ>^zQaYY4jv*3LlYjjGZ_mtQyrJMv zx`E#^nb$j-4DZCGcs~#eWH)}WrA4gbM+6hY{U)OgVrGlHf%+IcUHx3vIVCg!090Kc AJpcdz diff --git a/images/buttons/scrollbars/scrollbottom-minimal-active.png b/images/buttons/scrollbars/scrollbottom-minimal-active.png deleted file mode 100644 index 291ee7112b7b47e04817ff560fd16488c4096b4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^fgTe~DWM4f D4euyd diff --git a/images/buttons/scrollbars/scrollbottom-minimal-pressed.png b/images/buttons/scrollbars/scrollbottom-minimal-pressed.png deleted file mode 100644 index 876582b2a2a5b0daad96e0575b04b7746707073a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^fF{1rycjtjsGq^p)z4*}Q$iB} DeWe-SYtoS$euShDcoAdS)RngMtY2#nlcI z76iW7|KBF#n+6jbgU~$7tEbGoZcgFqNY)K=pZ<-rVW&F7P5s;aYES)mZ5q$+J^?g@ N!PC{xWt~$(699KaF3bP` diff --git a/images/buttons/scrollbars/scrollbottom-pressed.png b/images/buttons/scrollbars/scrollbottom-pressed.png index e766e3a1015bed1b35b5206b55cfabe4d7e840b2..626e6a760a7c154a8fc578d7e8233d62848822c4 100644 GIT binary patch literal 154 zcmeAS@N?(olHy`uVBq!ia0vp^{6Nga!3HGTJ=&%KDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fLWeLg;$vKg$qzf-P6S}gyVX0O2WgR=M&-&ISBnI r>}~{skN^Mw=jmCq=f9)}dk=##JNxorp3|R!S{OWC{an^LB{Ts571k`! literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQo5cljv*3LlYjjGZ_mtQyy3&2 z^n$zvGSTjhhIe98ydQ`KGA^Fcna8R7;loB2h85o|jlQm9{0r2`;OXk;vd$@?2>_2q BArJrn diff --git a/images/buttons/scrollbars/scrollbottom.png b/images/buttons/scrollbars/scrollbottom.png index 1ad530bd4b0821dc7ee3650d67be34a7c74c7ed3..4a16708602766002028e97803896337e6142ba21 100644 GIT binary patch literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^{6Nga!3HGTJ=&%KDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fLWeLg;8q%l6;_$hNp{T2*>rQ2Nw!5DDbds_#?ZB vsn==q|F%?CkED><+#hq~1r{&(dz$siKc@N(*K=)vdKf%i{an^LB{Ts5*%K>3 literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQhJ^)jv*3LlYjjGZ_mtQyrJMv zy1)eHq{>qp`m`kupLN~Lk|bDaz#QhC(c0dx%3%9Y(BNm`e22WQ%mvv4FO#oio B9y|a5 diff --git a/images/buttons/scrollbars/scrollmid-active.png b/images/buttons/scrollbars/scrollmid-active.png index 000f4f9659ea514781cc323e34f275ca5761525b..0920f4505b1f99454f4ecb10432fbc65e17d8436 100644 GIT binary patch literal 232 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!3HF+w~DI+DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWNq^HEw*OmPNvpkQ6Y8NN}CZJHMr;B5V#O2xv7kLjE@VMN+>Xsy} zvMqtlEm>e$B2(LrI+H-%%SH10j(pthB3NmZmm X+%DO0F8{I=&;bmdu6{1-oD!M<3Q|#v literal 207 zcmV;=05JcFP)P000LF1^@s6{Wa!@0001%NklFE_Q>aoT$XOL+G)|2B>ITn{Rhh)-S5iT3SOw%D+Y5x6@XhYWaFzAHU< zWVO*yGA?oCo#Lh#GMP)`QNpfu|4VDV0zUeV8&5^t6 zec&tGdGjQgQu&X%Q~loCIDtvPVfK# diff --git a/images/buttons/scrollbars/scrollmid-minimal-pressed.png b/images/buttons/scrollbars/scrollmid-minimal-pressed.png deleted file mode 100644 index 1d563b16eee4c61127ed7d1ba33ab32f7fb03a51..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 243 zcmeAS@N?(olHy`uVBq!ia0vp^f21sKVXz(l(xPscY+Tn)Zppj7$R}Gb;3p7Lk>L7^EF?} zOMf^l=izfn*UGUyQLZh4|8rq@Ms;SVi0U-`KK)I-kCNn+_rzZ)6?i_2v3AP7{-*SI zb_a@^Ui+$VOPsz+QvJ?!or_%_uM>Z^FOB-Cd?;zA(DYk7yj|bS%91l*)b6(=<&t%K kP}$_Ybszh$3Vmk$^+@iKfWT~Cpj#L`UHx3vIVCg!0GW7HcmMzZ diff --git a/images/buttons/scrollbars/scrollmid-minimal.png b/images/buttons/scrollbars/scrollmid-minimal.png deleted file mode 100644 index 3acb14116af7672dd9372158004cb7f7d0f8edc1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 247 zcmeAS@N?(olHy`uVBq!ia0vp^f3&zn(BASvyDoLohSQ;U-aTLxOt`&4`y0c3g_;Qd8}c8j4n5EH z6K7Pj&_1E2(EU(X&Wqjuzj@5k<$M!^?z&B$7Qbx@>)T1JVO6=emS#M-H1XeYcRn3n nE&Z^#bDg^SUzhkc@&9DH&!ACwSLd}g&^-*Eu6{1-oD!M<+M`lE diff --git a/images/buttons/scrollbars/scrollmid-pressed.png b/images/buttons/scrollbars/scrollmid-pressed.png index 42414e2030518b4c93bd3545e48648156f4160b6..a62272bf0a7c14429408d2eab3408b5939f6606a 100644 GIT binary patch literal 231 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngk!3HF+w~DI+DYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWNq^HEw*OmPNvpkQ6a&p$HcA!v+r;B5V#O2Znr+HfpcwFu?JaqBY z&Q&dOWEI)`HAnD^p^Q-7!OoPMk1x)45j>o-k2|OSMYV_XN|xkPpJ!~c+jE|0|J1(U z8;h?mWPWe5GT|lX$?4O)mNOP}hi~2d`JC literal 213 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMP!3HG%nm+3QQgb|A978nDPn~#>*U6B_IsVcV z>E8v(ylja~WsRN^4T=$uugln7SmE^O`tlWJIY&)BYZ6NJ`_e1y6qvjmNtCJ>@ zr_-EI1x#-fzPi3K@t)Kp@Bi#ed)I&OXPCXp`-0be_u!?gzAWC>BHrMs$<{GnNge1; N22WQ%mvv4FO#mMRQtyV4dp-)i=e1E_%1N1*&;Nn(;Y`~Hn-70K@KPY*5ohBX z4)t@1s~`BS`lY|>=!Pr5rlp+ywP;__Je94&TIU^3R$JZA+oD!rnYz{N?!xuAXNSp8 a|G{Wtr&yW2Ufu@i1_n=8KbLh*2~7aj2~*er literal 199 zcmeAS@N?(olHy`uVBq!ia0vp^l0eMP!3HG%nm+3QQhlB-jv*DdruI8>IT`Y}+~2Y* zAf}pe`@Q;yrYzh4tI1B>_UF<+C0P#7whwJ5%tEc=&%EVZt}URzB~sKHFWwUIXNE0{ zVbiO%4?ecMZN9HR(Nmb!C?Ws%o1`7C9479)p90IvWA|QZS>M9p;j=_7^6tK0o)!(u z`&9eyXMYvm*?zUs?~6)`*7Zvq8&Bo@d&yn2OpWtl)B7@@%NRUe{an^LB{Ts52$4|b diff --git a/images/buttons/scrollbars/scrolltop-active.png b/images/buttons/scrollbars/scrolltop-active.png index 961297f7cc10a1f3d39b020fc3797c04043d49a7..a63d647c1dbb5fcc7e392ab93d967d4a9cb487a6 100644 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^{6Nga!3HGTJ=&%KDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fLWeLSvOrR&KoFX>gnPb!f`$M&;S4S%!}9Eu4lW% zsI1J)eY~EHxtxtHIX^_xPmkm5ksg8MwoR?7k`mKQ3>g@j`PrW+&a&GHG=Ra=)z4*} HQ$iB}zIQ9q literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQnsEhjv*44lYjjGZ_m8e@bHJN zEsn>(+D|no^OlIP_-8!h$NzMX`K_|)=Ug8&sS3nwk!kb}cPu!bxWUz+n9(ZMDgK-M R5o4f144$rjF6*2UngCQVC{h3b diff --git a/images/buttons/scrollbars/scrolltop-minimal-active.png b/images/buttons/scrollbars/scrolltop-minimal-active.png deleted file mode 100644 index b0ae561f37e716f6fd59a4da7cb612c9d49cb122..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^fmdKI;Vst0D!PGJOBUy diff --git a/images/buttons/scrollbars/scrolltop-minimal-pressed.png b/images/buttons/scrollbars/scrolltop-minimal-pressed.png deleted file mode 100644 index 43fb3828ce5ff083b57e81550bdac19ba3376756..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^f!}?-P*8Ndp3PO)jbYYaPD^Q_C=s9u44$rj JF6*2UngCB-EoA@z diff --git a/images/buttons/scrollbars/scrolltop-pressed.png b/images/buttons/scrollbars/scrolltop-pressed.png index f6ecfa487b027385448fb0bfcc4c850e16c4088e..3c50f2385fbc2752236d8c3a8c7195d3435299a2 100644 GIT binary patch literal 169 zcmeAS@N?(olHy`uVBq!ia0vp^{6Nga!3HGTJ=&%KDYhhUcNd2LAh=-f^2tCE&H|6f zVg?3oVGw3ym^DWND9B#o>Fdh=fLWeLSw-&Gv-dzDGfx-C5RU7~fByfsXI||4rJn5) zqp~tH_xXCZb`3VR+Z=3cX=OgDd;V~kadWp!3rR?L;hV(3uy7}b&Vh`-yMQJzc)I$z JtaD0e0sw%!FHisg literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQVyOjjv*44lYjjGZ_m8e@bHJN zEeEY$*_#^pc}ql8{4?IMFdh=fLWeLS;p)~Tp>_M+tbA{gyVYhpa1{unHR6SUC(xj xQCXRp`*=MYb2%HEC+nlFohJ^zQu>}Qjv*44lYjjGZ_m8e@bHJN zEsn>(+D|no^OlIP_-8!h$N%&XXP5J+e{a%ln#s-JXJhj_ec!C(K&=d(u6{1-oD!M< DM$IHo From d3a825156e418ef650ac0254c994c932ce10adc2 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 23:39:42 +1100 Subject: [PATCH 148/240] tgame_version: bump max dimensions to fit Lato font sizes --- data/gui/window/game_version.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/gui/window/game_version.cfg b/data/gui/window/game_version.cfg index 55ef3f4503d5..126a51055f63 100644 --- a/data/gui/window/game_version.cfg +++ b/data/gui/window/game_version.cfg @@ -365,8 +365,8 @@ definition = "default" click_dismiss = "true" - maximum_width = 600 - maximum_height = 480 + maximum_width = 650 + maximum_height = 490 [tooltip] id = "tooltip" From 2122973a42bd68d5e6aa634d3f475c8002999d76 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 23:43:52 +1100 Subject: [PATCH 149/240] ttext_box: reduced cursor height a little --- data/gui/widget/text_box_default.cfg | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/data/gui/widget/text_box_default.cfg b/data/gui/widget/text_box_default.cfg index a0d56961d8f5..6046377f021d 100644 --- a/data/gui/widget/text_box_default.cfg +++ b/data/gui/widget/text_box_default.cfg @@ -52,9 +52,9 @@ #define _GUI_DRAW_CURSOR X_OFFSET [line] x1 = "(cursor_offset + {X_OFFSET})" - y1 = "(text_y_offset)" + y1 = "(text_y_offset + 2)" x2 = "(cursor_offset + {X_OFFSET})" - y2 = "(text_y_offset + text_font_height)" + y2 = "(text_y_offset + text_font_height - 2)" color = "255, 255, 255, 255" thickness = 1 [/line] From 1df91e01191423b6c96b51deb7ea2ada205a0b83 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 3 Apr 2016 23:45:27 +1100 Subject: [PATCH 150/240] tbutton: provide alpha color values to satisfy schema --- data/gui/widget/button_default.cfg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/gui/widget/button_default.cfg b/data/gui/widget/button_default.cfg index 9ad750d99b20..a6b5b559da92 100644 --- a/data/gui/widget/button_default.cfg +++ b/data/gui/widget/button_default.cfg @@ -100,10 +100,10 @@ # Round the corners # - {_GUI_POINT 0 0 ("")} - {_GUI_POINT 0 "(height - 1)" ("")} - {_GUI_POINT "(width - 1)" 0 ("")} - {_GUI_POINT "(width - 1)" "(height - 1)" ("")} + {_GUI_POINT 0 0 ("0, 0, 0, 0")} + {_GUI_POINT 0 "(height - 1)" ("0, 0, 0, 0")} + {_GUI_POINT "(width - 1)" 0 ("0, 0, 0, 0")} + {_GUI_POINT "(width - 1)" "(height - 1)" ("0, 0, 0, 0")} {_GUI_POINT 1 1 {BORDER_COLOR }} {_GUI_POINT 1 "(height - 2)" {BORDER_COLOR_DARK}} From 0ca4e6c9432a9956e43008c25ec1ce1aa56323b3 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 02:20:52 +1100 Subject: [PATCH 151/240] Convert uses of boost functional to standard library variants This commit converts the following function calls: * boost::bind -> std::bind * boost::function and boost::functionN -> std::function * boost::ref and boost::cref -> std::ref and std::cref * boost::bad_function_call -> std::bad_function_call In the process, it was discovered that std::bind has trouble with overloaded functions. There were two such cases in the code: * gui2::twindow had an ancient unused overload to draw(). The overload was removed. * gui2::trepeating_button was binding tdispatcher::fire. This case was converted to a lambda. --- src/ai/composite/ai.cpp | 19 +- src/ai/composite/aspect.hpp | 14 +- src/ai/composite/property_handler.hpp | 29 ++-- src/ai/default/recruitment.cpp | 8 +- src/ai/default/stage_rca.cpp | 6 +- src/campaign_server/campaign_server.cpp | 2 +- src/campaign_server/campaign_server.hpp | 6 +- src/config.cpp | 4 +- src/construct_dialog.cpp | 6 +- src/display.cpp | 4 +- src/display.hpp | 6 +- src/editor/controller/editor_controller.cpp | 6 +- src/game_events/manager.hpp | 1 - src/game_initialization/mp_options.cpp | 2 +- src/game_initialization/multiplayer.cpp | 6 +- .../multiplayer_configure.cpp | 8 +- .../multiplayer_connect.cpp | 8 +- .../multiplayer_create.cpp | 22 +-- src/game_initialization/multiplayer_lobby.cpp | 20 +-- src/game_initialization/multiplayer_wait.cpp | 6 +- src/game_state.cpp | 2 +- src/gui/auxiliary/field.hpp | 30 ++-- src/gui/core/event/dispatcher.hpp | 16 +- src/gui/core/event/distributor.cpp | 28 +-- src/gui/core/register_widget.hpp | 4 +- src/gui/core/timer.cpp | 4 +- src/gui/core/timer.hpp | 6 +- src/gui/core/window_builder.cpp | 8 +- src/gui/core/window_builder.hpp | 4 +- src/gui/dialogs/addon/connect.cpp | 6 +- src/gui/dialogs/addon/description.cpp | 6 +- src/gui/dialogs/addon/filter_options.cpp | 14 +- src/gui/dialogs/addon/list.cpp | 22 +-- src/gui/dialogs/advanced_graphics_options.cpp | 4 +- src/gui/dialogs/campaign_selection.cpp | 14 +- src/gui/dialogs/campaign_settings.cpp | 6 +- src/gui/dialogs/chat_log.cpp | 16 +- src/gui/dialogs/core_selection.cpp | 6 +- src/gui/dialogs/debug_clock.cpp | 4 +- src/gui/dialogs/dialog.cpp | 16 +- src/gui/dialogs/dialog.hpp | 34 ++-- src/gui/dialogs/drop_down_list.cpp | 10 +- src/gui/dialogs/editor/custom_tod.cpp | 40 ++--- src/gui/dialogs/editor/edit_label.cpp | 6 +- src/gui/dialogs/editor/edit_side.cpp | 2 +- src/gui/dialogs/editor/generate_map.cpp | 8 +- src/gui/dialogs/editor/resize_map.cpp | 10 +- src/gui/dialogs/formula_debugger.cpp | 18 +- src/gui/dialogs/game_cache_options.cpp | 14 +- src/gui/dialogs/game_load.cpp | 20 +-- src/gui/dialogs/game_version.cpp | 14 +- src/gui/dialogs/gamestate_inspector.cpp | 14 +- src/gui/dialogs/helper.hpp | 8 +- src/gui/dialogs/label_settings.cpp | 4 +- src/gui/dialogs/loadscreen.cpp | 8 +- src/gui/dialogs/loadscreen.hpp | 7 +- src/gui/dialogs/lobby/lobby.cpp | 78 ++++----- src/gui/dialogs/lobby/lobby.hpp | 6 +- src/gui/dialogs/lobby/player_info.cpp | 30 ++-- src/gui/dialogs/lua_interpreter.cpp | 12 +- .../dialogs/multiplayer/mp_alerts_options.cpp | 6 +- .../dialogs/multiplayer/mp_change_control.cpp | 10 +- src/gui/dialogs/multiplayer/mp_connect.cpp | 8 +- .../dialogs/multiplayer/mp_create_game.cpp | 2 +- .../multiplayer/synced_choice_wait.cpp | 4 +- src/gui/dialogs/preferences_dialog.cpp | 162 +++++++++--------- src/gui/dialogs/preferences_dialog.hpp | 22 +-- src/gui/dialogs/screenshot_notification.cpp | 10 +- src/gui/dialogs/select_orb_colors.cpp | 10 +- src/gui/dialogs/title_screen.cpp | 60 +++---- src/gui/dialogs/unit_attack.cpp | 8 +- src/gui/dialogs/unit_create.cpp | 16 +- src/gui/dialogs/unit_recruit.cpp | 8 +- src/gui/dialogs/wml_error.cpp | 4 +- src/gui/widgets/button.cpp | 12 +- src/gui/widgets/combobox.cpp | 12 +- src/gui/widgets/combobox.hpp | 6 +- src/gui/widgets/control.cpp | 14 +- src/gui/widgets/drawing.cpp | 2 +- src/gui/widgets/generator.cpp | 4 +- src/gui/widgets/generator.hpp | 10 +- src/gui/widgets/generator_private.hpp | 20 +-- src/gui/widgets/group.hpp | 4 +- src/gui/widgets/horizontal_scrollbar.cpp | 2 +- src/gui/widgets/image.cpp | 2 +- src/gui/widgets/label.cpp | 6 +- src/gui/widgets/list.cpp | 14 +- src/gui/widgets/listbox.cpp | 4 +- src/gui/widgets/listbox.hpp | 8 +- src/gui/widgets/matrix.cpp | 2 +- src/gui/widgets/minimap.cpp | 2 +- src/gui/widgets/multi_page.cpp | 2 +- src/gui/widgets/pane.cpp | 6 +- src/gui/widgets/pane.hpp | 6 +- src/gui/widgets/panel.cpp | 2 +- src/gui/widgets/password_box.cpp | 2 +- src/gui/widgets/progress_bar.cpp | 2 +- src/gui/widgets/repeating_button.cpp | 18 +- src/gui/widgets/scroll_label.cpp | 4 +- src/gui/widgets/scrollbar.cpp | 12 +- src/gui/widgets/scrollbar.hpp | 2 +- src/gui/widgets/scrollbar_container.cpp | 20 +-- src/gui/widgets/scrollbar_panel.cpp | 2 +- src/gui/widgets/selectable.hpp | 4 +- src/gui/widgets/settings.cpp | 4 +- src/gui/widgets/settings.hpp | 4 +- src/gui/widgets/slider.cpp | 10 +- src/gui/widgets/slider.hpp | 2 +- src/gui/widgets/spacer.cpp | 2 +- src/gui/widgets/stacked_widget.cpp | 2 +- src/gui/widgets/text.cpp | 10 +- src/gui/widgets/text.hpp | 6 +- src/gui/widgets/text_box.cpp | 10 +- src/gui/widgets/toggle_button.cpp | 10 +- src/gui/widgets/toggle_button.hpp | 4 +- src/gui/widgets/toggle_panel.cpp | 16 +- src/gui/widgets/toggle_panel.hpp | 8 +- src/gui/widgets/tree_view.cpp | 4 +- src/gui/widgets/tree_view.hpp | 4 +- src/gui/widgets/tree_view_node.cpp | 10 +- src/gui/widgets/tree_view_node.hpp | 8 +- src/gui/widgets/unit_preview_pane.cpp | 4 +- src/gui/widgets/vertical_scrollbar.cpp | 2 +- src/gui/widgets/window.cpp | 35 ++-- src/gui/widgets/window.hpp | 10 -- src/hotkey/command_executor.cpp | 7 +- src/hotkey/hotkey_item.cpp | 4 +- src/image.cpp | 4 +- src/network_asio.cpp | 18 +- src/play_controller.cpp | 5 +- src/playsingle_controller.cpp | 6 +- src/playturn_network_adapter.cpp | 4 +- src/playturn_network_adapter.hpp | 5 +- src/quit_confirmation.hpp | 8 +- src/random_new_synced.cpp | 2 +- src/random_new_synced.hpp | 9 +- src/recall_list_manager.cpp | 20 +-- src/replay_controller.cpp | 2 +- src/replay_controller.hpp | 4 +- src/scripting/application_lua_kernel.cpp | 12 +- src/scripting/application_lua_kernel.hpp | 3 +- src/scripting/game_lua_kernel.cpp | 6 +- src/scripting/lua_cpp_function.cpp | 3 +- src/scripting/lua_cpp_function.hpp | 17 +- src/scripting/lua_gui2.cpp | 6 +- src/scripting/lua_kernel_base.cpp | 24 +-- src/scripting/lua_kernel_base.hpp | 4 +- src/scripting/mapgen_lua_kernel.cpp | 6 +- src/scripting/plugins/context.cpp | 34 ++-- src/scripting/plugins/context.hpp | 21 +-- src/scripting/plugins/manager.cpp | 2 +- src/server/ban.cpp | 8 +- src/server/player_network.hpp | 4 +- src/server/server.cpp | 11 +- src/server/server.hpp | 3 +- src/synced_commands.hpp | 4 +- src/synced_context.hpp | 2 +- src/tests/create_images.cpp | 4 +- src/tests/gui/fire_event.cpp | 8 +- src/tests/gui/test_drop_target.cpp | 8 +- src/tests/gui/test_gui2.cpp | 2 +- src/tests/test_config_cache.cpp | 2 +- src/tests/test_map_location.cpp | 2 +- src/tests/test_sdl_utils.cpp | 4 +- src/tests/test_sdl_utils.hpp | 4 +- src/tests/test_unit_map.cpp | 2 +- src/tod_manager.cpp | 4 +- src/units/unit.cpp | 2 +- src/utils/boost_function_guarded.hpp | 5 - src/utils/functional.hpp | 25 +++ src/wesmage/filter.cpp | 7 +- src/wesnoth.cpp | 10 +- src/whiteboard/highlighter.cpp | 2 +- src/whiteboard/manager.cpp | 6 +- src/whiteboard/side_actions.cpp | 6 +- src/whiteboard/utility.cpp | 2 +- src/whiteboard/utility.hpp | 6 +- src/widgets/drop_target.cpp | 10 +- src/xBRZ/xbrz.cpp | 3 +- 179 files changed, 913 insertions(+), 922 deletions(-) delete mode 100644 src/utils/boost_function_guarded.hpp create mode 100644 src/utils/functional.hpp diff --git a/src/ai/composite/ai.cpp b/src/ai/composite/ai.cpp index 906752cb1649..b08b661be8db 100644 --- a/src/ai/composite/ai.cpp +++ b/src/ai/composite/ai.cpp @@ -29,8 +29,7 @@ #include "actions/attack.hpp" #include "log.hpp" -#include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" namespace ai { @@ -70,17 +69,17 @@ void ai_composite::on_create() e_ptr->set_ai_context(this); } - boost::function2&, const config&> factory_engines = - boost::bind(&ai::ai_composite::create_engine,*this,_1,_2); + std::function&, const config&)> factory_engines = + std::bind(&ai::ai_composite::create_engine,*this,_1,_2); - boost::function2&, const config&> factory_goals = - boost::bind(&ai::ai_composite::create_goal,*this,_1,_2); + std::function&, const config&)> factory_goals = + std::bind(&ai::ai_composite::create_goal,*this,_1,_2); - boost::function2&, const config&> factory_stages = - boost::bind(&ai::ai_composite::create_stage,*this,_1,_2); + std::function&, const config&)> factory_stages = + std::bind(&ai::ai_composite::create_stage,*this,_1,_2); - boost::function3&, const config&, std::string> factory_aspects = - boost::bind(&ai::ai_composite::replace_aspect,*this,_1,_2,_3); + std::function&, const config&, std::string)> factory_aspects = + std::bind(&ai::ai_composite::replace_aspect,*this,_1,_2,_3); register_vector_property(property_handlers(),"engine",get_engines(), factory_engines); register_vector_property(property_handlers(),"goal",get_goals(), factory_goals); diff --git a/src/ai/composite/aspect.hpp b/src/ai/composite/aspect.hpp index 50b72f11e932..5bcc5575251e 100644 --- a/src/ai/composite/aspect.hpp +++ b/src/ai/composite/aspect.hpp @@ -28,7 +28,7 @@ #include "log.hpp" #include "util.hpp" -#include +#include "utils/functional.hpp" #include #ifdef _MSC_VER @@ -78,8 +78,8 @@ class aspect : public readonly_context_proxy, public events::observer, public co { invalidate(); } - - + + virtual bool active() const; virtual std::string get_name() const @@ -96,7 +96,7 @@ class aspect : public readonly_context_proxy, public events::observer, public co protected: std::string time_of_day_; std::string turns_; - + mutable bool valid_; mutable bool valid_variant_; mutable bool valid_lua_; @@ -283,8 +283,8 @@ class composite_aspect : public typesafe_aspect { } } - boost::function2::typesafe_ptr_vector&, const config&> factory_facets = - boost::bind(&ai::composite_aspect::create_facet,*this,_1,_2); + std::function::typesafe_ptr_vector&, const config&)> factory_facets = + std::bind(&ai::composite_aspect::create_facet,*this,_1,_2); register_facets_property(this->property_handlers(),"facet",facets_,default_, factory_facets); @@ -398,7 +398,7 @@ class standard_aspect : public typesafe_aspect { } }; - + class lua_aspect_visitor : public boost::static_visitor { static std::string quote_string(const std::string& s); public: diff --git a/src/ai/composite/property_handler.hpp b/src/ai/composite/property_handler.hpp index 31ddbbeb4f0b..88e04e774640 100644 --- a/src/ai/composite/property_handler.hpp +++ b/src/ai/composite/property_handler.hpp @@ -21,8 +21,7 @@ #ifndef AI_COMPOSITE_PROPERTY_HANDLER_HPP_INCLUDED #define AI_COMPOSITE_PROPERTY_HANDLER_HPP_INCLUDED -#include "utils/boost_function_guarded.hpp" - +#include "utils/functional.hpp" #include "config.hpp" #include "ai/composite/component.hpp" @@ -77,7 +76,7 @@ class vector_property_handler : public base_property_handler { typedef boost::shared_ptr t_ptr; typedef std::vector< boost::shared_ptr > t_ptr_vector; - vector_property_handler(const std::string &property, t_ptr_vector &values, boost::function2 &construction_factory) + vector_property_handler(const std::string &property, t_ptr_vector &values, std::function &construction_factory) : factory_(construction_factory), property_(property), values_(values){} @@ -162,7 +161,7 @@ class vector_property_handler : public base_property_handler { return (j>0); } - boost::function2 factory_; + std::function factory_; const std::string property_; t_ptr_vector &values_; @@ -175,13 +174,13 @@ class facets_property_handler : public vector_property_handler { typedef typename vector_property_handler::t_ptr t_ptr; typedef typename vector_property_handler::t_ptr_vector t_ptr_vector; public: - - facets_property_handler(const std::string &property, t_ptr_vector &values, t_ptr& def, boost::function2 &construction_factory) + + facets_property_handler(const std::string &property, t_ptr_vector &values, t_ptr& def, std::function &construction_factory) : vector_property_handler(property, values, construction_factory) , default_(def) { } - + component* handle_get(const path_element &child) { // special case - 'get the default facet' @@ -190,7 +189,7 @@ class facets_property_handler : public vector_property_handler { } return vector_property_handler::handle_get(child); } - + bool handle_change(const path_element &child, config cfg) { // special case - 'replace the default facet' @@ -202,14 +201,14 @@ class facets_property_handler : public vector_property_handler { } return vector_property_handler::handle_change(child, cfg); } - + std::vector handle_get_children() { std::vector children = vector_property_handler::handle_get_children(); children.push_back(default_.get()); return children; } - + private: t_ptr& default_; }; @@ -222,7 +221,7 @@ class aspect_property_handler : public base_property_handler { typedef boost::shared_ptr t_ptr; typedef std::map< std::string, t_ptr > aspect_map; - aspect_property_handler(const std::string &property, aspect_map &aspects, boost::function3 &construction_factory) + aspect_property_handler(const std::string &property, aspect_map &aspects, std::function &construction_factory) : property_(property), aspects_(aspects), factory_(construction_factory) { } @@ -282,28 +281,28 @@ class aspect_property_handler : public base_property_handler { const std::string &property_; aspect_map &aspects_; - boost::function3 factory_; + std::function factory_; }; template -static void register_vector_property(std::map &property_handlers, const std::string &property, std::vector< boost::shared_ptr > &values, boost::function2 >&, const config&> construction_factory) +static void register_vector_property(std::map &property_handlers, const std::string &property, std::vector< boost::shared_ptr > &values, std::function >&, const config&)> construction_factory) { property_handler_ptr handler_ptr = property_handler_ptr(new vector_property_handler(property,values,construction_factory)); property_handlers.insert(std::make_pair(property,handler_ptr)); } template -static void register_facets_property(std::map &property_handlers, const std::string &property, std::vector< boost::shared_ptr > &values, boost::shared_ptr& def, boost::function2 >&, const config&> construction_factory) +static void register_facets_property(std::map &property_handlers, const std::string &property, std::vector< boost::shared_ptr > &values, boost::shared_ptr& def, std::function >&, const config&)> construction_factory) { property_handler_ptr handler_ptr = property_handler_ptr(new facets_property_handler(property,values,def,construction_factory)); property_handlers.insert(std::make_pair(property,handler_ptr)); } template -static void register_aspect_property(std::map &property_handlers, const std::string &property, std::map< std::string, boost::shared_ptr > &aspects, boost::function3 >&, const config&, std::string> construction_factory) +static void register_aspect_property(std::map &property_handlers, const std::string &property, std::map< std::string, boost::shared_ptr > &aspects, std::function >&, const config&, std::string)> construction_factory) { property_handler_ptr handler_ptr = property_handler_ptr(new aspect_property_handler(property,aspects,construction_factory)); property_handlers.insert(std::make_pair(property,handler_ptr)); diff --git a/src/ai/default/recruitment.cpp b/src/ai/default/recruitment.cpp index f58805eb619c..3ecd8819fedd 100644 --- a/src/ai/default/recruitment.cpp +++ b/src/ai/default/recruitment.cpp @@ -1803,10 +1803,10 @@ recruitment_aspect::recruitment_aspect(readonly_context &context, const config & for (config lim : parsed_cfg.child_range("limit")) { create_limit(limits_, lim); } - boost::function2 >&, const config&> factory_jobs = - boost::bind(&recruitment_aspect::create_job,*this,_1,_2); - boost::function2 >&, const config&> factory_limits = - boost::bind(&recruitment_aspect::create_limit,*this,_1,_2); + std::function >&, const config&)> factory_jobs = + std::bind(&recruitment_aspect::create_job,*this,_1,_2); + std::function >&, const config&)> factory_limits = + std::bind(&recruitment_aspect::create_limit,*this,_1,_2); register_vector_property(property_handlers(), "recruit", jobs_, factory_jobs); register_vector_property(property_handlers(), "limit", limits_, factory_limits); } diff --git a/src/ai/default/stage_rca.cpp b/src/ai/default/stage_rca.cpp index 093cd51eb7df..4232f4030cf3 100644 --- a/src/ai/default/stage_rca.cpp +++ b/src/ai/default/stage_rca.cpp @@ -27,7 +27,7 @@ #include "ai/gamestate_observer.hpp" #include "log.hpp" -#include +#include "utils/functional.hpp" namespace ai { @@ -52,8 +52,8 @@ void candidate_action_evaluation_loop::on_create() engine::parse_candidate_action_from_config(*this,cfg_element,back_inserter(candidate_actions_)); } - boost::function2&, const config&> factory_candidate_actions = - boost::bind(&candidate_action_evaluation_loop::create_candidate_action,*this,_1,_2); + std::function&, const config&)> factory_candidate_actions = + std::bind(&candidate_action_evaluation_loop::create_candidate_action,*this,_1,_2); register_vector_property(property_handlers(),"candidate_action",candidate_actions_, factory_candidate_actions); diff --git a/src/campaign_server/campaign_server.cpp b/src/campaign_server/campaign_server.cpp index 751ffc2e081c..2b9a9041a0ac 100644 --- a/src/campaign_server/campaign_server.cpp +++ b/src/campaign_server/campaign_server.cpp @@ -896,7 +896,7 @@ int main(int argc, char**argv) } catch(network::error& e) { std::cerr << "Aborted with network error: " << e.message << '\n'; return 3; - } catch(boost::bad_function_call& /*e*/) { + } catch(std::bad_function_call& /*e*/) { std::cerr << "Bad request handler function call\n"; return 4; } diff --git a/src/campaign_server/campaign_server.hpp b/src/campaign_server/campaign_server.hpp index fdd3cf938974..92492a56318a 100644 --- a/src/campaign_server/campaign_server.hpp +++ b/src/campaign_server/campaign_server.hpp @@ -19,7 +19,7 @@ #include "network.hpp" #include "server/input_stream.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include #include @@ -78,7 +78,7 @@ class server : private boost::noncopyable {} }; - typedef boost::function request_handler; + typedef std::function request_handler; typedef std::map request_handlers_table; config cfg_; @@ -161,7 +161,7 @@ class server : private boost::noncopyable * @param cmd The request command, corresponding to the name of the [tag} * with the request body (e.g. "handle_request_terms"). * @param func The request function. This should be a class method passed - * as a @a boost::bind function object that takes a single + * as a @a std::bind function object that takes a single * parameter of type @a request. */ void register_handler(const std::string& cmd, const request_handler& func); diff --git a/src/config.cpp b/src/config.cpp index 6e9cc433d192..ba61f016ad1d 100644 --- a/src/config.cpp +++ b/src/config.cpp @@ -31,7 +31,7 @@ #include #include -#include +#include "utils/functional.hpp" #include #include #include @@ -421,7 +421,7 @@ bool config::attribute_value::equals(const std::string &str) const return *this == v; // if c["a"] = "1" then this solution would have resulted in c["a"] == "1" beeing false // because a["a"] is '1' and not '"1"'. - // return boost::apply_visitor(boost::bind( equality_visitor(), _1, boost::cref(str) ), value_); + // return boost::apply_visitor(std::bind( equality_visitor(), _1, boost::cref(str) ), value_); // that's why we don't use it. } diff --git a/src/construct_dialog.cpp b/src/construct_dialog.cpp index 373b0ce28d20..b274c7784c40 100644 --- a/src/construct_dialog.cpp +++ b/src/construct_dialog.cpp @@ -29,7 +29,7 @@ #include "sdl/utils.hpp" #include "sdl/rect.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_display("display"); #define ERR_DP LOG_STREAM(err, log_display) @@ -294,7 +294,7 @@ int dialog::show() )); plugins_context pc("Dialog"); - pc.set_callback("set_result", boost::bind(&dialog::set_result, this, boost::bind(get_int, _1, "result", CLOSE_DIALOG)), false); + pc.set_callback("set_result", std::bind(&dialog::set_result, this, std::bind(get_int, _1, "result", CLOSE_DIALOG)), false); while (pm->any_running() && result() == CONTINUE_DIALOG) { pc.play_slice(); @@ -330,7 +330,7 @@ int dialog::show() )); plugins_context pc("Dialog"); - pc.set_callback("set_result", boost::bind(&dialog::set_result, this, boost::bind(get_int, _1, "result", CLOSE_DIALOG)), false); + pc.set_callback("set_result", std::bind(&dialog::set_result, this, std::bind(get_int, _1, "result", CLOSE_DIALOG)), false); dialog_process_info dp_info; do diff --git a/src/display.cpp b/src/display.cpp index 32c78258df2a..8196908faadc 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -2676,14 +2676,14 @@ void display::redraw_everything() int ticks3 = SDL_GetTicks(); LOG_DP << "invalidate and draw: " << (ticks3 - ticks2) << " and " << (ticks2 - ticks1) << "\n"; - for (boost::function f : redraw_observers_) { + for (std::function f : redraw_observers_) { f(*this); } complete_redraw_event_.notify_observers(); } -void display::add_redraw_observer(boost::function f) +void display::add_redraw_observer(std::function f) { redraw_observers_.push_back(f); } diff --git a/src/display.hpp b/src/display.hpp index e52bf4883aee..f3aa86cc05c9 100644 --- a/src/display.hpp +++ b/src/display.hpp @@ -65,7 +65,7 @@ namespace wb { #include "overlay.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include #include #include @@ -376,7 +376,7 @@ class display : public filter_context, public video2::draw_layering void redraw_everything(); /** Adds a redraw observer, a function object to be called when redraw_everything is used */ - void add_redraw_observer(boost::function f); + void add_redraw_observer(std::function f); /** Clear the redraw observers */ void clear_redraw_observers(); @@ -1148,7 +1148,7 @@ class display : public filter_context, public video2::draw_layering surface map_screenshot_surf_; - std::vector > redraw_observers_; + std::vector > redraw_observers_; /** Debug flag - overlay x,y coords on tiles */ bool draw_coordinates_; diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index 9294f4d4c6f0..606501177a59 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -53,7 +53,7 @@ #include "halo.hpp" -#include +#include "utils/functional.hpp" namespace { static std::vector saved_windows_; @@ -64,7 +64,7 @@ namespace editor { editor_controller::editor_controller(const config &game_config, CVideo& video) : controller_base(game_config, video) , mouse_handler_base() - , quit_confirmation(boost::bind(&editor_controller::quit_confirm, this)) + , quit_confirmation(std::bind(&editor_controller::quit_confirm, this)) , active_menu_(editor::MAP) , reports_(new reports()) , gui_(new editor_display(editor::get_dummy_display_context(), video, *reports_, controller_base::get_theme(game_config, "editor"), config())) @@ -97,7 +97,7 @@ void editor_controller::init_gui() { gui_->change_display_context(&context_manager_->get_map_context()); gui_->set_grid(preferences::grid()); - gui_->add_redraw_observer(boost::bind(&editor_controller::display_redraw_callback, this, _1)); + gui_->add_redraw_observer(std::bind(&editor_controller::display_redraw_callback, this, _1)); floating_label_manager_.reset(new font::floating_label_context()); gui().set_draw_coordinates(preferences::editor::draw_hex_coordinates()); gui().set_draw_terrain_codes(preferences::editor::draw_terrain_codes()); diff --git a/src/game_events/manager.hpp b/src/game_events/manager.hpp index 7c7264a0b086..cc1549c8840f 100644 --- a/src/game_events/manager.hpp +++ b/src/game_events/manager.hpp @@ -18,7 +18,6 @@ #include "game_events/handlers.hpp" #include "game_events/wmi_container.hpp" -#include #include #include #include diff --git a/src/game_initialization/mp_options.cpp b/src/game_initialization/mp_options.cpp index 0d0ed1e58bf5..be01b065dc17 100644 --- a/src/game_initialization/mp_options.cpp +++ b/src/game_initialization/mp_options.cpp @@ -23,7 +23,7 @@ #include "gui/widgets/toggle_button.hpp" #include "widgets/slider.hpp" #include "widgets/textbox.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_mp_create_options("mp/create/options"); #define DBG_MP LOG_STREAM(debug, log_mp_create_options) diff --git a/src/game_initialization/multiplayer.cpp b/src/game_initialization/multiplayer.cpp index 45488f9ddc41..ed7046f38e57 100644 --- a/src/game_initialization/multiplayer.cpp +++ b/src/game_initialization/multiplayer.cpp @@ -50,7 +50,7 @@ #include "video.hpp" #include "game_config_manager.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_network("network"); #define LOG_NW LOG_STREAM(info, log_network) @@ -691,8 +691,8 @@ static void enter_lobby_mode(CVideo& video, const config& game_config, if(preferences::new_lobby()) { gui2::tlobby_main dlg(game_config, li, video); dlg.set_preferences_callback( - boost::bind(do_preferences_dialog, - boost::ref(video), boost::ref(game_config))); + std::bind(do_preferences_dialog, + std::ref(video), std::ref(game_config))); dlg.show(video); //ugly kludge for launching other dialogs like the old lobby switch (dlg.get_legacy_result()) { diff --git a/src/game_initialization/multiplayer_configure.cpp b/src/game_initialization/multiplayer_configure.cpp index 0b020082bec1..e38645e874b9 100644 --- a/src/game_initialization/multiplayer_configure.cpp +++ b/src/game_initialization/multiplayer_configure.cpp @@ -35,7 +35,7 @@ #include "wml_separators.hpp" #include "formula/string_utils.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -231,9 +231,9 @@ configure::configure(CVideo& video, const config &cfg, chat& c, config& gamelist plugins_context_.reset(new plugins_context("Multiplayer Configure")); //These structure initializers create a lobby::process_data_event - plugins_context_->set_callback("launch", boost::bind(&configure::plugin_event_helper, this, process_event_data (true, false))); - plugins_context_->set_callback("quit", boost::bind(&configure::plugin_event_helper, this, process_event_data (false, true))); - plugins_context_->set_callback("set_name", boost::bind(&gui::textbox::set_text, &name_entry_, boost::bind(get_str, _1, "name"), font::NORMAL_COLOR), true); + plugins_context_->set_callback("launch", std::bind(&configure::plugin_event_helper, this, process_event_data (true, false))); + plugins_context_->set_callback("quit", std::bind(&configure::plugin_event_helper, this, process_event_data (false, true))); + plugins_context_->set_callback("set_name", std::bind(&gui::textbox::set_text, &name_entry_, std::bind(get_str, _1, "name"), font::NORMAL_COLOR), true); if(!options_manager_.has_options() && engine_.force_lock_settings() && state_.classification().campaign_type != game_classification::CAMPAIGN_TYPE::MULTIPLAYER) { set_result(CREATE); diff --git a/src/game_initialization/multiplayer_connect.cpp b/src/game_initialization/multiplayer_connect.cpp index 20e2da2c16b6..d8f9fb1334a2 100644 --- a/src/game_initialization/multiplayer_connect.cpp +++ b/src/game_initialization/multiplayer_connect.cpp @@ -29,7 +29,7 @@ #include "scripting/plugins/context.hpp" #include "wml_separators.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_mp_connect("mp/connect"); #define DBG_MP LOG_STREAM(debug, log_mp_connect) @@ -434,9 +434,9 @@ connect::connect(CVideo& v, const std::string& game_name, plugins_context_.reset(new plugins_context("Multiplayer Connect")); //These structure initializers create a lobby::process_data_event - plugins_context_->set_callback("launch", boost::bind(&connect::plugin_event_helper, this, process_event_data (true, false))); - plugins_context_->set_callback("quit", boost::bind(&connect::plugin_event_helper, this, process_event_data (false, true))); - plugins_context_->set_callback("chat", boost::bind(&connect::send_chat_message, this, boost::bind(get_str, _1, "message"), false), true); + plugins_context_->set_callback("launch", std::bind(&connect::plugin_event_helper, this, process_event_data (true, false))); + plugins_context_->set_callback("quit", std::bind(&connect::plugin_event_helper, this, process_event_data (false, true))); + plugins_context_->set_callback("chat", std::bind(&connect::send_chat_message, this, std::bind(get_str, _1, "message"), false), true); } connect::~connect() diff --git a/src/game_initialization/multiplayer_create.cpp b/src/game_initialization/multiplayer_create.cpp index d8e397e6357f..a58875bc7381 100644 --- a/src/game_initialization/multiplayer_create.cpp +++ b/src/game_initialization/multiplayer_create.cpp @@ -47,7 +47,7 @@ #include "sdl/utils.hpp" #include "sdl/rect.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_config("config"); #define ERR_CF LOG_STREAM(err, log_config) @@ -205,16 +205,16 @@ create::create(CVideo& video, const config& cfg, saved_game& state, plugins_context_.reset(new plugins_context("Multiplayer Create")); //These structure initializers create a lobby::process_data_event - plugins_context_->set_callback("create", boost::bind(&create::plugin_event_helper, this, process_event_data (true, false, false))); - plugins_context_->set_callback("load", boost::bind(&create::plugin_event_helper, this, process_event_data (false, true, false))); - plugins_context_->set_callback("quit", boost::bind(&create::plugin_event_helper, this, process_event_data (false, false, true))); - plugins_context_->set_callback("chat", boost::bind(&create::send_chat_message, this, boost::bind(get_str, _1, "message"), false), true); - plugins_context_->set_callback("select_level", boost::bind(&gui::menu::move_selection, &levels_menu_, boost::bind(get_size_t, _1, "index", 0u)), true); - plugins_context_->set_callback("select_type", boost::bind(&create::select_level_type_helper, this, boost::bind(get_str, _1, "type")), true); - - plugins_context_->set_accessor("game_config", boost::bind(&create::game_config, this)); - plugins_context_->set_accessor("get_selected", boost::bind(&get_selected_helper, &engine_)); - plugins_context_->set_accessor("find_level", boost::bind(&find_helper, &engine_, _1)); + plugins_context_->set_callback("create", std::bind(&create::plugin_event_helper, this, process_event_data (true, false, false))); + plugins_context_->set_callback("load", std::bind(&create::plugin_event_helper, this, process_event_data (false, true, false))); + plugins_context_->set_callback("quit", std::bind(&create::plugin_event_helper, this, process_event_data (false, false, true))); + plugins_context_->set_callback("chat", std::bind(&create::send_chat_message, this, std::bind(get_str, _1, "message"), false), true); + plugins_context_->set_callback("select_level", std::bind(&gui::menu::move_selection, &levels_menu_, std::bind(get_size_t, _1, "index", 0u)), true); + plugins_context_->set_callback("select_type", std::bind(&create::select_level_type_helper, this, std::bind(get_str, _1, "type")), true); + + plugins_context_->set_accessor("game_config", std::bind(&create::game_config, this)); + plugins_context_->set_accessor("get_selected", std::bind(&get_selected_helper, &engine_)); + plugins_context_->set_accessor("find_level", std::bind(&find_helper, &engine_, _1)); } void create::select_level_type_helper(const std::string & str) diff --git a/src/game_initialization/multiplayer_lobby.cpp b/src/game_initialization/multiplayer_lobby.cpp index d6d6e6a51f3c..6101ac4bbea2 100644 --- a/src/game_initialization/multiplayer_lobby.cpp +++ b/src/game_initialization/multiplayer_lobby.cpp @@ -45,7 +45,7 @@ #include #include -#include +#include "utils/functional.hpp" #include static lg::log_domain log_config("config"); @@ -1095,15 +1095,15 @@ lobby::lobby(CVideo& v, const config& cfg, chat& c, config& gamelist, const std: plugins_context_.reset(new plugins_context("Multiplayer Lobby")); //These structure initializers create a lobby::process_data_event - plugins_context_->set_callback("join", boost::bind(&lobby::plugin_event_helper, this, process_event_data (true, false, false, false))); - plugins_context_->set_callback("observe", boost::bind(&lobby::plugin_event_helper, this, process_event_data (false, true, false, false))); - plugins_context_->set_callback("create", boost::bind(&lobby::plugin_event_helper, this, process_event_data (false, false, true, false))); - plugins_context_->set_callback("quit", boost::bind(&lobby::plugin_event_helper, this, process_event_data (false, false, false, true))); - plugins_context_->set_callback("chat", boost::bind(&lobby::send_chat_message, this, boost::bind(get_str, _1, "message"), false), true); - plugins_context_->set_callback("select_game", boost::bind(&gamebrowser::select_game, &(this->games_menu_), boost::bind(get_str, _1, "id")), true); - - plugins_context_->set_accessor("game_list", boost::bind(&lobby::gamelist, this)); - plugins_context_->set_accessor("game_config", boost::bind(&lobby::game_config, this)); + plugins_context_->set_callback("join", std::bind(&lobby::plugin_event_helper, this, process_event_data (true, false, false, false))); + plugins_context_->set_callback("observe", std::bind(&lobby::plugin_event_helper, this, process_event_data (false, true, false, false))); + plugins_context_->set_callback("create", std::bind(&lobby::plugin_event_helper, this, process_event_data (false, false, true, false))); + plugins_context_->set_callback("quit", std::bind(&lobby::plugin_event_helper, this, process_event_data (false, false, false, true))); + plugins_context_->set_callback("chat", std::bind(&lobby::send_chat_message, this, std::bind(get_str, _1, "message"), false), true); + plugins_context_->set_callback("select_game", std::bind(&gamebrowser::select_game, &(this->games_menu_), std::bind(get_str, _1, "id")), true); + + plugins_context_->set_accessor("game_list", std::bind(&lobby::gamelist, this)); + plugins_context_->set_accessor("game_config", std::bind(&lobby::game_config, this)); } void lobby::hide_children(bool hide) diff --git a/src/game_initialization/multiplayer_wait.cpp b/src/game_initialization/multiplayer_wait.cpp index 7148e058c0e0..77466fc3674c 100644 --- a/src/game_initialization/multiplayer_wait.cpp +++ b/src/game_initialization/multiplayer_wait.cpp @@ -35,7 +35,7 @@ #include "formula/string_utils.hpp" #include "video.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_network("network"); #define DBG_NW LOG_STREAM(debug, log_network) @@ -210,8 +210,8 @@ wait::wait(CVideo& v, const config& cfg, saved_game& state, plugins_context_.reset(new plugins_context("Multiplayer Wait")); //These structure initializers create a lobby::process_data_event - plugins_context_->set_callback("quit", boost::bind(&wait::process_event_impl, this, true), false); - plugins_context_->set_callback("chat", boost::bind(&wait::send_chat_message, this, boost::bind(get_str, _1, "message"), false), true); + plugins_context_->set_callback("quit", std::bind(&wait::process_event_impl, this, true), false); + plugins_context_->set_callback("chat", std::bind(&wait::send_chat_message, this, std::bind(get_str, _1, "message"), false), true); } wait::~wait() diff --git a/src/game_state.cpp b/src/game_state.cpp index 5bfbd37eba76..bf57de85c709 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -32,7 +32,7 @@ #include "whiteboard/manager.hpp" #include "gui/dialogs/loadscreen.hpp" -#include +#include "utils/functional.hpp" #include #include #include diff --git a/src/gui/auxiliary/field.hpp b/src/gui/auxiliary/field.hpp index cdc5c7f2d41d..20ef5e5385fd 100644 --- a/src/gui/auxiliary/field.hpp +++ b/src/gui/auxiliary/field.hpp @@ -281,8 +281,8 @@ class tfield : public tfield_ */ tfield(const std::string& id, const bool mandatory, - const boost::function& callback_load_value, - const boost::function& callback_save_value) + const std::function& callback_load_value, + const std::function& callback_save_value) : tfield_(id, mandatory) , value_(T()) , link_(value_) @@ -310,8 +310,8 @@ class tfield : public tfield_ : tfield_(id, mandatory) , value_(T()) , link_(linked_variable) - , callback_load_value_(boost::function()) - , callback_save_value_(boost::function()) + , callback_load_value_(std::function()) + , callback_save_value_(std::function()) { BOOST_STATIC_ASSERT((!boost::is_same::value)); } @@ -337,8 +337,8 @@ class tfield : public tfield_ : tfield_(id, mandatory) , value_(value) , link_(value_) - , callback_load_value_(boost::function()) - , callback_save_value_(boost::function()) + , callback_load_value_(std::function()) + , callback_save_value_(std::function()) { BOOST_STATIC_ASSERT((boost::is_same::value)); } @@ -423,7 +423,7 @@ class tfield : public tfield_ * * This is used to load the initial value of the widget, if defined. */ - boost::function callback_load_value_; + std::function callback_load_value_; /** Inherited from tfield_. */ void init_generic(twindow& window) @@ -457,7 +457,7 @@ class tfield : public tfield_ * Once the dialog has been successful this function is used to store the * result of this widget. */ - boost::function callback_save_value_; + std::function callback_save_value_; /** * Test whether the widget exists if the widget is mandatory. @@ -551,9 +551,9 @@ class tfield_bool : public tfield public: tfield_bool(const std::string& id, const bool mandatory, - const boost::function& callback_load_value, - const boost::function& callback_save_value, - const boost::function& callback_change) + const std::function& callback_load_value, + const std::function& callback_save_value, + const std::function& callback_change) : tfield( id, mandatory, callback_load_value, callback_save_value) , callback_change_(callback_change) @@ -563,7 +563,7 @@ class tfield_bool : public tfield tfield_bool(const std::string& id, const bool mandatory, bool& linked_variable, - const boost::function& callback_change) + const std::function& callback_change) : tfield(id, mandatory, linked_variable) , callback_change_(callback_change) { @@ -583,7 +583,7 @@ class tfield_bool : public tfield } } - boost::function callback_change_; + std::function callback_change_; }; /** Specialized field class for text. */ @@ -592,8 +592,8 @@ class tfield_text : public tfield public: tfield_text(const std::string& id, const bool mandatory, - const boost::function& callback_load_value, - const boost::function& + const std::function& callback_load_value, + const std::function& callback_save_value) : tfield( id, mandatory, callback_load_value, callback_save_value) diff --git a/src/gui/core/event/dispatcher.hpp b/src/gui/core/event/dispatcher.hpp index d3b75ac2092d..b50fc88d2e03 100644 --- a/src/gui/core/event/dispatcher.hpp +++ b/src/gui/core/event/dispatcher.hpp @@ -22,7 +22,7 @@ #include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include #include @@ -47,7 +47,7 @@ struct tmessage; * * This function is used for the callbacks in tset_event. */ -typedef boost::function tsignal_function; @@ -56,7 +56,7 @@ tsignal_function; * * This function is used for the callbacks in tset_event_mouse. */ -typedef boost::function tsignal_message_function; /** Hotkey function handler signature. */ -typedef boost::function thotkey_function; /** @@ -261,7 +261,7 @@ class tdispatcher * The function uses some boost magic to avoid registering the wrong * function, but the common way to use this function is: * widget->connect_signal( - * boost::bind(&tmy_dialog::my_member, this)); + * std::bind(&tmy_dialog::my_member, this)); * This allows simply adding a member of a dialog to be used as a callback * for widget without a lot of magic. Note most widgets probably will get a * callback like diff --git a/src/gui/core/event/distributor.cpp b/src/gui/core/event/distributor.cpp index f03564db80bc..363d23f92319 100644 --- a/src/gui/core/event/distributor.cpp +++ b/src/gui/core/event/distributor.cpp @@ -23,7 +23,7 @@ #include "gui/widgets/widget.hpp" #include "gui/widgets/window.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -121,24 +121,24 @@ tmouse_motion::tmouse_motion(twidget& owner, , signal_handler_sdl_mouse_motion_entered_(false) { owner.connect_signal( - boost::bind(&tmouse_motion::signal_handler_sdl_mouse_motion, + std::bind(&tmouse_motion::signal_handler_sdl_mouse_motion, this, _2, _3, _5), queue_position); - owner_.connect_signal(boost::bind( + owner_.connect_signal(std::bind( &tmouse_motion::signal_handler_sdl_wheel, this, _2, _3, _5)); - owner_.connect_signal(boost::bind( + owner_.connect_signal(std::bind( &tmouse_motion::signal_handler_sdl_wheel, this, _2, _3, _5)); - owner_.connect_signal(boost::bind( + owner_.connect_signal(std::bind( &tmouse_motion::signal_handler_sdl_wheel, this, _2, _3, _5)); - owner_.connect_signal(boost::bind( + owner_.connect_signal(std::bind( &tmouse_motion::signal_handler_sdl_wheel, this, _2, _3, _5)); owner.connect_signal( - boost::bind(&tmouse_motion::signal_handler_show_helptip, + std::bind(&tmouse_motion::signal_handler_show_helptip, this, _2, _3, @@ -329,7 +329,7 @@ void tmouse_motion::start_hover_timer(twidget* widget, const tpoint& coordinate) << "' at address " << widget << ".\n"; hover_timer_ - = add_timer(50, boost::bind(&tmouse_motion::show_tooltip, this)); + = add_timer(50, std::bind(&tmouse_motion::show_tooltip, this)); if(hover_timer_) { hover_widget_ = widget; @@ -389,7 +389,7 @@ tmouse_button( - boost::bind(&tmouse_button( - boost::bind(&tmouse_button(boost::bind( + owner_.connect_signal(std::bind( &tdistributor::signal_handler_sdl_key_down, this, _5, _6, _7)); - owner_.connect_signal(boost::bind( + owner_.connect_signal(std::bind( &tdistributor::signal_handler_notify_removal, this, _1, _2)); initialize_state(); @@ -635,10 +635,10 @@ tdistributor::tdistributor(twidget& owner, tdistributor::~tdistributor() { - owner_.disconnect_signal(boost::bind( + owner_.disconnect_signal(std::bind( &tdistributor::signal_handler_sdl_key_down, this, _5, _6, _7)); - owner_.disconnect_signal(boost::bind( + owner_.disconnect_signal(std::bind( &tdistributor::signal_handler_notify_removal, this, _1, _2)); } diff --git a/src/gui/core/register_widget.hpp b/src/gui/core/register_widget.hpp index 1269a8109334..3ae7de41be5e 100644 --- a/src/gui/core/register_widget.hpp +++ b/src/gui/core/register_widget.hpp @@ -42,7 +42,7 @@ tregister_helper() \ { \ register_widget(#id, \ - boost::bind(load_widget_definitions, \ + std::bind(load_widget_definitions, \ _1, \ _2, \ _3, \ @@ -50,7 +50,7 @@ \ register_builder_widget( \ #id, \ - boost::bind( \ + std::bind( \ build_widget, \ _1)); \ } \ diff --git a/src/gui/core/timer.cpp b/src/gui/core/timer.cpp index d3d6b821189c..97f325e43212 100644 --- a/src/gui/core/timer.cpp +++ b/src/gui/core/timer.cpp @@ -34,7 +34,7 @@ struct ttimer SDL_TimerID sdl_id; Uint32 interval; - boost::function callback; + std::function callback; }; /** Ids for the timers. */ @@ -112,7 +112,7 @@ static Uint32 timer_callback(Uint32, void* id) } // extern "C" size_t add_timer(const Uint32 interval, - const boost::function& callback, + const std::function& callback, const bool repeat) { BOOST_STATIC_ASSERT(sizeof(size_t) == sizeof(void*)); diff --git a/src/gui/core/timer.hpp b/src/gui/core/timer.hpp index e6fdfd559a54..243299c3559d 100644 --- a/src/gui/core/timer.hpp +++ b/src/gui/core/timer.hpp @@ -23,14 +23,14 @@ * sense since the timer has expired, but not what the user wants.) * * With these functions it's possible to remove the event between pushing in - * the queue and the actual execution. Since the callback is a boost::function + * the queue and the actual execution. Since the callback is a std::function * object it's possible to make the callback as fancy as wanted. */ #ifndef GUI_WIDGETS_AUXILIARY_TIMER_HPP_INCLUDED #define GUI_WIDGETS_AUXILIARY_TIMER_HPP_INCLUDED -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include @@ -51,7 +51,7 @@ namespace gui2 * @retval [0] Failed to create a timer. */ size_t add_timer(const Uint32 interval, - const boost::function& callback, + const std::function& callback, const bool repeat = false); /** diff --git a/src/gui/core/window_builder.cpp b/src/gui/core/window_builder.cpp index ef976db2643d..b1b0cf082d39 100644 --- a/src/gui/core/window_builder.cpp +++ b/src/gui/core/window_builder.cpp @@ -45,15 +45,15 @@ #include "formula/string_utils.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { -static std::map >& +static std::map >& builder_widget_lookup() { - static std::map > + static std::map > result; return result; } @@ -147,7 +147,7 @@ tbuilder_widget::tbuilder_widget(const config& cfg) void register_builder_widget(const std::string& id, - boost::function functor) + std::function functor) { builder_widget_lookup().insert(std::make_pair(id, functor)); } diff --git a/src/gui/core/window_builder.hpp b/src/gui/core/window_builder.hpp index 474267f1fa57..f15451ee3a92 100644 --- a/src/gui/core/window_builder.hpp +++ b/src/gui/core/window_builder.hpp @@ -19,7 +19,7 @@ #include "gui/widgets/grid.hpp" #include "reference_counted_object.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" class config; class CVideo; @@ -87,7 +87,7 @@ typedef boost::intrusive_ptr const_tbuilder_widget_ptr; */ void register_builder_widget(const std::string& id, - boost::function functor); + std::function functor); /** diff --git a/src/gui/dialogs/addon/connect.cpp b/src/gui/dialogs/addon/connect.cpp index b9bdcc8e89cc..b9466ae43e80 100644 --- a/src/gui/dialogs/addon/connect.cpp +++ b/src/gui/dialogs/addon/connect.cpp @@ -23,7 +23,7 @@ #include "gui/widgets/text_box.hpp" #include "help/help.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -73,9 +73,9 @@ void taddon_connect::pre_show(twindow& window) connect_signal_mouse_left_click( find_widget(&window, "show_help", false), - boost::bind(&taddon_connect::help_button_callback, + std::bind(&taddon_connect::help_button_callback, this, - boost::ref(window))); + std::ref(window))); } void taddon_connect::post_show(twindow& window) diff --git a/src/gui/dialogs/addon/description.cpp b/src/gui/dialogs/addon/description.cpp index 25470a6dbfe0..15792bb740cb 100644 --- a/src/gui/dialogs/addon/description.cpp +++ b/src/gui/dialogs/addon/description.cpp @@ -29,7 +29,7 @@ #include "preferences.hpp" #include "strftime.hpp" -#include +#include "utils/functional.hpp" namespace { @@ -380,11 +380,11 @@ void taddon_description::pre_show(twindow& window) connect_signal_mouse_left_click( url_go_button, - boost::bind(&taddon_description::browse_url_callback, this)); + std::bind(&taddon_description::browse_url_callback, this)); connect_signal_mouse_left_click( url_copy_button, - boost::bind(&taddon_description::copy_url_callback, this)); + std::bind(&taddon_description::copy_url_callback, this)); if (!desktop::clipboard::available()) { url_copy_button.set_active(false); diff --git a/src/gui/dialogs/addon/filter_options.cpp b/src/gui/dialogs/addon/filter_options.cpp index ec8b76c97348..045f6a520d15 100644 --- a/src/gui/dialogs/addon/filter_options.cpp +++ b/src/gui/dialogs/addon/filter_options.cpp @@ -28,7 +28,7 @@ #include "gui/widgets/window.hpp" #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace { @@ -165,8 +165,8 @@ void taddon_filter_options::toggle_all_displayed_types_button_callback( = displayed_types_fields_.end() == std::find_if(displayed_types_fields_.begin(), displayed_types_fields_.end(), - boost::bind(&unchecked_bool_field_finder, - boost::ref(window), + std::bind(&unchecked_bool_field_finder, + std::ref(window), _1)); for(const auto field : displayed_types_fields_) @@ -204,10 +204,10 @@ void taddon_filter_options::pre_show(twindow& window) connect_signal_mouse_left_click( find_widget(&window, "toggle_all_displayed_types", false), - boost::bind(&taddon_filter_options:: + std::bind(&taddon_filter_options:: toggle_all_displayed_types_button_callback, this, - boost::ref(window))); + std::ref(window))); sort_tgroup_.clear(); register_sort_toggle(window, "by_name", SORT_NAMES); @@ -232,7 +232,7 @@ void taddon_filter_options::register_sort_toggle(twindow& window, connect_signal_mouse_left_click( *b, - boost::bind(&taddon_filter_options::toggle_sort_callback, this)); + std::bind(&taddon_filter_options::toggle_sort_callback, this)); } void taddon_filter_options::register_dir_toggle(twindow& window, @@ -248,7 +248,7 @@ void taddon_filter_options::register_dir_toggle(twindow& window, connect_signal_mouse_left_click( *b, - boost::bind(&taddon_filter_options::toggle_dir_callback, this)); + std::bind(&taddon_filter_options::toggle_dir_callback, this)); } void taddon_filter_options::post_show(twindow& window) diff --git a/src/gui/dialogs/addon/list.cpp b/src/gui/dialogs/addon/list.cpp index 0b2c98b0acec..e27328ed18a5 100644 --- a/src/gui/dialogs/addon/list.cpp +++ b/src/gui/dialogs/addon/list.cpp @@ -50,7 +50,7 @@ #include "config.hpp" -#include +#include "utils/functional.hpp" #include namespace gui2 @@ -223,22 +223,22 @@ void taddon_list::register_sort_button(twindow& window, const std::string& id, c { tselectable_& selectable = find_widget(&window, id, true); orders_.push_back(&selectable); - selectable.set_callback_state_change(boost::bind(&taddon_list::on_order_button_click, this, boost::ref(window), up, down, _1)); + selectable.set_callback_state_change(std::bind(&taddon_list::on_order_button_click, this, std::ref(window), up, down, _1)); } void taddon_list::register_sort_button_alphabetical(twindow& window, const std::string& id, const std::string& prop_id) { register_sort_button(window, id, - boost::bind(&str_up, &cfg_, prop_id, _1, _2), - boost::bind(&str_down, &cfg_, prop_id, _1, _2) + std::bind(&str_up, &cfg_, prop_id, _1, _2), + std::bind(&str_down, &cfg_, prop_id, _1, _2) ); } void taddon_list::register_sort_button_numeric(twindow& window, const std::string& id, const std::string& prop_id) { register_sort_button(window, id, - boost::bind(&num_up, &cfg_, prop_id, _1, _2), - boost::bind(&num_down, &cfg_, prop_id, _1, _2) + std::bind(&num_up, &cfg_, prop_id, _1, _2), + std::bind(&num_down, &cfg_, prop_id, _1, _2) ); } @@ -422,13 +422,13 @@ void taddon_list::pre_show(twindow& window) register_sort_button_numeric(window, "sort_size", "size"); find_widget(&window, "filter", false).set_text_changed_callback( - boost::bind(&taddon_list::on_filtertext_changed, this, _1, _2)); + std::bind(&taddon_list::on_filtertext_changed, this, _1, _2)); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(list, - boost::bind(&taddon_list::on_addon_select, + std::bind(&taddon_list::on_addon_select, *this, - boost::ref(window))); + std::ref(window))); #else list.set_callback_value_change( dialog_callback); @@ -453,11 +453,11 @@ void taddon_list::pre_show(twindow& window) connect_signal_mouse_left_click( url_go_button, - boost::bind(&taddon_list::browse_url_callback, this, boost::ref(url_textbox))); + std::bind(&taddon_list::browse_url_callback, this, std::ref(url_textbox))); connect_signal_mouse_left_click( url_copy_button, - boost::bind(&taddon_list::copy_url_callback, this, boost::ref(url_textbox))); + std::bind(&taddon_list::copy_url_callback, this, std::ref(url_textbox))); on_addon_select(window); } diff --git a/src/gui/dialogs/advanced_graphics_options.cpp b/src/gui/dialogs/advanced_graphics_options.cpp index 6410642e0875..034ab7a4deb0 100644 --- a/src/gui/dialogs/advanced_graphics_options.cpp +++ b/src/gui/dialogs/advanced_graphics_options.cpp @@ -29,7 +29,7 @@ #include "preferences.hpp" #include "formula/string_utils.hpp" -#include +#include "utils/functional.hpp" #include "gettext.hpp" @@ -87,7 +87,7 @@ void tadvanced_graphics_options::pre_show(twindow& window) /* tbutton * defaults; defaults = &find_widget(&window,"revert_to_defaults", false); - connect_signal_mouse_left_click(*defaults, boost::bind(&revert_to_default_pref_values, boost::ref(window))); + connect_signal_mouse_left_click(*defaults, std::bind(&revert_to_default_pref_values, std::ref(window))); */ } diff --git a/src/gui/dialogs/campaign_selection.cpp b/src/gui/dialogs/campaign_selection.cpp index 7bd799b20211..4f4cd1904183 100644 --- a/src/gui/dialogs/campaign_selection.cpp +++ b/src/gui/dialogs/campaign_selection.cpp @@ -36,7 +36,7 @@ #include "gui/widgets/window.hpp" #include "serialization/string_utils.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -127,9 +127,9 @@ void tcampaign_selection::pre_show(twindow& window) = find_widget(&window, "campaign_tree", false); tree.set_selection_change_callback( - boost::bind(&tcampaign_selection::campaign_selected, + std::bind(&tcampaign_selection::campaign_selected, this, - boost::ref(window))); + std::ref(window))); window.keyboard_capture(&tree); @@ -196,7 +196,7 @@ void tcampaign_selection::pre_show(twindow& window) VALIDATE(checkbox, missing_widget("checkb")); checkbox->set_value(active); checkbox->set_label(mod->name); - checkbox->set_callback_state_change(boost::bind(&tcampaign_selection::mod_toggled, this, id, _1)); + checkbox->set_callback_state_change(std::bind(&tcampaign_selection::mod_toggled, this, id, _1)); ++id; } } @@ -213,9 +213,9 @@ void tcampaign_selection::pre_show(twindow& window) #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( list, - boost::bind(&tcampaign_selection::campaign_selected, + std::bind(&tcampaign_selection::campaign_selected, this, - boost::ref(window))); + std::ref(window))); #else list.set_callback_value_change( dialog_callback(&window, "advanced_settings", false, false); if(advanced_settings_button) { advanced_settings_button->connect_click_handler( - boost::bind(&tcampaign_selection::show_settings, this, boost::ref(window.video()))); + std::bind(&tcampaign_selection::show_settings, this, std::ref(window.video()))); } } diff --git a/src/gui/dialogs/campaign_settings.cpp b/src/gui/dialogs/campaign_settings.cpp index 4e34ab736b0e..75688702375b 100644 --- a/src/gui/dialogs/campaign_settings.cpp +++ b/src/gui/dialogs/campaign_settings.cpp @@ -29,7 +29,7 @@ #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/window.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -170,9 +170,9 @@ void tcampaign_settings::pre_show(twindow& window) } era_list.set_callback_item_change( - boost::bind(&tcampaign_settings::change_era, this, boost::ref(window))); + std::bind(&tcampaign_settings::change_era, this, std::ref(window))); mod_list.set_callback_item_change( - boost::bind(&tcampaign_settings::change_mod, this, _1, boost::ref(window))); + std::bind(&tcampaign_settings::change_mod, this, _1, std::ref(window))); } void tcampaign_settings::post_show(twindow& window) diff --git a/src/gui/dialogs/chat_log.cpp b/src/gui/dialogs/chat_log.cpp index 5c8b94f13a91..92f420d67d42 100644 --- a/src/gui/dialogs/chat_log.cpp +++ b/src/gui/dialogs/chat_log.cpp @@ -38,7 +38,7 @@ #include "gettext.hpp" #include -#include +#include "utils/functional.hpp" #include static lg::log_domain log_chat_log("chat_log"); @@ -389,30 +389,30 @@ class tchat_log::view = &find_widget(&window, "page_number", false); connect_signal_notify_modified( *model_.page_number, - boost::bind(&view::handle_page_number_changed, + std::bind(&view::handle_page_number_changed, this, - boost::ref(window))); + std::ref(window))); model_.previous_page = &find_widget(&window, "previous_page", false); model_.previous_page->connect_click_handler( - boost::bind(&view::previous_page, this, boost::ref(window))); + std::bind(&view::previous_page, this, std::ref(window))); model_.next_page = &find_widget(&window, "next_page", false); model_.next_page->connect_click_handler( - boost::bind(&view::next_page, this, boost::ref(window))); + std::bind(&view::next_page, this, std::ref(window))); model_.filter = &find_widget(&window, "filter", false); model_.filter->set_text_changed_callback( - boost::bind(&view::filter, this, boost::ref(window))); + std::bind(&view::filter, this, std::ref(window))); window.keyboard_capture(model_.filter); model_.copy_button = &find_widget(&window, "copy", false); connect_signal_mouse_left_click( *model_.copy_button, - boost::bind(&view::handle_copy_button_clicked, + std::bind(&view::handle_copy_button_clicked, this, - boost::ref(window))); + std::ref(window))); if (!desktop::clipboard::available()) { model_.copy_button->set_active(false); model_.copy_button->set_tooltip(_("Clipboard support not found, contact your packager")); diff --git a/src/gui/dialogs/core_selection.cpp b/src/gui/dialogs/core_selection.cpp index f1fc52b289e5..fba3f7d6e8c6 100644 --- a/src/gui/dialogs/core_selection.cpp +++ b/src/gui/dialogs/core_selection.cpp @@ -30,7 +30,7 @@ #include "gui/widgets/window.hpp" #include "serialization/string_utils.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -89,9 +89,9 @@ void tcore_selection::pre_show(twindow& window) #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( list, - boost::bind(&tcore_selection::core_selected, + std::bind(&tcore_selection::core_selected, this, - boost::ref(window))); + std::ref(window))); #else list.set_callback_value_change( dialog_callback +#include "utils/functional.hpp" #include @@ -103,7 +103,7 @@ void tdebug_clock::pre_show(twindow& window) window_ = &window; - signal_ = boost::bind(&tdebug_clock::update_time, this, false); + signal_ = std::bind(&tdebug_clock::update_time, this, false); window.connect_signal(signal_, event::tdispatcher::front_child); diff --git a/src/gui/dialogs/dialog.cpp b/src/gui/dialogs/dialog.cpp index 362d2897f422..4bf1015c8d7c 100644 --- a/src/gui/dialogs/dialog.cpp +++ b/src/gui/dialogs/dialog.cpp @@ -74,9 +74,9 @@ bool tdialog::show(CVideo& video, const unsigned auto_close_time) tfield_bool* tdialog::register_bool( const std::string& id, const bool mandatory, - const boost::function& callback_load_value, - const boost::function& callback_save_value, - const boost::function& callback_change) + const std::function& callback_load_value, + const std::function& callback_save_value, + const std::function& callback_change) { tfield_bool* field = new tfield_bool(id, mandatory, @@ -92,7 +92,7 @@ tfield_bool* tdialog::register_bool(const std::string& id, const bool mandatory, bool& linked_variable, - const boost::function& callback_change) + const std::function& callback_change) { tfield_bool* field = new tfield_bool(id, mandatory, linked_variable, callback_change); @@ -104,8 +104,8 @@ tdialog::register_bool(const std::string& id, tfield_integer* tdialog::register_integer( const std::string& id, const bool mandatory, - const boost::function& callback_load_value, - const boost::function& callback_save_value) + const std::function& callback_load_value, + const std::function& callback_save_value) { tfield_integer* field = new tfield_integer( id, mandatory, callback_load_value, callback_save_value); @@ -127,8 +127,8 @@ tfield_integer* tdialog::register_integer(const std::string& id, tfield_text* tdialog::register_text( const std::string& id, const bool mandatory, - const boost::function& callback_load_value, - const boost::function& callback_save_value, + const std::function& callback_load_value, + const std::function& callback_save_value, const bool capture_focus) { tfield_text* field = new tfield_text( diff --git a/src/gui/dialogs/dialog.hpp b/src/gui/dialogs/dialog.hpp index 2f50394e35ef..02c7e5602726 100644 --- a/src/gui/dialogs/dialog.hpp +++ b/src/gui/dialogs/dialog.hpp @@ -17,7 +17,7 @@ #include "gui/auxiliary/field-fwd.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include #include @@ -196,12 +196,12 @@ class tdialog tfield_bool* register_bool(const std::string& id, const bool mandatory, - const boost::function& callback_load_value - = boost::function(), - const boost::function& callback_save_value - = boost::function(), - const boost::function& callback_change - = boost::function()); + const std::function& callback_load_value + = std::function(), + const std::function& callback_save_value + = std::function(), + const std::function& callback_change + = std::function()); /** * Creates a new boolean field. @@ -222,8 +222,8 @@ class tdialog register_bool(const std::string& id, const bool mandatory, bool& linked_variable, - const boost::function& callback_change - = boost::function()); + const std::function& callback_change + = std::function()); /** * Creates a new integer field. @@ -233,10 +233,10 @@ class tdialog tfield_integer* register_integer(const std::string& id, const bool mandatory, - const boost::function& callback_load_value - = boost::function(), - const boost::function& callback_save_value - = boost::function()); + const std::function& callback_load_value + = std::function(), + const std::function& callback_save_value + = std::function()); /** * Creates a new integer field. @@ -254,10 +254,10 @@ class tdialog tfield_text* register_text( const std::string& id, const bool mandatory, - const boost::function& callback_load_value - = boost::function(), - const boost::function& callback_save_value - = boost::function(), + const std::function& callback_load_value + = std::function(), + const std::function& callback_save_value + = std::function(), const bool capture_focus = false); /** diff --git a/src/gui/dialogs/drop_down_list.cpp b/src/gui/dialogs/drop_down_list.cpp index a5e709c725cd..630c5c6171f1 100644 --- a/src/gui/dialogs/drop_down_list.cpp +++ b/src/gui/dialogs/drop_down_list.cpp @@ -21,8 +21,8 @@ #include "gui/widgets/integer_selector.hpp" #include "gui/widgets/window.hpp" #include "gui/widgets/settings.hpp" -#include -#include + +#include "utils/functional.hpp" namespace gui2 { @@ -63,11 +63,11 @@ void tdrop_down_list::pre_show(twindow& window) } list.select_row(selected_item_); - list.set_callback_item_change(boost::bind(&tdrop_down_list::item_change_callback, this, boost::ref(window), _1)); + list.set_callback_item_change(std::bind(&tdrop_down_list::item_change_callback, this, std::ref(window), _1)); //Dismiss on click outside the window - window.connect_signal(boost::bind(&click_callback, boost::ref(window), _3, _4, _5), event::tdispatcher::front_child); + window.connect_signal(std::bind(&click_callback, std::ref(window), _3, _4, _5), event::tdispatcher::front_child); //Dismiss on resize - window.connect_signal(boost::bind(&resize_callback, boost::ref(window)), event::tdispatcher::front_child); + window.connect_signal(std::bind(&resize_callback, std::ref(window)), event::tdispatcher::front_child); } void tdrop_down_list::item_change_callback(twindow& window, size_t item) diff --git a/src/gui/dialogs/editor/custom_tod.cpp b/src/gui/dialogs/editor/custom_tod.cpp index 9ea878a0d4dd..b89bcf5dd22c 100644 --- a/src/gui/dialogs/editor/custom_tod.cpp +++ b/src/gui/dialogs/editor/custom_tod.cpp @@ -32,7 +32,7 @@ #include "gettext.hpp" #include "image.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -272,81 +272,81 @@ void tcustom_tod::pre_show(twindow& window) tbutton& image_button = find_widget(&window, "image_button", false); connect_signal_mouse_left_click(image_button, - boost::bind(&tcustom_tod::select_file, + std::bind(&tcustom_tod::select_file, this, get_selected_tod().image, "data/core/images/misc", "image", - boost::ref(window))); + std::ref(window))); tbutton& mask_button = find_widget(&window, "mask_button", false); ; connect_signal_mouse_left_click(mask_button, - boost::bind(&tcustom_tod::select_file, + std::bind(&tcustom_tod::select_file, this, get_selected_tod().image_mask, "data/core/images", "mask", - boost::ref(window))); + std::ref(window))); tbutton& sound_button = find_widget(&window, "sound_button", false); connect_signal_mouse_left_click(sound_button, - boost::bind(&tcustom_tod::select_file, + std::bind(&tcustom_tod::select_file, this, get_selected_tod().sounds, "data/core/sounds/ambient", "sound", - boost::ref(window))); + std::ref(window))); tbutton& next_tod_button = find_widget(&window, "next_tod", false); connect_signal_mouse_left_click( next_tod_button, - boost::bind(&tcustom_tod::do_next_tod, this, boost::ref(window))); + std::bind(&tcustom_tod::do_next_tod, this, std::ref(window))); tbutton& prev_tod_button = find_widget(&window, "previous_tod", false); connect_signal_mouse_left_click( prev_tod_button, - boost::bind(&tcustom_tod::do_prev_tod, this, boost::ref(window))); + std::bind(&tcustom_tod::do_prev_tod, this, std::ref(window))); tbutton& new_button = find_widget(&window, "new", false); connect_signal_mouse_left_click( new_button, - boost::bind(&tcustom_tod::do_new_tod, this, boost::ref(window))); + std::bind(&tcustom_tod::do_new_tod, this, std::ref(window))); tbutton& delete_button = find_widget(&window, "delete", false); connect_signal_mouse_left_click( delete_button, - boost::bind(&tcustom_tod::do_delete_tod, this, boost::ref(window))); + std::bind(&tcustom_tod::do_delete_tod, this, std::ref(window))); tbutton& save_button = find_widget(&window, "save", false); connect_signal_mouse_left_click( - save_button, boost::bind(&tcustom_tod::do_save_schedule, this)); + save_button, std::bind(&tcustom_tod::do_save_schedule, this)); connect_signal_notify_modified( *(lawful_bonus_field_->widget()), - boost::bind(&tcustom_tod::update_lawful_bonus, + std::bind(&tcustom_tod::update_lawful_bonus, this, - boost::ref(window))); + std::ref(window))); connect_signal_notify_modified( *(tod_red_field_->widget()), - boost::bind(&tcustom_tod::slider_update_callback, + std::bind(&tcustom_tod::slider_update_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_notify_modified( *(tod_green_field_->widget()), - boost::bind(&tcustom_tod::slider_update_callback, + std::bind(&tcustom_tod::slider_update_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_notify_modified( *(tod_blue_field_->widget()), - boost::bind(&tcustom_tod::slider_update_callback, + std::bind(&tcustom_tod::slider_update_callback, this, - boost::ref(window))); + std::ref(window))); for(size_t i = 0; i < tods_.size(); ++i) { diff --git a/src/gui/dialogs/editor/edit_label.cpp b/src/gui/dialogs/editor/edit_label.cpp index 2d3d6b77e8b9..c2e8b33ee946 100644 --- a/src/gui/dialogs/editor/edit_label.cpp +++ b/src/gui/dialogs/editor/edit_label.cpp @@ -19,7 +19,7 @@ #include "gui/widgets/settings.hpp" #include -#include +#include "utils/functional.hpp" namespace gui2 { @@ -82,8 +82,8 @@ teditor_edit_label::teditor_edit_label(std::string& text, void teditor_edit_label::register_color_component(std::string widget_id, Uint8 SDL_Color::* component) { register_integer(widget_id, true, - boost::bind(&teditor_edit_label::load_color_component, this, component), - boost::bind(&teditor_edit_label::save_color_component, this, component, _1)); + std::bind(&teditor_edit_label::load_color_component, this, component), + std::bind(&teditor_edit_label::save_color_component, this, component, _1)); } int teditor_edit_label::load_color_component(Uint8 SDL_Color::* component) { diff --git a/src/gui/dialogs/editor/edit_side.cpp b/src/gui/dialogs/editor/edit_side.cpp index f8a68ee8c276..ad7e21cd1460 100644 --- a/src/gui/dialogs/editor/edit_side.cpp +++ b/src/gui/dialogs/editor/edit_side.cpp @@ -20,7 +20,7 @@ #include "gui/widgets/toggle_button.hpp" #include "gui/widgets/settings.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/dialogs/editor/generate_map.cpp b/src/gui/dialogs/editor/generate_map.cpp index 6636b14dc79e..15db04cfcf86 100644 --- a/src/gui/dialogs/editor/generate_map.cpp +++ b/src/gui/dialogs/editor/generate_map.cpp @@ -29,7 +29,7 @@ #include "gui/widgets/text_box.hpp" #include "generators/map_generator.hpp" -#include +#include "utils/functional.hpp" #define ERR_ED LOG_STREAM_INDENT(err, editor) @@ -132,14 +132,14 @@ void teditor_generate_map::pre_show(twindow& window) } list.set_callback_item_change( - boost::bind(&teditor_generate_map::do_generator_selected, this, boost::ref(window))); + std::bind(&teditor_generate_map::do_generator_selected, this, std::ref(window))); tbutton& settings_button = find_widget(&window, "settings", false); connect_signal_mouse_left_click( settings_button, - boost::bind(&teditor_generate_map::do_settings, + std::bind(&teditor_generate_map::do_settings, this, - boost::ref(window))); + std::ref(window))); } boost::optional teditor_generate_map::get_seed() diff --git a/src/gui/dialogs/editor/resize_map.cpp b/src/gui/dialogs/editor/resize_map.cpp index 054a8920db17..bde302f2ba9e 100644 --- a/src/gui/dialogs/editor/resize_map.cpp +++ b/src/gui/dialogs/editor/resize_map.cpp @@ -21,7 +21,7 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/slider.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -109,16 +109,16 @@ void teditor_resize_map::pre_show(twindow& window) tslider& height = find_widget(&window, "height", false); connect_signal_notify_modified( height, - boost::bind(&teditor_resize_map::update_expand_direction, + std::bind(&teditor_resize_map::update_expand_direction, this, - boost::ref(window))); + std::ref(window))); tslider& width = find_widget(&window, "width", false); connect_signal_notify_modified( width, - boost::bind(&teditor_resize_map::update_expand_direction, + std::bind(&teditor_resize_map::update_expand_direction, this, - boost::ref(window))); + std::ref(window))); std::string name_prefix = "expand"; for(int i = 0; i < 9; ++i) { diff --git a/src/gui/dialogs/formula_debugger.cpp b/src/gui/dialogs/formula_debugger.cpp index 4b2dd62c0f9f..f4c228a6ebd3 100644 --- a/src/gui/dialogs/formula_debugger.cpp +++ b/src/gui/dialogs/formula_debugger.cpp @@ -24,7 +24,7 @@ #include "gui/widgets/window.hpp" #include "formula/debugger.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -135,30 +135,30 @@ void tformula_debugger::pre_show(twindow& window) tbutton& step_button = find_widget(&window, "step", false); connect_signal_mouse_left_click( step_button, - boost::bind(&tformula_debugger::callback_step_button, + std::bind(&tformula_debugger::callback_step_button, this, - boost::ref(window))); + std::ref(window))); tbutton& stepout_button = find_widget(&window, "stepout", false); connect_signal_mouse_left_click( stepout_button, - boost::bind(&tformula_debugger::callback_stepout_button, + std::bind(&tformula_debugger::callback_stepout_button, this, - boost::ref(window))); + std::ref(window))); tbutton& next_button = find_widget(&window, "next", false); connect_signal_mouse_left_click( next_button, - boost::bind(&tformula_debugger::callback_next_button, + std::bind(&tformula_debugger::callback_next_button, this, - boost::ref(window))); + std::ref(window))); tbutton& continue_button = find_widget(&window, "continue", false); connect_signal_mouse_left_click( continue_button, - boost::bind(&tformula_debugger::callback_continue_button, + std::bind(&tformula_debugger::callback_continue_button, this, - boost::ref(window))); + std::ref(window))); if(is_end) { step_button.set_active(false); diff --git a/src/gui/dialogs/game_cache_options.cpp b/src/gui/dialogs/game_cache_options.cpp index d37d2db36810..dea0b4de04ac 100644 --- a/src/gui/dialogs/game_cache_options.cpp +++ b/src/gui/dialogs/game_cache_options.cpp @@ -29,7 +29,7 @@ #include "gui/widgets/text_box.hpp" #include "gui/widgets/window.hpp" -#include +#include "utils/functional.hpp" #include "gettext.hpp" @@ -96,7 +96,7 @@ void tgame_cache_options::pre_show(twindow& window) tbutton& copy = find_widget(&window, "copy", false); connect_signal_mouse_left_click(copy, - boost::bind(&tgame_cache_options::copy_to_clipboard_callback, + std::bind(&tgame_cache_options::copy_to_clipboard_callback, this)); if (!desktop::clipboard::available()) { copy.set_active(false); @@ -105,18 +105,18 @@ void tgame_cache_options::pre_show(twindow& window) tbutton& browse = find_widget(&window, "browse", false); connect_signal_mouse_left_click(browse, - boost::bind(&tgame_cache_options::browse_cache_callback, + std::bind(&tgame_cache_options::browse_cache_callback, this)); connect_signal_mouse_left_click(*clean_button_, - boost::bind(&tgame_cache_options::clean_cache_callback, + std::bind(&tgame_cache_options::clean_cache_callback, this, - boost::ref(window.video()))); + std::ref(window.video()))); connect_signal_mouse_left_click(*purge_button_, - boost::bind(&tgame_cache_options::purge_cache_callback, + std::bind(&tgame_cache_options::purge_cache_callback, this, - boost::ref(window.video()))); + std::ref(window.video()))); } void tgame_cache_options::post_show(twindow& /*window*/) diff --git a/src/gui/dialogs/game_load.cpp b/src/gui/dialogs/game_load.cpp index 76254a4295c6..db5693c7a1a8 100644 --- a/src/gui/dialogs/game_load.cpp +++ b/src/gui/dialogs/game_load.cpp @@ -44,7 +44,7 @@ #include "serialization/string_utils.hpp" #include -#include +#include "utils/functional.hpp" namespace gui2 { @@ -114,16 +114,16 @@ void tgame_load::pre_show(twindow& window) = find_widget(&window, "txtFilter", false, true); filter->set_text_changed_callback( - boost::bind(&tgame_load::filter_text_changed, this, _1, _2)); + std::bind(&tgame_load::filter_text_changed, this, _1, _2)); tlistbox* list = find_widget(&window, "savegame_list", false, true); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(*list, - boost::bind(&tgame_load::list_item_clicked, + std::bind(&tgame_load::list_item_clicked, *this, - boost::ref(window))); + std::ref(window))); #else list->set_callback_value_change( dialog_callback); @@ -138,9 +138,9 @@ void tgame_load::pre_show(twindow& window) connect_signal_mouse_left_click( find_widget(&window, "delete", false), - boost::bind(&tgame_load::delete_button_callback, + std::bind(&tgame_load::delete_button_callback, this, - boost::ref(window))); + std::ref(window))); display_savegame(window); } @@ -187,11 +187,11 @@ void tgame_load::fill_game_list(twindow& window, list.add_row(data); } std::vector order_funcs(2); - order_funcs[0] = boost::bind(&tgame_load::compare_name, this, _1, _2); - order_funcs[1] = boost::bind(&tgame_load::compare_name_rev, this, _1, _2); + order_funcs[0] = std::bind(&tgame_load::compare_name, this, _1, _2); + order_funcs[1] = std::bind(&tgame_load::compare_name_rev, this, _1, _2); list.set_column_order(0, order_funcs); - order_funcs[0] = boost::bind(&tgame_load::compare_date, this, _1, _2); - order_funcs[1] = boost::bind(&tgame_load::compare_date_rev, this, _1, _2); + order_funcs[0] = std::bind(&tgame_load::compare_date, this, _1, _2); + order_funcs[1] = std::bind(&tgame_load::compare_date_rev, this, _1, _2); list.set_column_order(1, order_funcs); } diff --git a/src/gui/dialogs/game_version.cpp b/src/gui/dialogs/game_version.cpp index 5ffe01e5c151..170decf74d72 100644 --- a/src/gui/dialogs/game_version.cpp +++ b/src/gui/dialogs/game_version.cpp @@ -45,7 +45,7 @@ #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace { @@ -143,7 +143,7 @@ void tgame_version::pre_show(twindow& window) tbutton& copy_all = find_widget(&window, "copy_all", false); connect_signal_mouse_left_click( copy_all, - boost::bind(&tgame_version::report_copy_callback, this)); + std::bind(&tgame_version::report_copy_callback, this)); // // Game paths tab. @@ -166,12 +166,12 @@ void tgame_version::pre_show(twindow& window) connect_signal_mouse_left_click( copy_w, - boost::bind(&tgame_version::copy_to_clipboard_callback, + std::bind(&tgame_version::copy_to_clipboard_callback, this, path_path)); connect_signal_mouse_left_click( browse_w, - boost::bind(&tgame_version::browse_directory_callback, + std::bind(&tgame_version::browse_directory_callback, this, path_path)); @@ -196,7 +196,7 @@ void tgame_version::pre_show(twindow& window) = find_widget(&window, "open_stderr", false); connect_signal_mouse_left_click( stderr_button, - boost::bind(&tgame_version::browse_directory_callback, + std::bind(&tgame_version::browse_directory_callback, this, log_path_)); stderr_button.set_active(!log_path_.empty()); @@ -285,9 +285,9 @@ void tgame_version::pre_show(twindow& window) for(unsigned k = 0; k < tab_count; ++k) { #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(tab_bar, - boost::bind(&tgame_version::tab_switch_callback, + std::bind(&tgame_version::tab_switch_callback, *this, - boost::ref(window))); + std::ref(window))); #else tab_bar.set_callback_value_change( dialog_callback); diff --git a/src/gui/dialogs/gamestate_inspector.cpp b/src/gui/dialogs/gamestate_inspector.cpp index 9ede465e3d51..6eeb828fd2fc 100644 --- a/src/gui/dialogs/gamestate_inspector.cpp +++ b/src/gui/dialogs/gamestate_inspector.cpp @@ -44,7 +44,7 @@ #include "filter_context.hpp" #include -#include +#include "utils/functional.hpp" #include namespace @@ -830,13 +830,13 @@ class tgamestate_inspector::view #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( *model_.stuff_list, - boost::bind(&tgamestate_inspector::view:: + std::bind(&tgamestate_inspector::view:: handle_stuff_list_item_clicked, this)); connect_signal_notify_modified( *model_.stuff_types_list, - boost::bind(&tgamestate_inspector::view:: + std::bind(&tgamestate_inspector::view:: handle_stuff_list_item_clicked, this)); @@ -856,15 +856,15 @@ class tgamestate_inspector::view connect_signal_mouse_left_click( *model_.copy_button, - boost::bind(&tgamestate_inspector::view::handle_copy_button_clicked, + std::bind(&tgamestate_inspector::view::handle_copy_button_clicked, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( *model_.lua_button, - boost::bind(&tgamestate_inspector::view::handle_lua_button_clicked, + std::bind(&tgamestate_inspector::view::handle_lua_button_clicked, this, - boost::ref(window))); + std::ref(window))); if (!desktop::clipboard::available()) { model_.copy_button->set_active(false); diff --git a/src/gui/dialogs/helper.hpp b/src/gui/dialogs/helper.hpp index 3b3605977248..9618171a8be7 100644 --- a/src/gui/dialogs/helper.hpp +++ b/src/gui/dialogs/helper.hpp @@ -17,7 +17,7 @@ #include "gui/widgets/window.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -37,7 +37,7 @@ void dialog_callback(twidget& caller) (dialog->*fptr)(*window); } -typedef boost::function dialog_member_func_type; +typedef std::function dialog_member_func_type; inline void make_dialog_callback_helper(const dialog_member_func_type & t, twidget & caller) @@ -47,10 +47,10 @@ inline void make_dialog_callback_helper(const dialog_member_func_type & t, t(*window); } -inline boost::function make_dialog_callback( +inline std::function make_dialog_callback( dialog_member_func_type func) { - return boost::bind(make_dialog_callback_helper, func, _1); + return std::bind(make_dialog_callback_helper, func, _1); } } // namespace gui2 diff --git a/src/gui/dialogs/label_settings.cpp b/src/gui/dialogs/label_settings.cpp index d7586fa2c9d8..3b921d87caac 100644 --- a/src/gui/dialogs/label_settings.cpp +++ b/src/gui/dialogs/label_settings.cpp @@ -16,7 +16,7 @@ #include "label_settings.hpp" #include -#include +#include "utils/functional.hpp" #include "gettext.hpp" #include "game_display.hpp" #include "map/label.hpp" @@ -99,7 +99,7 @@ void tlabel_settings::pre_show(twindow& window) { tgrid* grid = cats_listbox.get_row_grid(cats_listbox.get_item_count() - 1); ttoggle_button& status = find_widget(grid, "cat_status", false); status.set_value(visible); - status.set_callback_state_change(boost::bind(&tlabel_settings::toggle_category, this, _1, category)); + status.set_callback_state_change(std::bind(&tlabel_settings::toggle_category, this, _1, category)); if(category.substr(0,5) == "side:") { tlabel& label = find_widget(grid, "cat_name", false); diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index c2e95fe064fe..f66bda39e5df 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -29,7 +29,7 @@ #include "cursor.hpp" #include "gettext.hpp" #include "log.hpp" -#include +#include "utils/functional.hpp" #include static lg::log_domain log_loadscreen("loadscreen"); @@ -63,7 +63,7 @@ namespace gui2 REGISTER_DIALOG(loadscreen) -tloadscreen::tloadscreen(boost::function f) +tloadscreen::tloadscreen(std::function f) : window_(nullptr) , timer_id_(0) , animation_counter_(0) @@ -93,7 +93,7 @@ twindow* tloadscreen::build_window(CVideo& video) const void tloadscreen::pre_show(twindow& window) { worker_.reset(new boost::thread(work_)); - timer_id_ = add_timer(100, boost::bind(&tloadscreen::timer_callback, this, boost::ref(window)), true); + timer_id_ = add_timer(100, std::bind(&tloadscreen::timer_callback, this, std::ref(window)), true); cursor_setter_.reset(new cursor::setter(cursor::WAIT)); progress_stage_label_ = &find_widget(&window, "status", false); animation_label_ = &find_widget(&window, "test_animation", false); @@ -162,7 +162,7 @@ tloadscreen::~tloadscreen() current_load = nullptr; } -void tloadscreen::display(CVideo& video, boost::function f) +void tloadscreen::display(CVideo& video, std::function f) { if (current_load || video.faked()) { f(); diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 68cb27fa2d6a..15b5e6e0f7ee 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -16,7 +16,6 @@ #include "gui/dialogs/dialog.hpp" #include "gui/widgets/label.hpp" -#include #include #include #include @@ -39,11 +38,11 @@ class tloadscreen : public tdialog { public: - tloadscreen(boost::function f); + tloadscreen(std::function f); ~tloadscreen(); - static void display(CVideo& video, boost::function f); + static void display(CVideo& video, std::function f); static bool displaying() { return current_load != nullptr; } static void progress(const char* stage_name = nullptr); @@ -59,7 +58,7 @@ class tloadscreen : public tdialog twindow* window_; size_t timer_id_; int animation_counter_; - boost::function work_; + std::function work_; boost::scoped_ptr worker_; boost::scoped_ptr cursor_setter_; diff --git a/src/gui/dialogs/lobby/lobby.cpp b/src/gui/dialogs/lobby/lobby.cpp index 3930ce192f5e..fcf752b9bba9 100644 --- a/src/gui/dialogs/lobby/lobby.cpp +++ b/src/gui/dialogs/lobby/lobby.cpp @@ -47,7 +47,7 @@ #include "playmp_controller.hpp" #include "mp_ui_alerts.hpp" -#include +#include "utils/functional.hpp" static lg::log_domain log_network("network"); #define DBG_NW LOG_STREAM(debug, log_network) @@ -80,7 +80,7 @@ void tsub_player_list::init(gui2::twindow& w, const std::string& id) = find_widget(&w, id + "_show_toggle", false, true); show_toggle->set_icon_name("lobby/group-expanded.png"); show_toggle->set_callback_state_change( - boost::bind(&tsub_player_list::show_toggle_callback, this, _1)); + std::bind(&tsub_player_list::show_toggle_callback, this, _1)); count = find_widget(&w, id + "_count", false, true); label = find_widget(&w, id + "_label", false, true); @@ -384,7 +384,7 @@ struct lobby_delay_gamelist_update_guard tlobby_main& l; }; -void tlobby_main::set_preferences_callback(boost::function cb) +void tlobby_main::set_preferences_callback(std::function cb) { preferences_callback_ = cb; } @@ -408,17 +408,17 @@ void tlobby_main::post_build(twindow& window) { /** @todo Should become a global hotkey after 1.8, then remove it here. */ window.register_hotkey(hotkey::HOTKEY_FULLSCREEN, - boost::bind(fullscreen, boost::ref(window.video()))); + std::bind(fullscreen, std::ref(window.video()))); /*** Local hotkeys. ***/ preferences_wrapper_ - = boost::bind(&tlobby_main::show_preferences_button_callback, + = std::bind(&tlobby_main::show_preferences_button_callback, this, - boost::ref(window)); + std::ref(window)); window.register_hotkey( hotkey::HOTKEY_PREFERENCES, - boost::bind(function_wrapper >, + std::bind(function_wrapper >, true, boost::cref(preferences_wrapper_))); } @@ -706,7 +706,7 @@ void tlobby_main::adjust_game_row_contents(const game_info& game, ttoggle_panel& row_panel = find_widget(grid, "panel", false); row_panel.set_callback_mouse_left_double_click( - boost::bind(&tlobby_main::join_or_observe, this, idx)); + std::bind(&tlobby_main::join_or_observe, this, idx)); set_visible_if_exists(grid, "time_limit_icon", !game.time_limit.empty()); set_visible_if_exists(grid, "vision_fog", game.fog); @@ -726,9 +726,9 @@ void tlobby_main::adjust_game_row_contents(const game_info& game, if(join_button) { connect_signal_mouse_left_click( *join_button, - boost::bind(&tlobby_main::join_button_callback, + std::bind(&tlobby_main::join_button_callback, this, - boost::ref(*window_))); + std::ref(*window_))); join_button->set_active(game.can_join()); } tbutton* observe_button @@ -736,9 +736,9 @@ void tlobby_main::adjust_game_row_contents(const game_info& game, if(observe_button) { connect_signal_mouse_left_click( *observe_button, - boost::bind(&tlobby_main::observe_button_callback, + std::bind(&tlobby_main::observe_button_callback, this, - boost::ref(*window_))); + std::ref(*window_))); observe_button->set_active(game.can_observe()); } tminimap* minimap = dynamic_cast(grid->find("minimap", false)); @@ -868,7 +868,7 @@ void tlobby_main::update_playerlist() = target_list->tree->add_child("player", tree_group_item); find_widget(&player, "tree_view_node_label", false) - .set_callback_mouse_left_double_click(boost::bind( + .set_callback_mouse_left_double_click(std::bind( &tlobby_main::user_dialog_callback, this, userptr)); } player_list_.active_game.auto_hide(); @@ -906,9 +906,9 @@ void tlobby_main::pre_show(twindow& window) #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( *roomlistbox_, - boost::bind(&tlobby_main::room_switch_callback, + std::bind(&tlobby_main::room_switch_callback, *this, - boost::ref(window))); + std::ref(window))); #else roomlistbox_->set_callback_value_change( dialog_callback); @@ -918,9 +918,9 @@ void tlobby_main::pre_show(twindow& window) #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( *gamelistbox_, - boost::bind(&tlobby_main::gamelist_change_callback, + std::bind(&tlobby_main::gamelist_change_callback, *this, - boost::ref(window))); + std::ref(window))); #else gamelistbox_->set_callback_value_change( dialog_callbackset_callback_state_change( - boost::bind(&tlobby_main::player_filter_callback, this, _1)); + std::bind(&tlobby_main::player_filter_callback, this, _1)); player_list_.sort_by_relation->set_callback_state_change( - boost::bind(&tlobby_main::player_filter_callback, this, _1)); + std::bind(&tlobby_main::player_filter_callback, this, _1)); chat_log_container_ = find_widget( &window, "chat_log_container", false, true); @@ -950,50 +950,50 @@ void tlobby_main::pre_show(twindow& window) assert(chat_input_); connect_signal_pre_key_press( *chat_input_, - boost::bind(&tlobby_main::chat_input_keypress_callback, + std::bind(&tlobby_main::chat_input_keypress_callback, this, _3, _4, _5, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "create", false), - boost::bind(&tlobby_main::create_button_callback, + std::bind(&tlobby_main::create_button_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "refresh", false), - boost::bind(&tlobby_main::refresh_button_callback, + std::bind(&tlobby_main::refresh_button_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "show_preferences", false), - boost::bind(&tlobby_main::show_preferences_button_callback, + std::bind(&tlobby_main::show_preferences_button_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "join_global", false), - boost::bind(&tlobby_main::join_global_button_callback, + std::bind(&tlobby_main::join_global_button_callback, this, - boost::ref(window))); + std::ref(window))); find_widget(&window, "join_global", false).set_active(false); connect_signal_mouse_left_click( find_widget(&window, "observe_global", false), - boost::bind(&tlobby_main::observe_global_button_callback, + std::bind(&tlobby_main::observe_global_button_callback, this, - boost::ref(window))); + std::ref(window))); find_widget(&window, "observe_global", false).set_active(false); ttoggle_button& skip_replay = find_widget(&window, "skip_replay", false); skip_replay.set_value(preferences::skip_mp_replay()); skip_replay.set_callback_state_change( - boost::bind(&tlobby_main::skip_replay_changed_callback, this, _1)); + std::bind(&tlobby_main::skip_replay_changed_callback, this, _1)); filter_friends_ = find_widget( &window, "filter_with_friends", false, true); @@ -1006,16 +1006,16 @@ void tlobby_main::pre_show(twindow& window) filter_text_ = find_widget(&window, "filter_text", false, true); filter_friends_->set_callback_state_change( - boost::bind(&tlobby_main::game_filter_change_callback, this, _1)); + std::bind(&tlobby_main::game_filter_change_callback, this, _1)); filter_ignored_->set_callback_state_change( - boost::bind(&tlobby_main::game_filter_change_callback, this, _1)); + std::bind(&tlobby_main::game_filter_change_callback, this, _1)); filter_slots_->set_callback_state_change( - boost::bind(&tlobby_main::game_filter_change_callback, this, _1)); + std::bind(&tlobby_main::game_filter_change_callback, this, _1)); filter_invert_->set_callback_state_change( - boost::bind(&tlobby_main::game_filter_change_callback, this, _1)); + std::bind(&tlobby_main::game_filter_change_callback, this, _1)); connect_signal_pre_key_press( *filter_text_, - boost::bind(&tlobby_main::game_filter_keypress_callback, this, _5)); + std::bind(&tlobby_main::game_filter_keypress_callback, this, _5)); room_window_open("lobby", true); active_window_changed(); @@ -1025,7 +1025,7 @@ void tlobby_main::pre_show(twindow& window) tlobby_main::network_handler(); lobby_update_timer_ = add_timer(game_config::lobby_network_timer, - boost::bind(&tlobby_main::network_handler, this), + std::bind(&tlobby_main::network_handler, this), true); } @@ -1091,7 +1091,7 @@ tlobby_chat_window* tlobby_main::search_create_window(const std::string& name, const int row_index = roomlistbox_->get_item_count() - 1; tbutton& close_button = find_widget(roomlistbox_->get_row_grid(row_index), "close_window", false); connect_signal_mouse_left_click(close_button, - boost::bind(&tlobby_main::close_window_button_callback, + std::bind(&tlobby_main::close_window_button_callback, this, row_index)); if(name == "lobby") { diff --git a/src/gui/dialogs/lobby/lobby.hpp b/src/gui/dialogs/lobby/lobby.hpp index 5ec574f23e66..0be852801a4c 100644 --- a/src/gui/dialogs/lobby/lobby.hpp +++ b/src/gui/dialogs/lobby/lobby.hpp @@ -91,7 +91,7 @@ class tlobby_main : public tdialog, private events::chat_handler /** * Set the callback used to show the preferences. */ - void set_preferences_callback(boost::function f); + void set_preferences_callback(std::function f); void update_gamelist(); @@ -381,7 +381,7 @@ class tlobby_main : public tdialog, private events::chat_handler lobby_info& lobby_info_; - boost::function preferences_callback_; + std::function preferences_callback_; /** * This represents the open chat windows (rooms and whispers at the moment) @@ -419,7 +419,7 @@ class tlobby_main : public tdialog, private events::chat_handler size_t lobby_update_timer_; /** Wrapper for the preferences hotkey. */ - boost::function preferences_wrapper_; + std::function preferences_wrapper_; std::vector gamelist_id_at_row_; diff --git a/src/gui/dialogs/lobby/player_info.cpp b/src/gui/dialogs/lobby/player_info.cpp index 437b2165faea..8703f5c0ed64 100644 --- a/src/gui/dialogs/lobby/player_info.cpp +++ b/src/gui/dialogs/lobby/player_info.cpp @@ -23,7 +23,7 @@ #include "game_preferences.hpp" #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -55,49 +55,49 @@ void tlobby_player_info::pre_show(twindow& window) relation_ = find_widget(&window, "relation_info", false, true); connect_signal_mouse_left_click( find_widget(&window, "start_whisper", false), - boost::bind(&tlobby_player_info::start_whisper_button_callback, + std::bind(&tlobby_player_info::start_whisper_button_callback, this, - boost::ref(window))); + std::ref(window))); add_to_friends_ = &find_widget(&window, "add_to_friends", false); connect_signal_mouse_left_click( *add_to_friends_, - boost::bind(&tlobby_player_info::add_to_friends_button_callback, + std::bind(&tlobby_player_info::add_to_friends_button_callback, this, - boost::ref(window))); + std::ref(window))); add_to_ignores_ = &find_widget(&window, "add_to_ignores", false); connect_signal_mouse_left_click( *add_to_ignores_, - boost::bind(&tlobby_player_info::add_to_ignores_button_callback, + std::bind(&tlobby_player_info::add_to_ignores_button_callback, this, - boost::ref(window))); + std::ref(window))); remove_from_list_ = &find_widget(&window, "remove_from_list", false); connect_signal_mouse_left_click( *remove_from_list_, - boost::bind(&tlobby_player_info::remove_from_list_button_callback, + std::bind(&tlobby_player_info::remove_from_list_button_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "check_status", false), - boost::bind(&tlobby_player_info::check_status_button_callback, + std::bind(&tlobby_player_info::check_status_button_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "kick", false), - boost::bind(&tlobby_player_info::kick_button_callback, + std::bind(&tlobby_player_info::kick_button_callback, this, - boost::ref(window))); + std::ref(window))); connect_signal_mouse_left_click( find_widget(&window, "kick_ban", false), - boost::bind(&tlobby_player_info::kick_ban_button_callback, + std::bind(&tlobby_player_info::kick_ban_button_callback, this, - boost::ref(window))); + std::ref(window))); find_widget(&window, "player_name", false).set_label(info_.name); diff --git a/src/gui/dialogs/lua_interpreter.cpp b/src/gui/dialogs/lua_interpreter.cpp index f1e7d1024f63..39cb0dbbdc2f 100644 --- a/src/gui/dialogs/lua_interpreter.cpp +++ b/src/gui/dialogs/lua_interpreter.cpp @@ -42,7 +42,7 @@ #include #include #include -#include +#include "utils/functional.hpp" #include #ifdef HAVE_HISTORY @@ -433,27 +433,27 @@ void tlua_interpreter::controller::bind(twindow& window) text_entry = &find_widget(&window, "text_entry", false); //text_entry->set_text_changed_callback( - // boost::bind(&view::filter, this, boost::ref(window))); + // std::bind(&view::filter, this, std::ref(window))); window.keyboard_capture(text_entry); window.set_click_dismiss(false); window.set_enter_disabled(true); connect_signal_pre_key_press( *text_entry, - boost::bind(&tlua_interpreter::controller::input_keypress_callback, + std::bind(&tlua_interpreter::controller::input_keypress_callback, this, _3, _4, _5, - boost::ref(window))); + std::ref(window))); copy_button = &find_widget(&window, "copy", false); connect_signal_mouse_left_click( *copy_button, - boost::bind(&tlua_interpreter::controller::handle_copy_button_clicked, + std::bind(&tlua_interpreter::controller::handle_copy_button_clicked, this, - boost::ref(window))); + std::ref(window))); if (!desktop::clipboard::available()) { copy_button->set_active(false); diff --git a/src/gui/dialogs/multiplayer/mp_alerts_options.cpp b/src/gui/dialogs/multiplayer/mp_alerts_options.cpp index 5e2b063f61fa..026adb531256 100644 --- a/src/gui/dialogs/multiplayer/mp_alerts_options.cpp +++ b/src/gui/dialogs/multiplayer/mp_alerts_options.cpp @@ -29,7 +29,7 @@ #include "preferences.hpp" #include "formula/string_utils.hpp" -#include +#include "utils/functional.hpp" #include "gettext.hpp" @@ -75,7 +75,7 @@ static ttoggle_button * setup_pref_toggle_button(const std::string & id, bool de //Needed to disambiguate overloaded function void (*set) (const std::string &, bool) = &preferences::set; - connect_signal_mouse_left_click(*b, boost::bind(set, id, boost::bind(&ttoggle_button::get_value_bool, b))); + connect_signal_mouse_left_click(*b, std::bind(set, id, std::bind(&ttoggle_button::get_value_bool, b))); return b; } @@ -149,7 +149,7 @@ void tmp_alerts_options::pre_show(twindow& window) tbutton * defaults; defaults = &find_widget(&window,"revert_to_defaults", false); - connect_signal_mouse_left_click(*defaults, boost::bind(&revert_to_default_pref_values, boost::ref(window))); + connect_signal_mouse_left_click(*defaults, std::bind(&revert_to_default_pref_values, std::ref(window))); } void tmp_alerts_options::post_show(twindow& /*window*/) diff --git a/src/gui/dialogs/multiplayer/mp_change_control.cpp b/src/gui/dialogs/multiplayer/mp_change_control.cpp index 774568740fe4..48f7c538d2bd 100644 --- a/src/gui/dialogs/multiplayer/mp_change_control.cpp +++ b/src/gui/dialogs/multiplayer/mp_change_control.cpp @@ -37,7 +37,7 @@ #include "team.hpp" #include -#include +#include "utils/functional.hpp" #include static lg::log_domain log_gui("gui/dialogs/mp_change_control"); @@ -352,17 +352,17 @@ class tmp_change_control::view #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified( *model_.sides_list, - boost::bind(&tmp_change_control::view:: + std::bind(&tmp_change_control::view:: handle_sides_list_item_clicked, this, - boost::ref(window))); + std::ref(window))); connect_signal_notify_modified( *model_.nicks_list, - boost::bind(&tmp_change_control::view:: + std::bind(&tmp_change_control::view:: handle_nicks_list_item_clicked, this, - boost::ref(window))); + std::ref(window))); #else model_.sides_list->set_callback_value_change( dialog_view_callback +#include "utils/functional.hpp" namespace gui2 { @@ -179,9 +179,9 @@ void tmp_connect::pre_show(twindow& window) if(tbutton* button = find_widget(&window, "list", false, false)) { connect_signal_mouse_left_click(*button, - boost::bind(show_server_list, - boost::ref(window.video()), - boost::ref(window), + std::bind(show_server_list, + std::ref(window.video()), + std::ref(window), host_name_)); } } diff --git a/src/gui/dialogs/multiplayer/mp_create_game.cpp b/src/gui/dialogs/multiplayer/mp_create_game.cpp index b3f0f3a1d2bb..7944954777c0 100644 --- a/src/gui/dialogs/multiplayer/mp_create_game.cpp +++ b/src/gui/dialogs/multiplayer/mp_create_game.cpp @@ -34,7 +34,7 @@ #include "settings.hpp" #ifdef GUI2_EXPERIMENTAL_LISTBOX -#include +#include "utils/functional.hpp" #endif namespace gui2 diff --git a/src/gui/dialogs/multiplayer/synced_choice_wait.cpp b/src/gui/dialogs/multiplayer/synced_choice_wait.cpp index ecfed27cd579..1539e77f98e8 100644 --- a/src/gui/dialogs/multiplayer/synced_choice_wait.cpp +++ b/src/gui/dialogs/multiplayer/synced_choice_wait.cpp @@ -26,7 +26,7 @@ #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -77,7 +77,7 @@ void tsynced_choice_wait::pre_show(twindow& window) &window, "btn_quit_game", false); connect_signal_mouse_left_click(quit_button, - boost::bind(&quit_confirmation::quit_to_title)); + std::bind(&quit_confirmation::quit_to_title)); message_->set_label(mgr_.wait_message()); if(mgr_.finished() || !mgr_.waiting()) { diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index 44058437bd99..e76de3a05b70 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -60,7 +60,7 @@ #include "gettext.hpp" #include -#include +#include "utils/functional.hpp" #include namespace { @@ -192,7 +192,7 @@ static void set_resolution_list(tcombobox& res_list, CVideo& video) void tpreferences::setup_single_toggle( const std::string& widget_id, const bool start_value, - boost::function callback, + std::function callback, twidget& find_in, const bool inverted) { @@ -201,9 +201,9 @@ void tpreferences::setup_single_toggle( widget.set_value(start_value); - connect_signal_mouse_left_click(widget, boost::bind( + connect_signal_mouse_left_click(widget, std::bind( &tpreferences::single_toggle_callback, - this, boost::ref(widget), callback, inverted)); + this, std::ref(widget), callback, inverted)); } void tpreferences::setup_toggle_slider_pair( @@ -211,8 +211,8 @@ void tpreferences::setup_toggle_slider_pair( const std::string& slider_widget, const bool toggle_start_value, const int slider_state_value, - boost::function toggle_callback, - boost::function slider_callback, + std::function toggle_callback, + std::function slider_callback, twidget& find_in) { ttoggle_button& button = @@ -224,29 +224,29 @@ void tpreferences::setup_toggle_slider_pair( slider.set_value(slider_state_value); slider.set_active(toggle_start_value); - connect_signal_mouse_left_click(button, boost::bind( + connect_signal_mouse_left_click(button, std::bind( &tpreferences::toggle_slider_pair_callback, - this, boost::ref(button), boost::ref(slider), + this, std::ref(button), std::ref(slider), toggle_callback)); - connect_signal_notify_modified(slider, boost::bind( + connect_signal_notify_modified(slider, std::bind( &tpreferences::single_slider_callback, - this, boost::ref(slider), + this, std::ref(slider), slider_callback)); } void tpreferences::setup_single_slider( const std::string& widget_id, const int start_value, - boost::function slider_callback, + std::function slider_callback, twidget& find_in) { tslider& widget = find_widget(&find_in, widget_id, false); widget.set_value(start_value); - connect_signal_notify_modified(widget, boost::bind( + connect_signal_notify_modified(widget, std::bind( &tpreferences::single_slider_callback, - this, boost::ref(widget), + this, std::ref(widget), slider_callback)); } @@ -254,7 +254,7 @@ void tpreferences::setup_combobox( const std::string& widget_id, const combo_data& options, const unsigned start_value, - boost::function callback, + std::function callback, twidget& find_in) { tcombobox& widget = @@ -263,9 +263,9 @@ void tpreferences::setup_combobox( widget.set_use_markup(true); widget.set_values(options.first, start_value); - connect_signal_mouse_left_click(widget, boost::bind( + connect_signal_mouse_left_click(widget, std::bind( &tpreferences::simple_combobox_callback, - this, boost::ref(widget), + this, std::ref(widget), callback, options.second)); } @@ -275,7 +275,7 @@ void tpreferences::setup_radio_toggle( const T& enum_value, const int start_value, tgroup& group, - boost::function callback, + std::function callback, twindow& window) { ttoggle_button& button = find_widget(&window, toggle_id, false); @@ -284,7 +284,7 @@ void tpreferences::setup_radio_toggle( group.add_member(&button, enum_value); - connect_signal_mouse_left_click(button, boost::bind( + connect_signal_mouse_left_click(button, std::bind( &tpreferences::toggle_radio_callback, this, group, callback)); } @@ -296,9 +296,9 @@ void tpreferences::bind_status_label(T& parent, const std::string& label_id, tcontrol& label = find_widget(&find_in, label_id, false); label.set_label(disambiguate_widget_value(parent)); - parent.set_callback_state_change(boost::bind( + parent.set_callback_state_change(std::bind( &tpreferences::status_label_callback, - this, boost::ref(parent), boost::ref(label), "")); + this, std::ref(parent), std::ref(label), "")); } void tpreferences::bind_status_label(tslider& parent, const std::string& label_id, @@ -307,9 +307,9 @@ void tpreferences::bind_status_label(tslider& parent, const std::string& label_i tcontrol& label = find_widget(&find_in, label_id, false); label.set_label(lexical_cast(parent.get_value_label()) + suffix); - connect_signal_notify_modified(parent, boost::bind( + connect_signal_notify_modified(parent, std::bind( &tpreferences::status_label_callback, - this, boost::ref(parent), boost::ref(label), suffix)); + this, std::ref(parent), std::ref(label), suffix)); } void tpreferences::setup_friends_list(twindow& window) @@ -458,15 +458,15 @@ void tpreferences::initialize_members(twindow& window) accl_slider.set_value(selected_speed + 1); accl_slider.set_active(is_turbo); - connect_signal_mouse_left_click(accl_toggle, boost::bind( + connect_signal_mouse_left_click(accl_toggle, std::bind( &tpreferences::toggle_slider_pair_callback, - this, boost::ref(accl_toggle), boost::ref(accl_slider), + this, std::ref(accl_toggle), std::ref(accl_slider), set_turbo)); - connect_signal_notify_modified(accl_slider, boost::bind( + connect_signal_notify_modified(accl_slider, std::bind( &tpreferences::accl_speed_slider_callback, this, - boost::ref(accl_slider))); + std::ref(accl_slider))); bind_status_label(accl_slider, "turbo_value", window); @@ -511,14 +511,14 @@ void tpreferences::initialize_members(twindow& window) autosaves_label.set_label(get_max_autosaves_status_label(autosaves_slider)); autosaves_label.set_use_markup(true); - connect_signal_notify_modified(autosaves_slider, boost::bind( + connect_signal_notify_modified(autosaves_slider, std::bind( &tpreferences::max_autosaves_slider_callback, - this, boost::ref(autosaves_slider), boost::ref(autosaves_label))); + this, std::ref(autosaves_slider), std::ref(autosaves_label))); /* CACHE MANAGE */ connect_signal_mouse_left_click(find_widget(&window, "cachemg", false), - boost::bind(&gui2::tgame_cache_options::display, - boost::ref(window.video()))); + std::bind(&gui2::tgame_cache_options::display, + std::ref(window.video()))); // // DISPLAY PANEL @@ -531,9 +531,9 @@ void tpreferences::initialize_members(twindow& window) toggle_fullscreen.set_value(fullscreen()); // We bind a special callback function, so setup_single_toggle() is not used - connect_signal_mouse_left_click(toggle_fullscreen, boost::bind( + connect_signal_mouse_left_click(toggle_fullscreen, std::bind( &tpreferences::fullscreen_toggle_callback, - this, boost::ref(window))); + this, std::ref(window))); /* SET RESOLUTION */ tcombobox& res_list = find_widget(&window, "resolution_set", false); @@ -543,8 +543,8 @@ void tpreferences::initialize_members(twindow& window) set_resolution_list(res_list, window.video()); res_list.connect_click_handler( - boost::bind(&tpreferences::handle_res_select, - this, boost::ref(window))); + std::bind(&tpreferences::handle_res_select, + this, std::ref(window))); /* SHOW FLOATING LABELS */ setup_single_toggle("show_floating_labels", @@ -572,9 +572,9 @@ void tpreferences::initialize_members(twindow& window) animate_map_toggle.set_value(animate_map()); animate_water_toggle.set_active(animate_map_toggle.get_value_bool()); - connect_signal_mouse_left_click(animate_map_toggle, boost::bind( + connect_signal_mouse_left_click(animate_map_toggle, std::bind( &tpreferences::animate_map_toggle_callback, - this, boost::ref(animate_map_toggle), boost::ref(animate_water_toggle))); + this, std::ref(animate_map_toggle), std::ref(animate_water_toggle))); /* ANIMATE WATER */ setup_single_toggle("animate_water", @@ -594,17 +594,17 @@ void tpreferences::initialize_members(twindow& window) scale_slider.set_value(font_scaling()); - connect_signal_notify_modified(scale_slider, boost::bind( + connect_signal_notify_modified(scale_slider, std::bind( &tpreferences::font_scaling_slider_callback, - this, boost::ref(scale_slider))); + this, std::ref(scale_slider))); bind_status_label(scale_slider, "scaling_value", window, "%"); /* SELECT THEME */ connect_signal_mouse_left_click( find_widget(&window, "choose_theme", false), - boost::bind(&show_theme_dialog, - boost::ref(window.video()))); + std::bind(&show_theme_dialog, + std::ref(window.video()))); // @@ -675,46 +675,46 @@ void tpreferences::initialize_members(twindow& window) tlistbox& friend_list = find_widget(&window, "friends_list", false); connect_signal_mouse_left_click( - find_widget(&window, "add_friend", false), boost::bind( + find_widget(&window, "add_friend", false), std::bind( &tpreferences::add_friend_list_entry, this, true, - boost::ref(textbox), - boost::ref(window))); + std::ref(textbox), + std::ref(window))); connect_signal_mouse_left_click( - find_widget(&window, "add_ignored", false), boost::bind( + find_widget(&window, "add_ignored", false), std::bind( &tpreferences::add_friend_list_entry, this, false, - boost::ref(textbox), - boost::ref(window))); + std::ref(textbox), + std::ref(window))); connect_signal_mouse_left_click( - find_widget(&window, "remove", false), boost::bind( + find_widget(&window, "remove", false), std::bind( &tpreferences::remove_friend_list_entry, this, - boost::ref(friend_list), - boost::ref(textbox), - boost::ref(window))); + std::ref(friend_list), + std::ref(textbox), + std::ref(window))); - friend_list.set_callback_value_change(boost::bind( + friend_list.set_callback_value_change(std::bind( &tpreferences::edit_friend_list_entry, this, - boost::ref(friend_list), - boost::ref(textbox))); + std::ref(friend_list), + std::ref(textbox))); friend_list.select_row(0); /* ALERTS */ connect_signal_mouse_left_click( find_widget(&window, "mp_alerts", false), - boost::bind(&gui2::tmp_alerts_options::display, - boost::ref(window.video()))); + std::bind(&gui2::tmp_alerts_options::display, + std::ref(window.video()))); /* SET WESNOTHD PATH */ connect_signal_mouse_left_click( - find_widget(&window, "mp_wesnothd", false), boost::bind( + find_widget(&window, "mp_wesnothd", false), std::bind( &show_wesnothd_server_search, - boost::ref(window.video()))); + std::ref(window.video()))); // @@ -764,7 +764,7 @@ void tpreferences::initialize_members(twindow& window) setup_single_toggle("value_toggle", get(pref_name, option["default"].to_bool()), - boost::bind(set_ptr, pref_name, _1), + std::bind(set_ptr, pref_name, _1), *main_grid); bind_status_label(toggle_box, "value", *main_grid); @@ -790,7 +790,7 @@ void tpreferences::initialize_members(twindow& window) setup_single_slider("setter", lexical_cast_default(get(pref_name), option["default"].to_int()), - boost::bind(set_ptr, pref_name, _1), + std::bind(set_ptr, pref_name, _1), *details_grid); bind_status_label(*setter_widget, "value", *main_grid); @@ -823,7 +823,7 @@ void tpreferences::initialize_members(twindow& window) setup_combobox("setter", combo_options, selected, - boost::bind(set_ptr, pref_name, _1), + std::bind(set_ptr, pref_name, _1), *details_grid); bind_status_label(*setter_widget, "value", *main_grid); @@ -846,18 +846,18 @@ void tpreferences::initialize_members(twindow& window) } #ifdef GUI2_EXPERIMENTAL_LISTBOX - connect_signal_notify_modified(advanced, boost::bind( + connect_signal_notify_modified(advanced, std::bind( &tpreferences::on_advanced_prefs_list_select, this, - boost::ref(advanced), - boost::ref(window))); + std::ref(advanced), + std::ref(window))); #else advanced.set_callback_value_change(make_dialog_callback( - boost::bind( + std::bind( &tpreferences::on_advanced_prefs_list_select, this, - boost::ref(advanced), - boost::ref(window)))); + std::ref(advanced), + std::ref(window)))); #endif advanced.select_row(0); @@ -893,22 +893,22 @@ void tpreferences::initialize_members(twindow& window) hotkey_list.set_column_order(4, order_funcs); connect_signal_mouse_left_click( - find_widget(&window, "btn_add_hotkey", false), boost::bind( + find_widget(&window, "btn_add_hotkey", false), std::bind( &tpreferences::add_hotkey_callback, this, - boost::ref(hotkey_list))); + std::ref(hotkey_list))); connect_signal_mouse_left_click( - find_widget(&window, "btn_clear_hotkey", false), boost::bind( + find_widget(&window, "btn_clear_hotkey", false), std::bind( &tpreferences::remove_hotkey_callback, this, - boost::ref(hotkey_list))); + std::ref(hotkey_list))); connect_signal_mouse_left_click( - find_widget(&window, "btn_reset_hotkeys", false), boost::bind( + find_widget(&window, "btn_reset_hotkeys", false), std::bind( &tpreferences::default_hotkey_callback, this, - boost::ref(window))); + std::ref(window))); } void tpreferences::setup_hotkey_list(twindow& window) @@ -1090,10 +1090,10 @@ void tpreferences::initialize_tabs(twindow& /*window*/, tlistbox& selector, cons } #ifdef GUI2_EXPERIMENTAL_LISTBOX - connect_signal_notify_modified(selector, boost::bind( + connect_signal_notify_modified(selector, std::bind( &tpreferences::on_tab_select, this, - boost::ref(window))); + std::ref(window))); #else selector.set_callback_value_change(dialog_callback ); @@ -1113,10 +1113,10 @@ void tpreferences::pre_show(twindow& window) tstacked_widget& pager = find_widget(&window, "pager", false); #ifdef GUI2_EXPERIMENTAL_LISTBOX - connect_signal_notify_modified(selector, boost::bind( + connect_signal_notify_modified(selector, std::bind( &tpreferences::on_page_select, this, - boost::ref(window))); + std::ref(window))); #else selector.set_callback_value_change(dialog_callback ); @@ -1173,14 +1173,14 @@ void tpreferences::set_visible_page(twindow& window, unsigned int page, const st } void tpreferences::single_toggle_callback(const ttoggle_button& widget, - boost::function setter, + std::function setter, const bool inverted) { setter(inverted ? !widget.get_value_bool() : widget.get_value_bool()); } void tpreferences::toggle_slider_pair_callback(const ttoggle_button& toggle_widget, - tslider& slider_widget, boost::function setter) + tslider& slider_widget, std::function setter) { const bool ison = toggle_widget.get_value_bool(); setter(ison); @@ -1189,13 +1189,13 @@ void tpreferences::toggle_slider_pair_callback(const ttoggle_button& toggle_widg } void tpreferences::single_slider_callback(const tslider& widget, - boost::function setter) + std::function setter) { setter(widget.get_value()); } void tpreferences::simple_combobox_callback(const tcombobox& widget, - boost::function setter, std::vector& vec) + std::function setter, std::vector& vec) { const unsigned index = widget.get_value(); setter(vec[index]); @@ -1264,7 +1264,7 @@ void tpreferences::animate_map_toggle_callback(ttoggle_button& toggle, template void tpreferences::toggle_radio_callback( tgroup& group, - boost::function setter) + std::function setter) { setter(group.get_active_member_value()); } diff --git a/src/gui/dialogs/preferences_dialog.hpp b/src/gui/dialogs/preferences_dialog.hpp index 5c6da8bc5b12..a66cd14fae68 100644 --- a/src/gui/dialogs/preferences_dialog.hpp +++ b/src/gui/dialogs/preferences_dialog.hpp @@ -109,12 +109,12 @@ class tpreferences : public tdialog void setup_single_toggle( const std::string& widget_id, const bool start_value, - boost::function callback, + std::function callback, twidget& find_in, const bool inverted = false); void single_toggle_callback(const ttoggle_button& widget, - boost::function setter, + std::function setter, const bool inverted); /** @@ -127,12 +127,12 @@ class tpreferences : public tdialog const std::string& slider_widget, const bool toggle_start_value, const int slider_state_value, - boost::function toggle_callback, - boost::function slider_callback, + std::function toggle_callback, + std::function slider_callback, twidget& find_in); void toggle_slider_pair_callback(const ttoggle_button& toggle_widget, - tslider& slider_widget, boost::function setter); + tslider& slider_widget, std::function setter); /** * Sets the initial state and callback for a standalone slider @@ -141,11 +141,11 @@ class tpreferences : public tdialog void setup_single_slider( const std::string& widget_id, const int start_value, - boost::function slider_callback, + std::function slider_callback, twidget& find_in); void single_slider_callback(const tslider& widget, - boost::function setter); + std::function setter); typedef std::pair, std::vector > combo_data; @@ -156,11 +156,11 @@ class tpreferences : public tdialog const std::string& widget_id, const combo_data& options, const unsigned start_value, - boost::function callback, + std::function callback, twidget& find_in); void simple_combobox_callback(const tcombobox& widget, - boost::function setter, std::vector& vec); + std::function setter, std::vector& vec); /** * Sets the a radio button group @@ -176,13 +176,13 @@ class tpreferences : public tdialog const T& enum_value, const int start_value, tgroup& group, - boost::function callback, + std::function callback, twindow& window); template void toggle_radio_callback( tgroup& group, - boost::function setter); + std::function setter); /** * Sets up a label that always displays the value of another widget. diff --git a/src/gui/dialogs/screenshot_notification.cpp b/src/gui/dialogs/screenshot_notification.cpp index bc0e643b9e54..be50d95a18b6 100644 --- a/src/gui/dialogs/screenshot_notification.cpp +++ b/src/gui/dialogs/screenshot_notification.cpp @@ -25,7 +25,7 @@ #include "gui/widgets/text_box.hpp" #include "gui/widgets/window.hpp" -#include +#include "utils/functional.hpp" #include "gettext.hpp" @@ -87,7 +87,7 @@ void tscreenshot_notification::pre_show(twindow& window) tbutton& copy_b = find_widget(&window, "copy", false); connect_signal_mouse_left_click( - copy_b, boost::bind(&desktop::clipboard::copy_to_clipboard, boost::ref(path_), false)); + copy_b, std::bind(&desktop::clipboard::copy_to_clipboard, std::ref(path_), false)); if (!desktop::clipboard::available()) { copy_b.set_active(false); @@ -96,12 +96,12 @@ void tscreenshot_notification::pre_show(twindow& window) tbutton& open_b = find_widget(&window, "open", false); connect_signal_mouse_left_click( - open_b, boost::bind(&desktop::open_object, boost::ref(path_))); + open_b, std::bind(&desktop::open_object, std::ref(path_))); tbutton& bdir_b = find_widget(&window, "browse_dir", false); connect_signal_mouse_left_click( bdir_b, - boost::bind(&desktop::open_object, - boost::ref(screenshots_dir_path_))); + std::bind(&desktop::open_object, + std::ref(screenshots_dir_path_))); } } diff --git a/src/gui/dialogs/select_orb_colors.cpp b/src/gui/dialogs/select_orb_colors.cpp index 70fa22acfc90..efc295ba1aa2 100644 --- a/src/gui/dialogs/select_orb_colors.cpp +++ b/src/gui/dialogs/select_orb_colors.cpp @@ -27,7 +27,7 @@ #include "preferences.hpp" #include "game_config.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { REGISTER_DIALOG(select_orb_colors); @@ -50,9 +50,9 @@ void tselect_orb_colors::pre_show(twindow& window) setup_orb_group("enemy", show_enemy_, preferences::enemy_color(), window); tbutton& reset = find_widget(&window, "orb_defaults", false); - connect_signal_mouse_left_click(reset, boost::bind( + connect_signal_mouse_left_click(reset, std::bind( &tselect_orb_colors::handle_reset_click, - this, boost::ref(window) + this, std::ref(window) )); } @@ -79,10 +79,10 @@ void tselect_orb_colors::setup_orb_group(const std::string& base_id, bool& shown ttoggle_button& toggle = find_widget(&window, prefix + "show", false); toggle.set_value_bool(shown); if(connect) { - connect_signal_mouse_left_click(toggle, boost::bind( + connect_signal_mouse_left_click(toggle, std::bind( &tselect_orb_colors::handle_toggle_click, this, - boost::ref(shown) + std::ref(shown) )); } diff --git a/src/gui/dialogs/title_screen.cpp b/src/gui/dialogs/title_screen.cpp index 522f5be146ae..603251636545 100644 --- a/src/gui/dialogs/title_screen.cpp +++ b/src/gui/dialogs/title_screen.cpp @@ -39,7 +39,7 @@ #include "gui/widgets/window.hpp" #include "video.hpp" -#include +#include "utils/functional.hpp" #include @@ -159,75 +159,75 @@ void ttitle_screen::post_build(twindow& window) /** @todo Should become a title screen hotkey. */ window.register_hotkey( hotkey::TITLE_SCREEN__RELOAD_WML, - boost::bind(&hotkey, boost::ref(window), RELOAD_GAME_DATA)); + std::bind(&hotkey, std::ref(window), RELOAD_GAME_DATA)); window.register_hotkey(hotkey::HOTKEY_FULLSCREEN, - boost::bind(fullscreen, boost::ref(window.video()))); + std::bind(fullscreen, std::ref(window.video()))); window.register_hotkey( hotkey::HOTKEY_LANGUAGE, - boost::bind(&hotkey, boost::ref(window), CHANGE_LANGUAGE)); + std::bind(&hotkey, std::ref(window), CHANGE_LANGUAGE)); window.register_hotkey(hotkey::HOTKEY_LOAD_GAME, - boost::bind(&hotkey, boost::ref(window), LOAD_GAME)); + std::bind(&hotkey, std::ref(window), LOAD_GAME)); window.register_hotkey(hotkey::HOTKEY_HELP, - boost::bind(&hotkey, boost::ref(window), SHOW_HELP)); + std::bind(&hotkey, std::ref(window), SHOW_HELP)); window.register_hotkey( hotkey::HOTKEY_PREFERENCES, - boost::bind(&hotkey, boost::ref(window), EDIT_PREFERENCES)); + std::bind(&hotkey, std::ref(window), EDIT_PREFERENCES)); - boost::function next_tip_wrapper = boost::bind( - &ttitle_screen::update_tip, this, boost::ref(window), true); + std::function next_tip_wrapper = std::bind( + &ttitle_screen::update_tip, this, std::ref(window), true); window.register_hotkey( hotkey::TITLE_SCREEN__NEXT_TIP, - boost::bind(function_wrapper >, + std::bind(function_wrapper >, true, next_tip_wrapper)); - boost::function previous_tip_wrapper = boost::bind( - &ttitle_screen::update_tip, this, boost::ref(window), false); + std::function previous_tip_wrapper = std::bind( + &ttitle_screen::update_tip, this, std::ref(window), false); window.register_hotkey( hotkey::TITLE_SCREEN__PREVIOUS_TIP, - boost::bind(function_wrapper >, + std::bind(function_wrapper >, true, previous_tip_wrapper)); window.register_hotkey(hotkey::TITLE_SCREEN__TUTORIAL, - boost::bind(&hotkey, boost::ref(window), TUTORIAL)); + std::bind(&hotkey, std::ref(window), TUTORIAL)); window.register_hotkey( hotkey::TITLE_SCREEN__CAMPAIGN, - boost::bind(&hotkey, boost::ref(window), NEW_CAMPAIGN)); + std::bind(&hotkey, std::ref(window), NEW_CAMPAIGN)); window.register_hotkey( hotkey::TITLE_SCREEN__MULTIPLAYER, - boost::bind(&hotkey, boost::ref(window), MULTIPLAYER)); + std::bind(&hotkey, std::ref(window), MULTIPLAYER)); window.register_hotkey( hotkey::TITLE_SCREEN__ADDONS, - boost::bind(&hotkey, boost::ref(window), GET_ADDONS)); + std::bind(&hotkey, std::ref(window), GET_ADDONS)); window.register_hotkey(hotkey::TITLE_SCREEN__CORES, - boost::bind(&hotkey, boost::ref(window), CORES)); + std::bind(&hotkey, std::ref(window), CORES)); window.register_hotkey( hotkey::TITLE_SCREEN__EDITOR, - boost::bind(&hotkey, boost::ref(window), START_MAP_EDITOR)); + std::bind(&hotkey, std::ref(window), START_MAP_EDITOR)); window.register_hotkey( hotkey::TITLE_SCREEN__CREDITS, - boost::bind(&hotkey, boost::ref(window), SHOW_ABOUT)); + std::bind(&hotkey, std::ref(window), SHOW_ABOUT)); window.register_hotkey(hotkey::HOTKEY_QUIT_TO_DESKTOP, - boost::bind(&hotkey, boost::ref(window), QUIT_GAME)); + std::bind(&hotkey, std::ref(window), QUIT_GAME)); window.register_hotkey( hotkey::LUA_CONSOLE, - boost::bind(&launch_lua_console, boost::ref(window))); + std::bind(&launch_lua_console, std::ref(window))); } #ifdef DEBUG_TOOLTIP @@ -265,7 +265,7 @@ void ttitle_screen::pre_show(twindow& window) #ifdef DEBUG_TOOLTIP window.connect_signal( - boost::bind(debug_tooltip, boost::ref(window), _3, _5), + std::bind(debug_tooltip, std::ref(window), _3, _5), event::tdispatcher::front_child); #endif @@ -308,16 +308,16 @@ void ttitle_screen::pre_show(twindow& window) connect_signal_mouse_left_click( find_widget(&window, "next_tip", false), - boost::bind(&ttitle_screen::update_tip, + std::bind(&ttitle_screen::update_tip, this, - boost::ref(window), + std::ref(window), true)); connect_signal_mouse_left_click( find_widget(&window, "previous_tip", false), - boost::bind(&ttitle_screen::update_tip, + std::bind(&ttitle_screen::update_tip, this, - boost::ref(window), + std::ref(window), false)); if(game_config::images::game_title.empty()) { @@ -342,7 +342,7 @@ void ttitle_screen::pre_show(twindow& window) tbutton& about = find_widget(&window, "about", false); connect_signal_mouse_left_click( about, - boost::bind(&tgame_version::display, boost::ref(window.video()))); + std::bind(&tgame_version::display, std::ref(window.video()))); /***** Set the clock button. *****/ tbutton& clock = find_widget(&window, "clock", false); @@ -351,9 +351,9 @@ void ttitle_screen::pre_show(twindow& window) connect_signal_mouse_left_click( clock, - boost::bind(&ttitle_screen::show_debug_clock_window, + std::bind(&ttitle_screen::show_debug_clock_window, this, - boost::ref(window.video()))); + std::ref(window.video()))); } void ttitle_screen::update_tip(twindow& window, const bool previous) diff --git a/src/gui/dialogs/unit_attack.cpp b/src/gui/dialogs/unit_attack.cpp index d2cdfe8b0e2d..dd28c33f23d4 100644 --- a/src/gui/dialogs/unit_attack.cpp +++ b/src/gui/dialogs/unit_attack.cpp @@ -38,7 +38,7 @@ #include "team.hpp" #include "units/unit.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -267,17 +267,17 @@ void tunit_attack::pre_show(twindow& window) { connect_signal_mouse_left_click( find_widget(&window, "attacker_profile", false), - boost::bind(&tunit_attack::profile_button_callback, this, boost::ref(window), + std::bind(&tunit_attack::profile_button_callback, this, std::ref(window), (*attacker_itor_).type_id())); connect_signal_mouse_left_click( find_widget(&window, "defender_profile", false), - boost::bind(&tunit_attack::profile_button_callback, this, boost::ref(window), + std::bind(&tunit_attack::profile_button_callback, this, std::ref(window), (*defender_itor_).type_id())); connect_signal_mouse_left_click( find_widget(&window, "damage_calculation", false), - boost::bind(&tunit_attack::damage_calc_callback, this, boost::ref(window))); + std::bind(&tunit_attack::damage_calc_callback, this, std::ref(window))); set_attacker_info(window, *attacker_itor_); set_defender_info(window, *defender_itor_); diff --git a/src/gui/dialogs/unit_create.cpp b/src/gui/dialogs/unit_create.cpp index 1fd4d8855a76..a14163947e33 100644 --- a/src/gui/dialogs/unit_create.cpp +++ b/src/gui/dialogs/unit_create.cpp @@ -42,7 +42,7 @@ #include "team.hpp" #include "units/types.hpp" -#include +#include "utils/functional.hpp" static std::string last_chosen_type_id = ""; static unit_race::GENDER last_gender = unit_race::MALE; @@ -111,15 +111,15 @@ void tunit_create::pre_show(twindow& window) = find_widget(&window, "filter_box", false, true); filter->set_text_changed_callback( - boost::bind(&tunit_create::filter_text_changed, this, _1, _2)); + std::bind(&tunit_create::filter_text_changed, this, _1, _2)); window.keyboard_capture(filter); #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(*list, - boost::bind(&tunit_create::list_item_clicked, + std::bind(&tunit_create::list_item_clicked, *this, - boost::ref(window))); + std::ref(window))); #else list.set_callback_value_change( dialog_callback); @@ -159,11 +159,11 @@ void tunit_create::pre_show(twindow& window) } std::vector order_funcs(2); - order_funcs[0] = boost::bind(&tunit_create::compare_race, this, _1, _2); - order_funcs[1] = boost::bind(&tunit_create::compare_race_rev, this, _1, _2); + order_funcs[0] = std::bind(&tunit_create::compare_race, this, _1, _2); + order_funcs[1] = std::bind(&tunit_create::compare_race_rev, this, _1, _2); list.set_column_order(0, order_funcs); - order_funcs[0] = boost::bind(&tunit_create::compare_type, this, _1, _2); - order_funcs[1] = boost::bind(&tunit_create::compare_type_rev, this, _1, _2); + order_funcs[0] = std::bind(&tunit_create::compare_type, this, _1, _2); + order_funcs[1] = std::bind(&tunit_create::compare_type_rev, this, _1, _2); list.set_column_order(1, order_funcs); list_item_clicked(window); diff --git a/src/gui/dialogs/unit_recruit.cpp b/src/gui/dialogs/unit_recruit.cpp index 1a74c8697b5b..bbc86c15cfe5 100644 --- a/src/gui/dialogs/unit_recruit.cpp +++ b/src/gui/dialogs/unit_recruit.cpp @@ -36,7 +36,7 @@ #include "units/types.hpp" #include "whiteboard/manager.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -61,9 +61,9 @@ void tunit_recruit::pre_show(twindow& window) #ifdef GUI2_EXPERIMENTAL_LISTBOX connect_signal_notify_modified(*list, - boost::bind(&tunit_recruit::list_item_clicked, + std::bind(&tunit_recruit::list_item_clicked, *this, - boost::ref(window))); + std::ref(window))); #else list.set_callback_value_change( dialog_callback); @@ -71,7 +71,7 @@ void tunit_recruit::pre_show(twindow& window) connect_signal_mouse_left_click( find_widget(&window, "show_help", false), - boost::bind(&tunit_recruit::show_help, this, boost::ref(window))); + std::bind(&tunit_recruit::show_help, this, std::ref(window))); for(const auto& recruit : recruit_list_) { diff --git a/src/gui/dialogs/wml_error.cpp b/src/gui/dialogs/wml_error.cpp index 952ed5ed7bd6..a35d41d82730 100644 --- a/src/gui/dialogs/wml_error.cpp +++ b/src/gui/dialogs/wml_error.cpp @@ -29,7 +29,7 @@ #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace { @@ -219,7 +219,7 @@ void twml_error::pre_show(twindow& window) tbutton& copy_button = find_widget(&window, "copy", false); connect_signal_mouse_left_click( - copy_button, boost::bind(&twml_error::copy_report_callback, this)); + copy_button, std::bind(&twml_error::copy_report_callback, this)); if (!desktop::clipboard::available()) { copy_button.set_active(false); diff --git a/src/gui/widgets/button.cpp b/src/gui/widgets/button.cpp index ee7e0f09ec7e..bf41441f5488 100644 --- a/src/gui/widgets/button.cpp +++ b/src/gui/widgets/button.cpp @@ -28,7 +28,7 @@ #include "sound.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -43,15 +43,15 @@ REGISTER_WIDGET(button) tbutton::tbutton() : tcontrol(COUNT), tclickable_(), state_(ENABLED), retval_(0) { connect_signal( - boost::bind(&tbutton::signal_handler_mouse_enter, this, _2, _3)); + std::bind(&tbutton::signal_handler_mouse_enter, this, _2, _3)); connect_signal( - boost::bind(&tbutton::signal_handler_mouse_leave, this, _2, _3)); + std::bind(&tbutton::signal_handler_mouse_leave, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &tbutton::signal_handler_left_button_down, this, _2, _3)); connect_signal( - boost::bind(&tbutton::signal_handler_left_button_up, this, _2, _3)); - connect_signal(boost::bind( + std::bind(&tbutton::signal_handler_left_button_up, this, _2, _3)); + connect_signal(std::bind( &tbutton::signal_handler_left_button_click, this, _2, _3)); } diff --git a/src/gui/widgets/combobox.cpp b/src/gui/widgets/combobox.cpp index 3df15457d0fc..a3ce83893b4b 100644 --- a/src/gui/widgets/combobox.cpp +++ b/src/gui/widgets/combobox.cpp @@ -26,7 +26,7 @@ #include "gui/dialogs/drop_down_list.hpp" #include "sound.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -49,15 +49,15 @@ tcombobox::tcombobox() values_.push_back(this->label()); connect_signal( - boost::bind(&tcombobox::signal_handler_mouse_enter, this, _2, _3)); + std::bind(&tcombobox::signal_handler_mouse_enter, this, _2, _3)); connect_signal( - boost::bind(&tcombobox::signal_handler_mouse_leave, this, _2, _3)); + std::bind(&tcombobox::signal_handler_mouse_leave, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &tcombobox::signal_handler_left_button_down, this, _2, _3)); connect_signal( - boost::bind(&tcombobox::signal_handler_left_button_up, this, _2, _3)); - connect_signal(boost::bind( + std::bind(&tcombobox::signal_handler_left_button_up, this, _2, _3)); + connect_signal(std::bind( &tcombobox::signal_handler_left_button_click, this, _2, _3)); } diff --git a/src/gui/widgets/combobox.hpp b/src/gui/widgets/combobox.hpp index 8dd55d164acc..af33486498ca 100644 --- a/src/gui/widgets/combobox.hpp +++ b/src/gui/widgets/combobox.hpp @@ -66,7 +66,7 @@ class tcombobox : public tcontrol, public tselectable_ void set_selected(int selected); /** See tselectable_::set_callback_state_change. */ - boost::function callback_state_change_; + std::function callback_state_change_; /** Inherited from tselectable_ */ virtual unsigned get_value() const override { return selected_; } @@ -78,7 +78,7 @@ class tcombobox : public tcontrol, public tselectable_ virtual unsigned num_states() const override { return values_.size(); } /** Inherited from tselectable_ */ - virtual void set_callback_state_change(boost::function callback) + virtual void set_callback_state_change(std::function callback) { selected_callback_ = callback; } @@ -123,7 +123,7 @@ class tcombobox : public tcontrol, public tselectable_ */ int selected_; - boost::function selected_callback_; + std::function selected_callback_; /** See @ref tcontrol::get_control_type. */ virtual const std::string& get_control_type() const override; diff --git a/src/gui/widgets/control.cpp b/src/gui/widgets/control.cpp index ab198de46d24..ed522df131a0 100644 --- a/src/gui/widgets/control.cpp +++ b/src/gui/widgets/control.cpp @@ -30,7 +30,7 @@ #include "gettext.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #include @@ -57,13 +57,13 @@ tcontrol::tcontrol(const unsigned canvas_count) , text_alignment_(PANGO_ALIGN_LEFT) , shrunken_(false) { - connect_signal(boost::bind( + connect_signal(std::bind( &tcontrol::signal_handler_show_tooltip, this, _2, _3, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &tcontrol::signal_handler_show_helptip, this, _2, _3, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &tcontrol::signal_handler_notify_remove_tooltip, this, _2, _3)); } @@ -86,13 +86,13 @@ tcontrol::tcontrol(const implementation::tbuilder_control& builder, { definition_load_configuration(control_type); - connect_signal(boost::bind( + connect_signal(std::bind( &tcontrol::signal_handler_show_tooltip, this, _2, _3, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &tcontrol::signal_handler_show_helptip, this, _2, _3, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &tcontrol::signal_handler_notify_remove_tooltip, this, _2, _3)); } diff --git a/src/gui/widgets/drawing.cpp b/src/gui/widgets/drawing.cpp index 1fa6372b71e2..7e8b4734f760 100644 --- a/src/gui/widgets/drawing.cpp +++ b/src/gui/widgets/drawing.cpp @@ -22,7 +22,7 @@ #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/generator.cpp b/src/gui/widgets/generator.cpp index bde6353e99cf..0e16c8e42b1d 100644 --- a/src/gui/widgets/generator.cpp +++ b/src/gui/widgets/generator.cpp @@ -656,7 +656,7 @@ void tselect::select(tgrid& grid, const bool select) void tselect::init(tgrid* grid, const std::map& data, - const boost::function& callback) + const std::function& callback) { for(unsigned row = 0; row < grid->get_rows(); ++row) { for(unsigned col = 0; col < grid->get_cols(); ++col) { @@ -694,7 +694,7 @@ tselect::init(tgrid* grid, void tshow::init(tgrid* grid, const std::map& data, - const boost::function& callback) + const std::function& callback) { assert(!callback); diff --git a/src/gui/widgets/generator.hpp b/src/gui/widgets/generator.hpp index 1710a8529a09..87041c1b7772 100644 --- a/src/gui/widgets/generator.hpp +++ b/src/gui/widgets/generator.hpp @@ -167,7 +167,7 @@ class tgenerator_ : public twidget virtual tgrid& create_item(const int index, tbuilder_grid_const_ptr list_builder, const string_map& item_data, - const boost::function& callback) + const std::function& callback) = 0; /** @@ -191,7 +191,7 @@ class tgenerator_ : public twidget create_item(const int index, tbuilder_grid_const_ptr list_builder, const std::map& data, - const boost::function& callback) = 0; + const std::function& callback) = 0; /** * Creates one or more new item(s). @@ -211,7 +211,7 @@ class tgenerator_ : public twidget virtual void create_items(const int index, tbuilder_grid_const_ptr list_builder, const std::vector& data, - const boost::function& callback) + const std::function& callback) = 0; /** @@ -234,9 +234,9 @@ class tgenerator_ : public twidget tbuilder_grid_const_ptr list_builder, const std::vector >& data, - const boost::function& callback) = 0; + const std::function& callback) = 0; - typedef boost::function torder_func; + typedef std::function torder_func; virtual void set_order(const torder_func& order) = 0; /***** ***** ***** ***** Inherited ***** ***** ***** *****/ diff --git a/src/gui/widgets/generator_private.hpp b/src/gui/widgets/generator_private.hpp index cfbfad673fc2..33f53194a942 100644 --- a/src/gui/widgets/generator_private.hpp +++ b/src/gui/widgets/generator_private.hpp @@ -545,7 +545,7 @@ struct tselect : public virtual tgenerator_ */ void init(tgrid* grid, const std::map& data, - const boost::function& callback); + const std::function& callback); }; /** Show the item. */ @@ -569,7 +569,7 @@ struct tshow : public virtual tgenerator_ */ void init(tgrid* grid, const std::map& data, - const boost::function& callback); + const std::function& callback); }; } // namespace select_action @@ -762,7 +762,7 @@ class tgenerator : public minimum_selection, tgrid& create_item(const int index, tbuilder_grid_const_ptr list_builder, const string_map& item_data, - const boost::function& callback) + const std::function& callback) { std::map data; @@ -775,7 +775,7 @@ class tgenerator : public minimum_selection, const int index, tbuilder_grid_const_ptr list_builder, const std::map& item_data, - const boost::function& callback) + const std::function& callback) { assert(list_builder); assert(index == -1 || static_cast(index) < items_.size()); @@ -802,7 +802,7 @@ class tgenerator : public minimum_selection, tbuilder_grid_const_ptr list_builder, const std::vector >& data, - const boost::function& callback) + const std::function& callback) { impl_create_items(index, list_builder, data, callback); } @@ -811,7 +811,7 @@ class tgenerator : public minimum_selection, virtual void create_items(const int index, tbuilder_grid_const_ptr list_builder, const std::vector& data, - const boost::function& callback) + const std::function& callback) { impl_create_items(index, list_builder, data, callback); } @@ -1026,7 +1026,7 @@ class tgenerator : public minimum_selection, /** whether need to recalculate order_dirty_ */ mutable bool order_dirty_; - typedef boost::function torder_func; + typedef std::function torder_func; torder_func order_func_; @@ -1077,7 +1077,7 @@ class tgenerator : public minimum_selection, order_[i] = i; } } - if(!order_func_.empty()) { + if(order_func_) { std::stable_sort(order_.begin(), order_.end(), calculate_order_helper(order_func_, items_)); } for(size_t i = 0; i < order_.size(); ++i) { @@ -1123,7 +1123,7 @@ class tgenerator : public minimum_selection, void impl_create_items(const int index, tbuilder_grid_const_ptr list_builder, const std::vector& data, - const boost::function& callback) + const std::function& callback) { int i = index; for(const auto & item_data : data) @@ -1149,7 +1149,7 @@ class tgenerator : public minimum_selection, */ void init(tgrid* grid, const std::map& data, - const boost::function& callback) + const std::function& callback) { assert(grid); grid->set_parent(this); diff --git a/src/gui/widgets/group.hpp b/src/gui/widgets/group.hpp index 9c442a2799f4..f51655bd5867 100644 --- a/src/gui/widgets/group.hpp +++ b/src/gui/widgets/group.hpp @@ -20,7 +20,7 @@ #include "utils/iterable_pair.hpp" #include -#include +#include "utils/functional.hpp" namespace gui2 { @@ -44,7 +44,7 @@ class tgroup { members_.push_back(std::make_pair(widget, value)); - dynamic_cast(widget)->connect_signal(boost::bind( + dynamic_cast(widget)->connect_signal(std::bind( &tgroup::group_operator, this), event::tdispatcher::front_child); } diff --git a/src/gui/widgets/horizontal_scrollbar.cpp b/src/gui/widgets/horizontal_scrollbar.cpp index 05976684aa81..40339d1248ee 100644 --- a/src/gui/widgets/horizontal_scrollbar.cpp +++ b/src/gui/widgets/horizontal_scrollbar.cpp @@ -24,7 +24,7 @@ #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/image.cpp b/src/gui/widgets/image.cpp index caa1bfda92e5..57c6a2f6904f 100644 --- a/src/gui/widgets/image.cpp +++ b/src/gui/widgets/image.cpp @@ -24,7 +24,7 @@ #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' diff --git a/src/gui/widgets/label.cpp b/src/gui/widgets/label.cpp index f8f463f9c213..b5ffcb3d0e3f 100644 --- a/src/gui/widgets/label.cpp +++ b/src/gui/widgets/label.cpp @@ -29,7 +29,7 @@ #include "desktop/open.hpp" #include "gettext.hpp" -#include +#include "utils/functional.hpp" #include #include @@ -48,8 +48,8 @@ tlabel::tlabel() , link_aware_(false) , link_color_("#ffff00") { - connect_signal(boost::bind(&tlabel::signal_handler_left_button_click, this, _2, _3)); - connect_signal(boost::bind(&tlabel::signal_handler_right_button_click, this, _2, _3)); + connect_signal(std::bind(&tlabel::signal_handler_left_button_click, this, _2, _3)); + connect_signal(std::bind(&tlabel::signal_handler_right_button_click, this, _2, _3)); } bool tlabel::can_wrap() const diff --git a/src/gui/widgets/list.cpp b/src/gui/widgets/list.cpp index 4f212ffd471e..31471f9386f8 100644 --- a/src/gui/widgets/list.cpp +++ b/src/gui/widgets/list.cpp @@ -26,7 +26,7 @@ #include "gui/widgets/settings.hpp" #include "gui/widgets/window.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -56,14 +56,14 @@ tlist::tlist(const bool has_minimum, assert(generator_); connect_signal( - boost::bind(&tlist::signal_handler_left_button_down, this, _2), + std::bind(&tlist::signal_handler_left_button_down, this, _2), event::tdispatcher::back_pre_child); - connect_signal(boost::bind( + connect_signal(std::bind( &tlist::signal_handler_sdl_key_down, this, _2, _3, _5, _6)); connect_signal( - boost::bind( + std::bind( &tlist::signal_handler_sdl_key_down, this, _2, _3, _5, _6), event::tdispatcher::back_pre_child); } @@ -89,7 +89,7 @@ tlist::add_row(const std::map& data, if(selectable) { dynamic_cast(*selectable) .connect_signal( - boost::bind( + std::bind( &tlist::signal_handler_pre_child_left_button_click, this, &grid, @@ -101,7 +101,7 @@ tlist::add_row(const std::map& data, // Post widget for panel. dynamic_cast(*selectable) .connect_signal( - boost::bind(&tlist::signal_handler_left_button_click, + std::bind(&tlist::signal_handler_left_button_click, this, &grid, _2), @@ -110,7 +110,7 @@ tlist::add_row(const std::map& data, // Post widget for button and widgets on the panel. dynamic_cast(*selectable) .connect_signal( - boost::bind(&tlist::signal_handler_left_button_click, + std::bind(&tlist::signal_handler_left_button_click, this, &grid, _2), diff --git a/src/gui/widgets/listbox.cpp b/src/gui/widgets/listbox.cpp index 4824f6537348..591c1ca5d3e4 100644 --- a/src/gui/widgets/listbox.cpp +++ b/src/gui/widgets/listbox.cpp @@ -33,7 +33,7 @@ #include "gettext.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -540,7 +540,7 @@ void tlistbox::finalize(tbuilder_grid_const_ptr header, tgrid& p = find_widget(this, "_header_grid", false); for(unsigned i = 0, max = std::max(p.get_cols(), p.get_rows()); i < max; ++i) { if(tselectable_* selectable = find_widget(&p, "sort_" + std::to_string(i), false, false)) { - selectable->set_callback_state_change(boost::bind(&tlistbox::order_by_column, this, i, _1)); + selectable->set_callback_state_change(std::bind(&tlistbox::order_by_column, this, i, _1)); if(orders_.size() < max ) { orders_.resize(max); } diff --git a/src/gui/widgets/listbox.hpp b/src/gui/widgets/listbox.hpp index f3b8e58be313..86ab422af3e6 100644 --- a/src/gui/widgets/listbox.hpp +++ b/src/gui/widgets/listbox.hpp @@ -216,13 +216,13 @@ class tlistbox : public tscrollbar_container /***** ***** ***** setters / getters for members ***** ****** *****/ void - set_callback_item_change(const boost::function& callback) + set_callback_item_change(const std::function& callback) { callback_item_changed_ = callback; } void - set_callback_value_change(const boost::function& callback) + set_callback_value_change(const std::function& callback) { callback_value_changed_ = callback; } @@ -295,7 +295,7 @@ class tlistbox : public tscrollbar_container * * The function is passed the index of the toggled item. */ - boost::function callback_item_changed_; + std::function callback_item_changed_; /** * This callback is called when the value in the listbox changes. @@ -304,7 +304,7 @@ class tlistbox : public tscrollbar_container * there might be too many calls. That might happen if an arrow up didn't * change the selected item. */ - boost::function callback_value_changed_; + std::function callback_value_changed_; bool need_layout_; diff --git a/src/gui/widgets/matrix.cpp b/src/gui/widgets/matrix.cpp index 984893fb74f4..41b0b55978fa 100644 --- a/src/gui/widgets/matrix.cpp +++ b/src/gui/widgets/matrix.cpp @@ -24,7 +24,7 @@ #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' diff --git a/src/gui/widgets/minimap.cpp b/src/gui/widgets/minimap.cpp index f458e699cb7d..35e5e093a699 100644 --- a/src/gui/widgets/minimap.cpp +++ b/src/gui/widgets/minimap.cpp @@ -26,7 +26,7 @@ #include "terrain/type_data.hpp" #include "../../minimap.hpp" // We want the file in src/ -#include +#include "utils/functional.hpp" #include #include diff --git a/src/gui/widgets/multi_page.cpp b/src/gui/widgets/multi_page.cpp index 1325d9550519..336ba6fded4b 100644 --- a/src/gui/widgets/multi_page.cpp +++ b/src/gui/widgets/multi_page.cpp @@ -23,7 +23,7 @@ #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/pane.cpp b/src/gui/widgets/pane.cpp index 52995ae4c6ae..af17f14a562b 100644 --- a/src/gui/widgets/pane.cpp +++ b/src/gui/widgets/pane.cpp @@ -24,7 +24,7 @@ #include "gui/core/event/message.hpp" #include "gettext.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER "tpane [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -116,7 +116,7 @@ tpane::tpane(const tbuilder_grid_ptr item_builder) , placer_(tplacer_::build(tplacer_::tgrow_direction::vertical, 1)) { connect_signal( - boost::bind( + std::bind( &tpane::signal_handler_request_placement, this, _1, _2, _3), event::tdispatcher::back_pre_child); } @@ -129,7 +129,7 @@ tpane::tpane(const implementation::tbuilder_pane& builder) , placer_(tplacer_::build(builder.grow_direction, builder.parallel_items)) { connect_signal( - boost::bind( + std::bind( &tpane::signal_handler_request_placement, this, _1, _2, _3), event::tdispatcher::back_pre_child); } diff --git a/src/gui/widgets/pane.hpp b/src/gui/widgets/pane.hpp index 5f62d418faac..787049ea5f7d 100644 --- a/src/gui/widgets/pane.hpp +++ b/src/gui/widgets/pane.hpp @@ -19,7 +19,7 @@ #include "gui/core/window_builder.hpp" #include "gui/core/placer.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include @@ -51,9 +51,9 @@ class tpane : public twidget tgrid* grid; }; - typedef boost::function tcompare_functor; + typedef std::function tcompare_functor; - typedef boost::function tfilter_functor; + typedef std::function tfilter_functor; /** @deprecated Use the second overload. */ explicit tpane(const tbuilder_grid_ptr item_builder); diff --git a/src/gui/widgets/panel.cpp b/src/gui/widgets/panel.cpp index 5062575775aa..6f080963cd9c 100644 --- a/src/gui/widgets/panel.cpp +++ b/src/gui/widgets/panel.cpp @@ -22,7 +22,7 @@ #include "gettext.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' diff --git a/src/gui/widgets/password_box.cpp b/src/gui/widgets/password_box.cpp index 830f4901c87b..85ce1c9ce532 100644 --- a/src/gui/widgets/password_box.cpp +++ b/src/gui/widgets/password_box.cpp @@ -24,7 +24,7 @@ #include "serialization/string_utils.hpp" #include "serialization/unicode.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' diff --git a/src/gui/widgets/progress_bar.cpp b/src/gui/widgets/progress_bar.cpp index e21523f68629..99eaec03bf18 100644 --- a/src/gui/widgets/progress_bar.cpp +++ b/src/gui/widgets/progress_bar.cpp @@ -20,7 +20,7 @@ #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' diff --git a/src/gui/widgets/repeating_button.cpp b/src/gui/widgets/repeating_button.cpp index cb397a5d13c7..2c02f86e3b4f 100644 --- a/src/gui/widgets/repeating_button.cpp +++ b/src/gui/widgets/repeating_button.cpp @@ -23,7 +23,7 @@ #include "gui/widgets/window.hpp" #include "sound.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -38,14 +38,14 @@ REGISTER_WIDGET(repeating_button) trepeating_button::trepeating_button() : tcontrol(COUNT), tclickable_(), state_(ENABLED), repeat_timer_(0) { - connect_signal(boost::bind( + connect_signal(std::bind( &trepeating_button::signal_handler_mouse_enter, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &trepeating_button::signal_handler_mouse_leave, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &trepeating_button::signal_handler_left_button_down, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &trepeating_button::signal_handler_left_button_up, this, _2, _3)); } @@ -137,11 +137,9 @@ trepeating_button::signal_handler_left_button_down(const event::tevent event, twindow* window = get_window(); if(window) { repeat_timer_ = add_timer(settings::repeat_button_repeat_time, - boost::bind(&tdispatcher::fire, - window, - event::LEFT_BUTTON_DOWN, - boost::ref(*this)), - true); + [this, window](unsigned int) { + window->fire(event::LEFT_BUTTON_DOWN, *this); + },true); window->mouse_capture(); } diff --git a/src/gui/widgets/scroll_label.cpp b/src/gui/widgets/scroll_label.cpp index e65adc7e8e01..62a8ffc075a1 100644 --- a/src/gui/widgets/scroll_label.cpp +++ b/src/gui/widgets/scroll_label.cpp @@ -27,7 +27,7 @@ #include "gui/widgets/window.hpp" #include "gettext.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -42,7 +42,7 @@ REGISTER_WIDGET(scroll_label) tscroll_label::tscroll_label(bool wrap) : tscrollbar_container(COUNT), state_(ENABLED), wrap_on(wrap) { connect_signal( - boost::bind( + std::bind( &tscroll_label::signal_handler_left_button_down, this, _2), event::tdispatcher::back_pre_child); } diff --git a/src/gui/widgets/scrollbar.cpp b/src/gui/widgets/scrollbar.cpp index 6d393d4e75ee..4e865c6ead45 100644 --- a/src/gui/widgets/scrollbar.cpp +++ b/src/gui/widgets/scrollbar.cpp @@ -19,7 +19,7 @@ #include "gui/core/log.hpp" #include "gui/widgets/window.hpp" // Needed for invalidate_layout() -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -39,15 +39,15 @@ tscrollbar_::tscrollbar_() , positioner_offset_(0) , positioner_length_(0) { - connect_signal(boost::bind( + connect_signal(std::bind( &tscrollbar_::signal_handler_mouse_enter, this, _2, _3, _4)); - connect_signal(boost::bind( + connect_signal(std::bind( &tscrollbar_::signal_handler_mouse_motion, this, _2, _3, _4, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &tscrollbar_::signal_handler_mouse_leave, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &tscrollbar_::signal_handler_left_button_down, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &tscrollbar_::signal_handler_left_button_up, this, _2, _3)); } diff --git a/src/gui/widgets/scrollbar.hpp b/src/gui/widgets/scrollbar.hpp index 4983568254e9..5a85ceb0d269 100644 --- a/src/gui/widgets/scrollbar.hpp +++ b/src/gui/widgets/scrollbar.hpp @@ -18,7 +18,7 @@ #include "gui/core/notifier.hpp" #include "gui/widgets/control.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/scrollbar_container.cpp b/src/gui/widgets/scrollbar_container.cpp index 0979873ad340..2745514c5a62 100644 --- a/src/gui/widgets/scrollbar_container.cpp +++ b/src/gui/widgets/scrollbar_container.cpp @@ -24,7 +24,7 @@ #include "gui/widgets/window.hpp" #include "sdl/rect.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -79,7 +79,7 @@ tscrollbar_container::tscrollbar_container(const unsigned canvas_count) , content_visible_area_() { connect_signal( - boost::bind(&tscrollbar_container::signal_handler_sdl_key_down, + std::bind(&tscrollbar_container::signal_handler_sdl_key_down, this, _2, _3, @@ -88,28 +88,28 @@ tscrollbar_container::tscrollbar_container(const unsigned canvas_count) connect_signal( - boost::bind(&tscrollbar_container::signal_handler_sdl_wheel_up, + std::bind(&tscrollbar_container::signal_handler_sdl_wheel_up, this, _2, _3), event::tdispatcher::back_post_child); connect_signal( - boost::bind(&tscrollbar_container::signal_handler_sdl_wheel_down, + std::bind(&tscrollbar_container::signal_handler_sdl_wheel_down, this, _2, _3), event::tdispatcher::back_post_child); connect_signal( - boost::bind(&tscrollbar_container::signal_handler_sdl_wheel_left, + std::bind(&tscrollbar_container::signal_handler_sdl_wheel_left, this, _2, _3), event::tdispatcher::back_post_child); connect_signal( - boost::bind(&tscrollbar_container::signal_handler_sdl_wheel_right, + std::bind(&tscrollbar_container::signal_handler_sdl_wheel_right, this, _2, _3), @@ -750,7 +750,7 @@ void tscrollbar_container::finalize_setup() connect_signal_notify_modified( *vertical_scrollbar_, - boost::bind(&tscrollbar_container::vertical_scrollbar_moved, this)); + std::bind(&tscrollbar_container::vertical_scrollbar_moved, this)); /***** Setup horizontal scrollbar *****/ horizontal_scrollbar_grid_ = find_widget( @@ -761,7 +761,7 @@ void tscrollbar_container::finalize_setup() connect_signal_notify_modified( *horizontal_scrollbar_, - boost::bind(&tscrollbar_container::horizontal_scrollbar_moved, + std::bind(&tscrollbar_container::horizontal_scrollbar_moved, this)); /***** Setup the scrollbar buttons *****/ @@ -773,7 +773,7 @@ void tscrollbar_container::finalize_setup() vertical_scrollbar_grid_, item.first, false, false); if(button) { - button->connect_click_handler(boost::bind( + button->connect_click_handler(std::bind( &tscrollbar_container::scroll_vertical_scrollbar, this, item.second)); @@ -784,7 +784,7 @@ void tscrollbar_container::finalize_setup() horizontal_scrollbar_grid_, item.first, false, false); if(button) { - button->connect_click_handler(boost::bind( + button->connect_click_handler(std::bind( &tscrollbar_container::scroll_horizontal_scrollbar, this, item.second)); diff --git a/src/gui/widgets/scrollbar_panel.cpp b/src/gui/widgets/scrollbar_panel.cpp index e4c3db70d2f0..dae5e3469ad7 100644 --- a/src/gui/widgets/scrollbar_panel.cpp +++ b/src/gui/widgets/scrollbar_panel.cpp @@ -23,7 +23,7 @@ #include "gettext.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/selectable.hpp b/src/gui/widgets/selectable.hpp index 3a7e0194f5ce..56227ed07b86 100644 --- a/src/gui/widgets/selectable.hpp +++ b/src/gui/widgets/selectable.hpp @@ -15,7 +15,7 @@ #ifndef GUI_WIDGETS_SELECTABLE_HPP_INCLUDED #define GUI_WIDGETS_SELECTABLE_HPP_INCLUDED -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include namespace gui2 @@ -61,7 +61,7 @@ class tselectable_ * fired. Most of the time it will be a left click on the widget. */ virtual void - set_callback_state_change(boost::function callback) = 0; + set_callback_state_change(std::function callback) = 0; }; } // namespace gui2 diff --git a/src/gui/widgets/settings.cpp b/src/gui/widgets/settings.cpp index 4e762c87466a..8e55671e83ff 100644 --- a/src/gui/widgets/settings.cpp +++ b/src/gui/widgets/settings.cpp @@ -83,7 +83,7 @@ static std::vector& registered_window_types() } typedef std::map > @@ -556,7 +556,7 @@ tstate_definition::tstate_definition(const config& cfg) : canvas() } void register_widget(const std::string& id, - boost::function functor) diff --git a/src/gui/widgets/settings.hpp b/src/gui/widgets/settings.hpp index 91c1d4ace09c..594fe47ea8ae 100644 --- a/src/gui/widgets/settings.hpp +++ b/src/gui/widgets/settings.hpp @@ -20,7 +20,7 @@ #ifndef GUI_WIDGETS_SETTING_HPP_INCLUDED #define GUI_WIDGETS_SETTING_HPP_INCLUDED -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include "config.hpp" #include "gui/core/widget_definition.hpp" #include "gui/core/window_builder.hpp" @@ -81,7 +81,7 @@ class tunit_test_access_only * @param functor The function to load the definitions. */ void register_widget(const std::string& id, - boost::function functor); diff --git a/src/gui/widgets/slider.cpp b/src/gui/widgets/slider.cpp index 941b15809f89..32c2c4fded1a 100644 --- a/src/gui/widgets/slider.cpp +++ b/src/gui/widgets/slider.cpp @@ -25,7 +25,7 @@ #include "gettext.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -45,10 +45,10 @@ tslider::tslider() , maximum_value_label_() , value_labels_() { - connect_signal(boost::bind( + connect_signal(std::bind( &tslider::signal_handler_sdl_key_down, this, _2, _3, _5)); connect_signal( - boost::bind(&tslider::signal_handler_left_button_up, this, _2, _3)); + std::bind(&tslider::signal_handler_left_button_up, this, _2, _3)); } tpoint tslider::calculate_best_size() const @@ -296,8 +296,8 @@ static t_string default_value_label_generator(const std::vector& value void tslider::set_value_labels(const std::vector& value_labels) { - //dont use boost::ref becasue we want to store value_labels in the cloasure. - set_value_labels(boost::bind(&default_value_label_generator, value_labels, _1, _2)); + //dont use std::ref becasue we want to store value_labels in the cloasure. + set_value_labels(std::bind(&default_value_label_generator, value_labels, _1, _2)); } // }---------- DEFINITION ---------{ diff --git a/src/gui/widgets/slider.hpp b/src/gui/widgets/slider.hpp index 636b82423417..5e1b3cf5b6b7 100644 --- a/src/gui/widgets/slider.hpp +++ b/src/gui/widgets/slider.hpp @@ -68,7 +68,7 @@ class tslider : public tscrollbar_, public tinteger_selector_ { return minimum_value_ + get_item_count() - 1; } - typedef boost::function tlabel_creator; + typedef std::function tlabel_creator; /***** ***** ***** setters / getters for members ***** ****** *****/ void set_best_slider_length(const unsigned length) diff --git a/src/gui/widgets/spacer.cpp b/src/gui/widgets/spacer.cpp index b18965e9c7d7..bc7741f73ac6 100644 --- a/src/gui/widgets/spacer.cpp +++ b/src/gui/widgets/spacer.cpp @@ -19,7 +19,7 @@ #include "gui/core/register_widget.hpp" #include "gui/widgets/settings.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/stacked_widget.cpp b/src/gui/widgets/stacked_widget.cpp index cb84fd203bd4..227c20aa7ebf 100644 --- a/src/gui/widgets/stacked_widget.cpp +++ b/src/gui/widgets/stacked_widget.cpp @@ -22,7 +22,7 @@ #include "gui/widgets/generator.hpp" #include "gettext.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/text.cpp b/src/gui/widgets/text.cpp index 70d25683f968..e457340352a6 100644 --- a/src/gui/widgets/text.cpp +++ b/src/gui/widgets/text.cpp @@ -21,7 +21,7 @@ #include "serialization/string_utils.hpp" #include "serialization/unicode.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -39,18 +39,18 @@ ttext_::ttext_() { #ifdef __unix__ // pastes on UNIX systems. - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_::signal_handler_middle_button_click, this, _2, _3)); #endif - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_::signal_handler_sdl_key_down, this, _2, _3, _5, _6, _7)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_::signal_handler_receive_keyboard_focus, this, _2)); connect_signal( - boost::bind(&ttext_::signal_handler_lose_keyboard_focus, this, _2)); + std::bind(&ttext_::signal_handler_lose_keyboard_focus, this, _2)); } void ttext_::set_active(const bool active) diff --git a/src/gui/widgets/text.hpp b/src/gui/widgets/text.hpp index e28d4b6276cf..cfe109230cac 100644 --- a/src/gui/widgets/text.hpp +++ b/src/gui/widgets/text.hpp @@ -21,7 +21,7 @@ #include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" namespace gui2 { @@ -85,7 +85,7 @@ class ttext_ : public tcontrol /** Set the text_changed callback. */ void set_text_changed_callback( - boost::function cb) + std::function cb) { text_changed_callback_ = cb; } @@ -434,7 +434,7 @@ class ttext_ : public tcontrol * - The widget invoking the callback * - The new text of the textbox. */ - boost::function + std::function text_changed_callback_; /***** ***** ***** signal handlers ***** ****** *****/ diff --git a/src/gui/widgets/text_box.cpp b/src/gui/widgets/text_box.cpp index 8365ecdb02c9..ac0f7b0888e5 100644 --- a/src/gui/widgets/text_box.cpp +++ b/src/gui/widgets/text_box.cpp @@ -23,7 +23,7 @@ #include "gui/widgets/window.hpp" #include "game_preferences.hpp" #include "serialization/unicode.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -106,13 +106,13 @@ ttext_box::ttext_box() { set_wants_mouse_left_double_click(); - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_box::signal_handler_mouse_motion, this, _2, _3, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_box::signal_handler_left_button_down, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_box::signal_handler_left_button_up, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttext_box::signal_handler_left_button_double_click, this, _2, _3)); } diff --git a/src/gui/widgets/toggle_button.cpp b/src/gui/widgets/toggle_button.cpp index 84a511940b62..30e88f50f94f 100644 --- a/src/gui/widgets/toggle_button.cpp +++ b/src/gui/widgets/toggle_button.cpp @@ -24,7 +24,7 @@ #include "sound.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -44,14 +44,14 @@ ttoggle_button::ttoggle_button() , callback_state_change_() , icon_name_() { - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_button::signal_handler_mouse_enter, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_button::signal_handler_mouse_leave, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_button::signal_handler_left_button_click, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_button::signal_handler_left_button_double_click, this, _2, diff --git a/src/gui/widgets/toggle_button.hpp b/src/gui/widgets/toggle_button.hpp index 093afb75c3cc..1a877fad6211 100644 --- a/src/gui/widgets/toggle_button.hpp +++ b/src/gui/widgets/toggle_button.hpp @@ -66,7 +66,7 @@ class ttoggle_button : public tcontrol, public tselectable_ void set_retval(const int retval); /** Inherited from tselectable_. */ - void set_callback_state_change(boost::function callback) + void set_callback_state_change(std::function callback) { callback_state_change_ = callback; } @@ -119,7 +119,7 @@ class ttoggle_button : public tcontrol, public tselectable_ int retval_; /** See tselectable_::set_callback_state_change. */ - boost::function callback_state_change_; + std::function callback_state_change_; /** * The toggle button can contain an icon next to the text. diff --git a/src/gui/widgets/toggle_panel.cpp b/src/gui/widgets/toggle_panel.cpp index 9b6dd6155d78..f81f65494c64 100644 --- a/src/gui/widgets/toggle_panel.cpp +++ b/src/gui/widgets/toggle_panel.cpp @@ -25,7 +25,7 @@ #include "sound.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -47,32 +47,32 @@ ttoggle_panel::ttoggle_panel() { set_wants_mouse_left_double_click(); - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_panel::signal_handler_mouse_enter, this, _2, _3)); - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_panel::signal_handler_mouse_leave, this, _2, _3)); #if 0 connect_signal( - boost::bind(&ttoggle_panel::signal_handler_pre_left_button_click, + std::bind(&ttoggle_panel::signal_handler_pre_left_button_click, this, _2), event::tdispatcher::back_pre_child); #endif - connect_signal(boost::bind( + connect_signal(std::bind( &ttoggle_panel::signal_handler_left_button_click, this, _2, _3)); connect_signal( - boost::bind(&ttoggle_panel::signal_handler_left_button_click, + std::bind(&ttoggle_panel::signal_handler_left_button_click, this, _2, _3), event::tdispatcher::back_post_child); connect_signal( - boost::bind(&ttoggle_panel::signal_handler_left_button_double_click, + std::bind(&ttoggle_panel::signal_handler_left_button_double_click, this, _2, _3)); connect_signal( - boost::bind(&ttoggle_panel::signal_handler_left_button_double_click, + std::bind(&ttoggle_panel::signal_handler_left_button_double_click, this, _2, _3), diff --git a/src/gui/widgets/toggle_panel.hpp b/src/gui/widgets/toggle_panel.hpp index 9ad9fb32f1e7..1314ce335ad1 100644 --- a/src/gui/widgets/toggle_panel.hpp +++ b/src/gui/widgets/toggle_panel.hpp @@ -102,13 +102,13 @@ class ttoggle_panel : public tpanel, public tselectable_ void set_retval(const int retval); /** Inherited from tselectable_. */ - void set_callback_state_change(boost::function callback) + void set_callback_state_change(std::function callback) { callback_state_change_ = callback; } void set_callback_mouse_left_double_click( - boost::function callback) + std::function callback) { callback_mouse_left_double_click_ = callback; } @@ -153,10 +153,10 @@ class ttoggle_panel : public tpanel, public tselectable_ int retval_; /** See tselectable_::set_callback_state_change. */ - boost::function callback_state_change_; + std::function callback_state_change_; /** Mouse left double click callback */ - boost::function callback_mouse_left_double_click_; + std::function callback_mouse_left_double_click_; /** See @ref twidget::impl_draw_background. */ virtual void impl_draw_background(surface& frame_buffer, diff --git a/src/gui/widgets/tree_view.cpp b/src/gui/widgets/tree_view.cpp index 40c0e40600b2..051718eb17d6 100644 --- a/src/gui/widgets/tree_view.cpp +++ b/src/gui/widgets/tree_view.cpp @@ -25,7 +25,7 @@ #include "gettext.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER get_control_type() + " [" + id() + "] " + __func__ #define LOG_HEADER LOG_SCOPE_HEADER + ':' @@ -51,7 +51,7 @@ ttree_view::ttree_view(const std::vector& node_definitions) , selection_change_callback_() { connect_signal( - boost::bind(&ttree_view::signal_handler_left_button_down, this, _2), + std::bind(&ttree_view::signal_handler_left_button_down, this, _2), event::tdispatcher::back_pre_child); } diff --git a/src/gui/widgets/tree_view.hpp b/src/gui/widgets/tree_view.hpp index ede8eb8b606d..5c823c16077c 100644 --- a/src/gui/widgets/tree_view.hpp +++ b/src/gui/widgets/tree_view.hpp @@ -89,7 +89,7 @@ class ttree_view : public tscrollbar_container return selected_item_; } - void set_selection_change_callback(boost::function callback) + void set_selection_change_callback(std::function callback) { selection_change_callback_ = callback; } @@ -124,7 +124,7 @@ class ttree_view : public tscrollbar_container ttree_view_node* selected_item_; - boost::function selection_change_callback_; + std::function selection_change_callback_; /** * Resizes the content. diff --git a/src/gui/widgets/tree_view_node.cpp b/src/gui/widgets/tree_view_node.cpp index cfaae72595e7..f15222e79331 100644 --- a/src/gui/widgets/tree_view_node.cpp +++ b/src/gui/widgets/tree_view_node.cpp @@ -23,7 +23,7 @@ #include "gui/widgets/toggle_panel.hpp" #include "gui/widgets/tree_view.hpp" -#include +#include "utils/functional.hpp" #define LOG_SCOPE_HEADER \ get_control_type() + " [" + tree_view().id() + "] " + __func__ @@ -65,11 +65,11 @@ ttree_view_node::ttree_view_node( if(toggle_) { toggle_widget->set_visible(twidget::tvisible::hidden); - toggle_widget->connect_signal(boost::bind( + toggle_widget->connect_signal(std::bind( &ttree_view_node::signal_handler_left_button_click, this, _2)); - toggle_widget->connect_signal(boost::bind( + toggle_widget->connect_signal(std::bind( &ttree_view_node::signal_handler_left_button_click, this, _2), event::tdispatcher::back_post_child); @@ -91,7 +91,7 @@ ttree_view_node::ttree_view_node( label_ = dynamic_cast(widget); if(label_) { widget->connect_signal( - boost::bind( + std::bind( &ttree_view_node:: signal_handler_label_left_button_click, this, @@ -100,7 +100,7 @@ ttree_view_node::ttree_view_node( _4), event::tdispatcher::front_child); widget->connect_signal( - boost::bind( + std::bind( &ttree_view_node:: signal_handler_label_left_button_click, this, diff --git a/src/gui/widgets/tree_view_node.hpp b/src/gui/widgets/tree_view_node.hpp index 68100249de7d..064b3b165211 100644 --- a/src/gui/widgets/tree_view_node.hpp +++ b/src/gui/widgets/tree_view_node.hpp @@ -200,7 +200,7 @@ class ttree_view_node : public twidget * 2 : on folded to unfolded */ void set_callback_state_change( - const int scope, boost::function callback) + const int scope, std::function callback) { switch (scope) { case 0: @@ -307,13 +307,13 @@ class ttree_view_node : public twidget int y_offset) override; /** See tselectable_::set_callback_state_change. */ - boost::function callback_state_change_; + std::function callback_state_change_; /** See tselectable_::set_callback_state_change. */ - boost::function callback_state_to_folded_; + std::function callback_state_to_folded_; /** See tselectable_::set_callback_state_change. */ - boost::function callback_state_to_unfolded_; + std::function callback_state_to_unfolded_; // FIXME rename to icon void signal_handler_left_button_click(const event::tevent event); diff --git a/src/gui/widgets/unit_preview_pane.cpp b/src/gui/widgets/unit_preview_pane.cpp index adfa69c1fefe..eee754c72a4f 100644 --- a/src/gui/widgets/unit_preview_pane.cpp +++ b/src/gui/widgets/unit_preview_pane.cpp @@ -34,7 +34,7 @@ #include "team.hpp" #include "units/types.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { @@ -60,7 +60,7 @@ void tunit_preview_pane::finalize_setup() if(button_profile_) { connect_signal_mouse_left_click(*button_profile_, - boost::bind(&tunit_preview_pane::profile_button_callback, this)); + std::bind(&tunit_preview_pane::profile_button_callback, this)); } } diff --git a/src/gui/widgets/vertical_scrollbar.cpp b/src/gui/widgets/vertical_scrollbar.cpp index b121e63d971e..a2bff01146fc 100644 --- a/src/gui/widgets/vertical_scrollbar.cpp +++ b/src/gui/widgets/vertical_scrollbar.cpp @@ -19,7 +19,7 @@ #include "gui/widgets/settings.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" namespace gui2 { diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index 654029b8d611..a1b6cebaaca7 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -63,7 +63,7 @@ #include "video.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" namespace game_logic { class function_symbol_table; } namespace gui2 { class tbutton; } @@ -351,16 +351,16 @@ twindow::twindow(CVideo& video, connect(); - connect_signal(boost::bind(&twindow::draw, this)); + connect_signal(std::bind(&twindow::draw, this)); - connect_signal(boost::bind( + connect_signal(std::bind( &twindow::signal_handler_sdl_video_resize, this, _2, _3, _5)); - connect_signal(boost::bind( + connect_signal(std::bind( &event::tdistributor::initialize_state, event_distributor_)); connect_signal( - boost::bind(&twindow::signal_handler_click_dismiss, + std::bind(&twindow::signal_handler_click_dismiss, this, _2, _3, @@ -368,7 +368,7 @@ twindow::twindow(CVideo& video, SDL_BUTTON_LMASK), event::tdispatcher::front_child); connect_signal( - boost::bind(&twindow::signal_handler_click_dismiss, + std::bind(&twindow::signal_handler_click_dismiss, this, _2, _3, @@ -376,7 +376,7 @@ twindow::twindow(CVideo& video, SDL_BUTTON_MMASK), event::tdispatcher::front_child); connect_signal( - boost::bind(&twindow::signal_handler_click_dismiss, + std::bind(&twindow::signal_handler_click_dismiss, this, _2, _3, @@ -385,14 +385,14 @@ twindow::twindow(CVideo& video, event::tdispatcher::front_child); connect_signal( - boost::bind( + std::bind( &twindow::signal_handler_sdl_key_down, this, _2, _3, _5), event::tdispatcher::back_pre_child); - connect_signal(boost::bind( + connect_signal(std::bind( &twindow::signal_handler_sdl_key_down, this, _2, _3, _5)); connect_signal( - boost::bind(&twindow::signal_handler_message_show_tooltip, + std::bind(&twindow::signal_handler_message_show_tooltip, this, _2, _3, @@ -400,7 +400,7 @@ twindow::twindow(CVideo& video, event::tdispatcher::back_pre_child); connect_signal( - boost::bind(&twindow::signal_handler_message_show_helptip, + std::bind(&twindow::signal_handler_message_show_helptip, this, _2, _3, @@ -408,11 +408,11 @@ twindow::twindow(CVideo& video, event::tdispatcher::back_pre_child); connect_signal( - boost::bind( + std::bind( &twindow::signal_handler_request_placement, this, _2, _3), event::tdispatcher::back_pre_child); - register_hotkey(hotkey::GLOBAL__HELPTIP, boost::bind(gui2::helptip)); + register_hotkey(hotkey::GLOBAL__HELPTIP, std::bind(gui2::helptip)); } twindow::~twindow() @@ -1090,7 +1090,7 @@ void twindow::layout() connect_signal_mouse_left_click( *click_dismiss_button, - boost::bind(&twindow::set_retval, this, OK, true)); + std::bind(&twindow::set_retval, this, OK, true)); layout_initialise(true); generate_dot_file("layout_initialise", LAYOUT); @@ -1256,13 +1256,6 @@ const std::string& twindow::get_control_type() const return type; } -void twindow::draw(surface& /*surf*/, - const bool /*force*/, - const bool /*invalidate_background*/) -{ - assert(false); -} - namespace { diff --git a/src/gui/widgets/window.hpp b/src/gui/widgets/window.hpp index c83d449c9692..dc9dda9136c0 100644 --- a/src/gui/widgets/window.hpp +++ b/src/gui/widgets/window.hpp @@ -33,7 +33,6 @@ #include #include #include -#include "utils/boost_function_guarded.hpp" class CVideo; @@ -671,15 +670,6 @@ class twindow : public tpanel, public cursor::setter /** See @ref tcontrol::get_control_type. */ virtual const std::string& get_control_type() const override; - /** - * Inherited from tpanel. - * - * Don't call this function it's only asserts. - */ - void draw(surface& surface, - const bool force = false, - const bool invalidate_background = false); - /** * The list with dirty items in the window. * diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index 26a2dbf2ac27..9f2a735d740f 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -30,8 +30,7 @@ #include "display.hpp" #include "quit_confirmation.hpp" -#include -#include +#include "utils/functional.hpp" #include @@ -554,7 +553,7 @@ void execute_command(const hotkey_command& command, command_executor* executor, executor->get_video().set_fullscreen(!preferences::fullscreen()); break; case HOTKEY_SCREENSHOT: - make_screenshot(_("Screenshot"), executor->get_video(), boost::bind(&::screenshot, _1, boost::ref(executor->get_video()))); + make_screenshot(_("Screenshot"), executor->get_video(), std::bind(&::screenshot, _1, std::ref(executor->get_video()))); break; case HOTKEY_ANIMATE_MAP: preferences::set_animate_map(!preferences::animate_map()); @@ -690,6 +689,6 @@ void command_executor_default::zoom_default() } void command_executor_default::map_screenshot() { - make_screenshot(_("Map-Screenshot"), get_video(), boost::bind(&display::screenshot, &get_display(), _1, true)); + make_screenshot(_("Map-Screenshot"), get_video(), std::bind(&display::screenshot, &get_display(), _1, true)); } } diff --git a/src/hotkey/hotkey_item.cpp b/src/hotkey/hotkey_item.cpp index c915f137fe79..7c0f9fe125c6 100644 --- a/src/hotkey/hotkey_item.cpp +++ b/src/hotkey/hotkey_item.cpp @@ -27,7 +27,7 @@ #include #include #include -#include +#include "utils/functional.hpp" #include "key.hpp" @@ -364,7 +364,7 @@ void add_hotkey(const hotkey_ptr item) if (!hotkeys_.empty()) { hotkeys_.erase( std::remove_if(hotkeys_.begin(), hotkeys_.end(), - boost::bind(&hotkey_base::bindings_equal, _1, (item))), + std::bind(&hotkey_base::bindings_equal, _1, (item))), hotkeys_.end()); } diff --git a/src/image.cpp b/src/image.cpp index 73350eb916fe..6490b46bfd9d 100644 --- a/src/image.cpp +++ b/src/image.cpp @@ -42,7 +42,7 @@ #include -#include +#include "utils/functional.hpp" #include #include @@ -173,7 +173,7 @@ int zoom = tile_size; int cached_zoom = 0; /** Algorithm choices */ -//typedef boost::function scaling_function; +//typedef std::function scaling_function; typedef surface(*scaling_function)(const surface &, int, int); scaling_function scale_to_zoom_func; scaling_function scale_to_hex_func; diff --git a/src/network_asio.cpp b/src/network_asio.cpp index 1659b7b5f379..a8e9f3ccc6b5 100644 --- a/src/network_asio.cpp +++ b/src/network_asio.cpp @@ -13,7 +13,7 @@ */ #include -#include +#include "utils/functional.hpp" #include #include #include @@ -47,7 +47,7 @@ connection::connection(const std::string& host, const std::string& service) { resolver_.async_resolve( boost::asio::ip::tcp::resolver::query(host, service), - boost::bind(&connection::handle_resolve, this, _1, _2) + std::bind(&connection::handle_resolve, this, _1, _2) ); LOG_NW << "Resolving hostname: " << host << '\n'; } @@ -65,7 +65,7 @@ void connection::handle_resolve( void connection::connect(resolver::iterator iterator) { - socket_.async_connect(*iterator, boost::bind( + socket_.async_connect(*iterator, std::bind( &connection::handle_connect, this, _1, iterator) ); LOG_NW << "Connecting to " << iterator->endpoint().address() << '\n'; @@ -97,11 +97,11 @@ void connection::handshake() static const boost::uint32_t handshake = 0; boost::asio::async_write(socket_, boost::asio::buffer(reinterpret_cast(&handshake), 4), - boost::bind(&connection::handle_write, this, _1, _2) + std::bind(&connection::handle_write, this, _1, _2) ); boost::asio::async_read(socket_, boost::asio::buffer(&handshake_response_.binary, 4), - boost::bind(&connection::handle_handshake, this, _1) + std::bind(&connection::handle_handshake, this, _1) ); } @@ -128,12 +128,12 @@ void connection::transfer(const config& request, config& response) std::deque bufs(gzipped_data.begin(), gzipped_data.end()); bufs.push_front(boost::asio::buffer(reinterpret_cast(&payload_size_), 4)); boost::asio::async_write(socket_, bufs, - boost::bind(&connection::is_write_complete, this, _1, _2), - boost::bind(&connection::handle_write, this, _1, _2) + std::bind(&connection::is_write_complete, this, _1, _2), + std::bind(&connection::handle_write, this, _1, _2) ); boost::asio::async_read(socket_, read_buf_, - boost::bind(&connection::is_read_complete, this, _1, _2), - boost::bind(&connection::handle_read, this, _1, _2, boost::ref(response)) + std::bind(&connection::is_read_complete, this, _1, _2), + std::bind(&connection::handle_read, this, _1, _2, std::ref(response)) ); } diff --git a/src/play_controller.cpp b/src/play_controller.cpp index ba583c2e83c1..d231d0b9b956 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -65,6 +65,7 @@ #include "wml_exception.hpp" #include +#include "utils/functional.hpp" static lg::log_domain log_aitesting("aitesting"); #define LOG_AIT LOG_STREAM(info, log_aitesting) @@ -303,8 +304,8 @@ void play_controller::init(CVideo& video, const config& level) gamestate().lua_kernel_->initialize(level); plugins_context_.reset(new plugins_context("Game")); - plugins_context_->set_callback("save_game", boost::bind(&play_controller::save_game_auto, this, boost::bind(get_str, _1, "filename" )), true); - plugins_context_->set_callback("save_replay", boost::bind(&play_controller::save_replay_auto, this, boost::bind(get_str, _1, "filename" )), true); + plugins_context_->set_callback("save_game", std::bind(&play_controller::save_game_auto, this, std::bind(get_str, std::placeholders::_1, "filename" )), true); + plugins_context_->set_callback("save_replay", std::bind(&play_controller::save_replay_auto, this, std::bind(get_str, std::placeholders::_1, "filename" )), true); plugins_context_->set_callback("quit", throw_end_level(), false); }); //Do this after the loadingscreen, so that ita happens in the main thread. diff --git a/src/playsingle_controller.cpp b/src/playsingle_controller.cpp index 0845f4d56849..5cdd2d631113 100644 --- a/src/playsingle_controller.cpp +++ b/src/playsingle_controller.cpp @@ -92,8 +92,8 @@ playsingle_controller::playsingle_controller(const config& level, ai::manager::set_ai_info(ai_info); ai::manager::add_observer(this) ; - plugins_context_->set_accessor_string("level_result", boost::bind(&playsingle_controller::describe_result, this)); - plugins_context_->set_accessor_int("turn", boost::bind(&play_controller::turn, this)); + plugins_context_->set_accessor_string("level_result", std::bind(&playsingle_controller::describe_result, this)); + plugins_context_->set_accessor_int("turn", std::bind(&play_controller::turn, this)); } std::string playsingle_controller::describe_result() const @@ -671,7 +671,7 @@ void playsingle_controller::reset_replay() void playsingle_controller::enable_replay(bool is_unit_test) { - replay_.reset(new replay_controller(*this, gamestate().has_human_sides(), boost::shared_ptr( new config(saved_game_.replay_start())), boost::bind(&playsingle_controller::on_replay_end, this, is_unit_test))); + replay_.reset(new replay_controller(*this, gamestate().has_human_sides(), boost::shared_ptr( new config(saved_game_.replay_start())), std::bind(&playsingle_controller::on_replay_end, this, is_unit_test))); if(is_unit_test) { replay_->play_replay(); } diff --git a/src/playturn_network_adapter.cpp b/src/playturn_network_adapter.cpp index d5958df960a1..50866996d9d8 100644 --- a/src/playturn_network_adapter.cpp +++ b/src/playturn_network_adapter.cpp @@ -4,7 +4,7 @@ #include "log.hpp" #include -#include +#include "utils/functional.hpp" #include #include #include @@ -155,7 +155,7 @@ static bool read_config(config& src, config& dst) playturn_network_adapter::source_type playturn_network_adapter::get_source_from_config(config& cfg) { - return boost::bind(read_config, boost::ref(cfg), _1); + return std::bind(read_config, std::ref(cfg), _1); } bool playturn_network_adapter::read_network(config& cfg) diff --git a/src/playturn_network_adapter.hpp b/src/playturn_network_adapter.hpp index fd496f2c4d6f..92e9fdad9c23 100644 --- a/src/playturn_network_adapter.hpp +++ b/src/playturn_network_adapter.hpp @@ -5,8 +5,7 @@ #include "config.hpp" #include -#include "utils/boost_function_guarded.hpp" - +#include "utils/functional.hpp" /* The purpose if this class is to preprocess incoming network data, and provide a steam that always returns just one command/action at a time. Especially we want each replay command in his own [turn]. @@ -14,7 +13,7 @@ class playturn_network_adapter { public: - typedef boost::function1 source_type; + typedef std::function source_type; playturn_network_adapter(source_type source = read_network); ~playturn_network_adapter(); diff --git a/src/quit_confirmation.hpp b/src/quit_confirmation.hpp index c5c2219e8bdd..54178066c975 100644 --- a/src/quit_confirmation.hpp +++ b/src/quit_confirmation.hpp @@ -19,8 +19,8 @@ class CVideo; #include #include -#include -#include + +#include "utils/functional.hpp" /** * Implements a quit confirmation dialog. @@ -31,7 +31,7 @@ class CVideo; class quit_confirmation { public: - explicit quit_confirmation(const boost::function& prompt = &quit_confirmation::default_prompt) + explicit quit_confirmation(const std::function& prompt = &quit_confirmation::default_prompt) : prompt_(prompt) { blockers_.push_back(this); } ~quit_confirmation() { blockers_.pop_back(); } @@ -56,7 +56,7 @@ class quit_confirmation static std::vector blockers_; static bool open_; - boost::function prompt_; + std::function prompt_; }; #endif diff --git a/src/random_new_synced.cpp b/src/random_new_synced.cpp index 2380d79888e4..dc5c79abbc35 100644 --- a/src/random_new_synced.cpp +++ b/src/random_new_synced.cpp @@ -22,7 +22,7 @@ static lg::log_domain log_random("random"); namespace random_new { - synced_rng::synced_rng(boost::function0 seed_generator) + synced_rng::synced_rng(std::function seed_generator) : has_valid_seed_(false), seed_generator_(seed_generator), gen_() { } diff --git a/src/random_new_synced.hpp b/src/random_new_synced.hpp index 2dca58b1580a..52440921ac39 100644 --- a/src/random_new_synced.hpp +++ b/src/random_new_synced.hpp @@ -15,13 +15,10 @@ #ifndef RANDOM_NEW_SYNCED_H_INCLUDED #define RANDOM_NEW_SYNCED_H_INCLUDED - - #include "random_new.hpp" #include "mt_rng.hpp" -#include "utils/boost_function_guarded.hpp" - +#include "utils/functional.hpp" /* todo: use a boost::random based solution. @@ -31,7 +28,7 @@ namespace random_new class synced_rng : public random_new::rng { public: - synced_rng(boost::function0 seed_generator); + synced_rng(std::function seed_generator); virtual ~synced_rng(); protected: @@ -39,7 +36,7 @@ namespace random_new private: void initialize(); bool has_valid_seed_; - boost::function0 seed_generator_; + std::function seed_generator_; rand_rng::mt_rng gen_; }; } diff --git a/src/recall_list_manager.cpp b/src/recall_list_manager.cpp index d45b3d18fa0c..5a5209b1706e 100644 --- a/src/recall_list_manager.cpp +++ b/src/recall_list_manager.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include "utils/functional.hpp" static bool find_if_matches_helper(const unit_ptr & ptr, const std::string & unit_id) { @@ -33,7 +33,7 @@ static bool find_if_matches_helper(const unit_ptr & ptr, const std::string & uni unit_ptr recall_list_manager::find_if_matches_id(const std::string &unit_id) { std::vector::iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_helper, _1, unit_id)); + std::bind(&find_if_matches_helper, _1, unit_id)); if (it != recall_list_.end()) { return *it; } else { @@ -47,7 +47,7 @@ unit_ptr recall_list_manager::find_if_matches_id(const std::string &unit_id) unit_const_ptr recall_list_manager::find_if_matches_id(const std::string &unit_id) const { std::vector::const_iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_helper, _1, unit_id)); + std::bind(&find_if_matches_helper, _1, unit_id)); if (it != recall_list_.end()) { return *it; } else { @@ -61,7 +61,7 @@ unit_const_ptr recall_list_manager::find_if_matches_id(const std::string &unit_i void recall_list_manager::erase_if_matches_id(const std::string &unit_id) { recall_list_.erase(std::remove_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_helper, _1, unit_id)), + std::bind(&find_if_matches_helper, _1, unit_id)), recall_list_.end()); } @@ -73,7 +73,7 @@ void recall_list_manager::add (const unit_ptr & ptr) size_t recall_list_manager::find_index(const std::string & unit_id) const { std::vector::const_iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_helper, _1, unit_id)); + std::bind(&find_if_matches_helper, _1, unit_id)); return it - recall_list_.begin(); } @@ -81,7 +81,7 @@ size_t recall_list_manager::find_index(const std::string & unit_id) const unit_ptr recall_list_manager::extract_if_matches_id(const std::string &unit_id) { std::vector::iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_helper, _1, unit_id)); + std::bind(&find_if_matches_helper, _1, unit_id)); if (it != recall_list_.end()) { unit_ptr ret = *it; recall_list_.erase(it); @@ -99,7 +99,7 @@ static bool find_if_matches_uid_helper(const unit_ptr & ptr, size_t uid) unit_ptr recall_list_manager::find_if_matches_underlying_id(size_t uid) { std::vector::iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_uid_helper, _1, uid)); + std::bind(&find_if_matches_uid_helper, _1, uid)); if (it != recall_list_.end()) { return *it; } else { @@ -110,7 +110,7 @@ unit_ptr recall_list_manager::find_if_matches_underlying_id(size_t uid) unit_const_ptr recall_list_manager::find_if_matches_underlying_id(size_t uid) const { std::vector::const_iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_uid_helper, _1, uid)); + std::bind(&find_if_matches_uid_helper, _1, uid)); if (it != recall_list_.end()) { return *it; } else { @@ -121,14 +121,14 @@ unit_const_ptr recall_list_manager::find_if_matches_underlying_id(size_t uid) co void recall_list_manager::erase_by_underlying_id(size_t uid) { recall_list_.erase(std::remove_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_uid_helper, _1, uid)), + std::bind(&find_if_matches_uid_helper, _1, uid)), recall_list_.end()); } unit_ptr recall_list_manager::extract_if_matches_underlying_id(size_t uid) { std::vector::iterator it = std::find_if(recall_list_.begin(), recall_list_.end(), - boost::bind(&find_if_matches_uid_helper, _1, uid)); + std::bind(&find_if_matches_uid_helper, _1, uid)); if (it != recall_list_.end()) { unit_ptr ret = *it; recall_list_.erase(it); diff --git a/src/replay_controller.cpp b/src/replay_controller.cpp index 3eafef3e4fab..502bb9e1aef2 100644 --- a/src/replay_controller.cpp +++ b/src/replay_controller.cpp @@ -67,7 +67,7 @@ struct replay_play_side : public replay_controller::replay_stop_condition }; } -replay_controller::replay_controller(play_controller& controller, bool control_view, const boost::shared_ptr& reset_state, const boost::function& on_end_replay) +replay_controller::replay_controller(play_controller& controller, bool control_view, const boost::shared_ptr& reset_state, const std::function& on_end_replay) : controller_(controller) , stop_condition_(new replay_stop_condition()) , disabler_() diff --git a/src/replay_controller.hpp b/src/replay_controller.hpp index a150755af78c..01e3362fefe1 100644 --- a/src/replay_controller.hpp +++ b/src/replay_controller.hpp @@ -34,7 +34,7 @@ class replay_controller : public events::observer virtual ~replay_stop_condition(){} }; static void nop() {}; - replay_controller(play_controller& controller, bool control_view, const boost::shared_ptr& reset_state, const boost::function& on_end_replay = nop); + replay_controller(play_controller& controller, bool control_view, const boost::shared_ptr& reset_state, const std::function& on_end_replay = nop); ~replay_controller(); // void reset_replay(); @@ -93,7 +93,7 @@ class replay_controller : public events::observer }; boost::optional vision_; boost::shared_ptr reset_state_; - boost::function on_end_replay_; + std::function on_end_replay_; bool return_to_play_side_; }; diff --git a/src/scripting/application_lua_kernel.cpp b/src/scripting/application_lua_kernel.cpp index 7f0d15df7fb4..3ad51deb810e 100644 --- a/src/scripting/application_lua_kernel.cpp +++ b/src/scripting/application_lua_kernel.cpp @@ -48,7 +48,7 @@ #include #include -#include +#include "utils/functional.hpp" #include #include #include @@ -180,7 +180,7 @@ application_lua_kernel::thread * application_lua_kernel::load_script_from_string throw game::lua_error(msg, context); } - if (!lua_kernel_base::protected_call(T, 0, 1, boost::bind(&lua_kernel_base::log_error, this, _1, _2))) { + if (!lua_kernel_base::protected_call(T, 0, 1, std::bind(&lua_kernel_base::log_error, this, _1, _2))) { throw game::lua_error("Error when executing a script to make a lua thread."); } if (!lua_isfunction(T, -1)) { @@ -197,7 +197,7 @@ application_lua_kernel::thread * application_lua_kernel::load_script_from_file(c lua_pushstring(T, file.c_str()); lua_fileops::load_file(T); - if (!lua_kernel_base::protected_call(T, 0, 1, boost::bind(&lua_kernel_base::log_error, this, _1, _2))) { + if (!lua_kernel_base::protected_call(T, 0, 1, std::bind(&lua_kernel_base::log_error, this, _1, _2))) { throw game::lua_error("Error when executing a file to make a lua thread."); } if (!lua_isfunction(T, -1)) { @@ -272,7 +272,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( lua_newtable(T_); // this will be the context table for (const std::string & key : ctxt.callbacks_ | boost::adaptors::map_keys ) { lua_pushstring(T_, key.c_str()); - lua_cpp::push_function(T_, boost::bind(&impl_context_backend, _1, this_context_backend, key)); + lua_cpp::push_function(T_, std::bind(&impl_context_backend, _1, this_context_backend, key)); lua_settable(T_, -3); } @@ -285,7 +285,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( const std::string & key = v.first; const plugins_context::accessor_function & func = v.second; lua_pushstring(T_, key.c_str()); - lua_cpp::push_function(T_, boost::bind(&impl_context_accessor, _1, this_context_backend, func)); + lua_cpp::push_function(T_, std::bind(&impl_context_accessor, _1, this_context_backend, func)); lua_settable(T_, -3); } @@ -323,7 +323,7 @@ application_lua_kernel::request_list application_lua_kernel::thread::run_script( application_lua_kernel::request_list results; for (const plugins_manager::event & req : this_context_backend->requests) { - results.push_back(boost::bind(ctxt.callbacks_.find(req.name)->second, req.data)); + results.push_back(std::bind(ctxt.callbacks_.find(req.name)->second, req.data)); //results.push_back(std::make_pair(ctxt.callbacks_.find(req.name)->second, req.data)); } return results; diff --git a/src/scripting/application_lua_kernel.hpp b/src/scripting/application_lua_kernel.hpp index a1502b51bf1a..a05f38fb2509 100644 --- a/src/scripting/application_lua_kernel.hpp +++ b/src/scripting/application_lua_kernel.hpp @@ -20,7 +20,6 @@ #include "scripting/plugins/context.hpp" #include "scripting/plugins/manager.hpp" -#include #include #include #include @@ -34,7 +33,7 @@ class application_lua_kernel : public lua_kernel_base { virtual std::string my_name() { return "Application Lua Kernel"; } - typedef std::vector > request_list; + typedef std::vector > request_list; class thread : private boost::noncopyable { lua_State * T_; diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index a7feae17a9e3..0efc286cd5ae 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -108,7 +108,7 @@ #include "variable_info.hpp" #include "wml_exception.hpp" -#include // for bind_t, bind +#include "utils/functional.hpp" // for bind_t, bind #include // for intrusive_ptr #include #include // boost::copy @@ -4145,7 +4145,7 @@ int game_lua_kernel::impl_theme_item(lua_State *L, std::string m) int game_lua_kernel::impl_theme_items_get(lua_State *L) { char const *m = luaL_checkstring(L, 2); - lua_cpp::push_closure(L, boost::bind(&game_lua_kernel::impl_theme_item, this, _1, std::string(m)), 0); + lua_cpp::push_closure(L, std::bind(&game_lua_kernel::impl_theme_item, this, _1, std::string(m)), 0); lua_pushvalue(L, 2); lua_pushvalue(L, -2); lua_rawset(L, 1); @@ -4622,7 +4622,7 @@ void game_lua_kernel::initialize(const config& level) lua_rawget(L, -2); lua_createtable(L, 0, 0); - if (!protected_call(1, 1, boost::bind(&lua_kernel_base::log_error, this, _1, _2))) { + if (!protected_call(1, 1, std::bind(&lua_kernel_base::log_error, this, _1, _2))) { cmd_log_ << "Failed to compute wesnoth.sides\n"; } else { lua_setfield(L, -2, "sides"); diff --git a/src/scripting/lua_cpp_function.cpp b/src/scripting/lua_cpp_function.cpp index 6464b1aa8a2d..b64cc3145327 100644 --- a/src/scripting/lua_cpp_function.cpp +++ b/src/scripting/lua_cpp_function.cpp @@ -16,7 +16,6 @@ #include "log.hpp" -#include #include #include @@ -102,7 +101,7 @@ void set_functions( lua_State* L, const std::vector& functions) static int intf_closure_dispatcher( lua_State* L ) { - lua_function * f = static_cast< lua_function *> (luaL_checkudata(L, lua_upvalueindex(1), cpp_function)); //assume the boost::function is the first upvalue + lua_function * f = static_cast< lua_function *> (luaL_checkudata(L, lua_upvalueindex(1), cpp_function)); //assume the std::function is the first upvalue return (*f)(L); } diff --git a/src/scripting/lua_cpp_function.hpp b/src/scripting/lua_cpp_function.hpp index 83984ba6cce5..218670657827 100644 --- a/src/scripting/lua_cpp_function.hpp +++ b/src/scripting/lua_cpp_function.hpp @@ -14,15 +14,15 @@ /** * This namespace makes the possibility to push not just C style functions, - * but CPP style functions to lua, if they are cast as a boost::function. - * Using this, for example, C++ method functions may be boost::bind'ed and + * but CPP style functions to lua, if they are cast as a std::function. + * Using this, for example, C++ method functions may be std::bind'ed and * then pushed into the lua environment and called like usual. * * They are represented as user data with a call operator, which uses a * dispatcher implemented as a C-style function to retrieve the boost * function and execute it. Thus effectively all that we have to provide * is a "value type" user data (full userdata, not light userdata) in lua - * which wraps the boost::function type and implements a garbage collector. + * which wraps the std::function type and implements a garbage collector. * * * -- Why? -- @@ -108,7 +108,7 @@ * Essentially, we provide C++ versions of the lua library calls 'lua_pushcfunction', * 'lua_setfuncs', 'lua_pushcclosure'. * - * - They are "C++" versions in that they take boost::function rather + * - They are "C++" versions in that they take std::function rather * than int(lua_State*). * - While for lua, "lua_pushcfunction(L, f)" is essentially the same as * "lua_pushcclosure(L, f, 0)", for the functions below that is not the case. @@ -125,14 +125,15 @@ #ifndef LUA_CPP_FUNCTION_HPP_INCLUDED #define LUA_CPP_FUNCTION_HPP_INCLUDED -#include +#include "utils/functional.hpp" + #include struct lua_State; namespace lua_cpp { -typedef boost::function lua_function; +typedef std::function lua_function; typedef struct { const char * name; @@ -142,7 +143,7 @@ typedef struct { void register_metatable ( lua_State* L ); /** - * Pushes a boost::function wrapper object onto the stack. It does + * Pushes a std::function wrapper object onto the stack. It does * not support up-values. If you need that use push_closure (a little slower). * * NOTE: This object has type userdata, not function. Its metatable has a call operator. @@ -176,7 +177,7 @@ void set_functions( lua_State* L, const lua_cpp::Reg(& functions)[N]) } /** - * Pushes a closure which retains a boost::function object as its first up-value. + * Pushes a closure which retains a std::function object as its first up-value. * Note that this is *NOT* strictly compatible with the lua c function push_closure -- * if you request additional upvalues they will be indexed starting at 2 rather than 1. * diff --git a/src/scripting/lua_gui2.cpp b/src/scripting/lua_gui2.cpp index 659a0ec52ba6..21d448ee8f27 100644 --- a/src/scripting/lua_gui2.cpp +++ b/src/scripting/lua_gui2.cpp @@ -47,7 +47,7 @@ #include "serialization/string_utils.hpp" #include "tstring.hpp" -#include +#include "utils/functional.hpp" #include #include @@ -579,7 +579,7 @@ int intf_set_dialog_callback(lua_State *L) if (gui2::tclickable_ *c = dynamic_cast(w)) { static tdialog_callback_wrapper wrapper; - c->connect_click_handler(boost::bind( + c->connect_click_handler(std::bind( &tdialog_callback_wrapper::forward , wrapper , w)); @@ -590,7 +590,7 @@ int intf_set_dialog_callback(lua_State *L) else if (gui2::tlist *l = dynamic_cast(w)) { static tdialog_callback_wrapper wrapper; connect_signal_notify_modified(*l - , boost::bind( + , std::bind( &tdialog_callback_wrapper::forward , wrapper , w)); diff --git a/src/scripting/lua_kernel_base.cpp b/src/scripting/lua_kernel_base.cpp index d8ecfb52b83e..6700b1803edc 100644 --- a/src/scripting/lua_kernel_base.cpp +++ b/src/scripting/lua_kernel_base.cpp @@ -37,7 +37,7 @@ #include "version.hpp" // for do_version_check, etc -#include +#include "utils/functional.hpp" #include #include @@ -288,10 +288,10 @@ lua_kernel_base::lua_kernel_base(CVideo * video) /* lua_cpp::Reg const cpp_callbacks[] = { - { "dofile", boost::bind(&lua_kernel_base::intf_dofile, this, _1)}, - { "require", boost::bind(&lua_kernel_base::intf_require, this, _1)}, - { "show_dialog", boost::bind(&lua_kernel_base::intf_show_dialog, this, _1)}, - { "show_lua_console", boost::bind(&lua_kernel_base::intf_show_lua_console, this, _1)}, + { "dofile", std::bind(&lua_kernel_base::intf_dofile, this, _1)}, + { "require", std::bind(&lua_kernel_base::intf_require, this, _1)}, + { "show_dialog", std::bind(&lua_kernel_base::intf_show_dialog, this, _1)}, + { "show_lua_console", std::bind(&lua_kernel_base::intf_show_lua_console, this, _1)}, }; */ @@ -358,7 +358,7 @@ lua_kernel_base::lua_kernel_base(CVideo * video) //run "ilua.set_strict()" lua_pushstring(L, "set_strict"); lua_gettable(L, -2); - if (!protected_call(0,0, boost::bind(&lua_kernel_base::log_error, this, _1, _2))) { + if (!protected_call(0,0, std::bind(&lua_kernel_base::log_error, this, _1, _2))) { cmd_log_ << "Failed to activate strict mode.\n"; } else { cmd_log_ << "Activated strict mode.\n"; @@ -388,13 +388,13 @@ void lua_kernel_base::throw_exception(char const * msg, char const * context) bool lua_kernel_base::protected_call(int nArgs, int nRets) { - error_handler eh = boost::bind(&lua_kernel_base::log_error, this, _1, _2 ); + error_handler eh = std::bind(&lua_kernel_base::log_error, this, _1, _2 ); return protected_call(nArgs, nRets, eh); } bool lua_kernel_base::load_string(char const * prog) { - error_handler eh = boost::bind(&lua_kernel_base::log_error, this, _1, _2 ); + error_handler eh = std::bind(&lua_kernel_base::log_error, this, _1, _2 ); return load_string(prog, eh); } @@ -480,7 +480,7 @@ bool lua_kernel_base::load_string(char const * prog, error_handler e_h) // void lua_kernel_base::throwing_run(const char * prog) { cmd_log_ << "$ " << prog << "\n"; - error_handler eh = boost::bind(&lua_kernel_base::throw_exception, this, _1, _2 ); + error_handler eh = std::bind(&lua_kernel_base::throw_exception, this, _1, _2 ); load_string(prog, eh); protected_call(0, 0, eh); } @@ -501,7 +501,7 @@ void lua_kernel_base::interactive_run(char const * prog) { experiment += prog; experiment += ")"; - error_handler eh = boost::bind(&lua_kernel_base::throw_exception, this, _1, _2 ); + error_handler eh = std::bind(&lua_kernel_base::throw_exception, this, _1, _2 ); try { // Try to load the experiment without syntax errors @@ -524,7 +524,7 @@ int lua_kernel_base::intf_dofile(lua_State* L) if (lua_fileops::load_file(L) != 1) return 0; //^ should end with the file contents loaded on the stack. actually it will call lua_error otherwise, the return 0 is redundant. - error_handler eh = boost::bind(&lua_kernel_base::log_error, this, _1, _2 ); + error_handler eh = std::bind(&lua_kernel_base::log_error, this, _1, _2 ); protected_call(0, LUA_MULTRET, eh); return lua_gettop(L); } @@ -559,7 +559,7 @@ int lua_kernel_base::intf_require(lua_State* L) // stack is now [packagename] [wesnoth] [package] [chunk] DBG_LUA << "require: loaded a file, now calling it\n"; - if (!protected_call(L, 0, 1, boost::bind(&lua_kernel_base::log_error, this, _1, _2))) return 0; + if (!protected_call(L, 0, 1, std::bind(&lua_kernel_base::log_error, this, _1, _2))) return 0; //^ historically if wesnoth.require fails it just yields nil and some logging messages, not a lua error // stack is now [packagename] [wesnoth] [package] [results] diff --git a/src/scripting/lua_kernel_base.hpp b/src/scripting/lua_kernel_base.hpp index 3d14657bbd47..dad347534801 100644 --- a/src/scripting/lua_kernel_base.hpp +++ b/src/scripting/lua_kernel_base.hpp @@ -18,7 +18,7 @@ #include #include #include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include struct lua_State; @@ -52,7 +52,7 @@ class lua_kernel_base { virtual void log_error(char const* msg, char const* context = "Lua error"); virtual void throw_exception(char const* msg, char const* context = "Lua error"); //throws game::lua_error - typedef boost::function error_handler; + typedef std::function error_handler; void set_video(CVideo * ptr) { video_ = ptr; } diff --git a/src/scripting/mapgen_lua_kernel.cpp b/src/scripting/mapgen_lua_kernel.cpp index aceda06cf90f..c85862fe7891 100644 --- a/src/scripting/mapgen_lua_kernel.cpp +++ b/src/scripting/mapgen_lua_kernel.cpp @@ -24,7 +24,7 @@ #include #include -#include +#include "utils/functional.hpp" #include "lua/lauxlib.h" #include "lua/lua.h" @@ -141,9 +141,9 @@ mapgen_lua_kernel::mapgen_lua_kernel() void mapgen_lua_kernel::run_generator(const char * prog, const config & generator) { - load_string(prog, boost::bind(&lua_kernel_base::throw_exception, this, _1, _2)); + load_string(prog, std::bind(&lua_kernel_base::throw_exception, this, _1, _2)); luaW_pushconfig(mState, generator); - protected_call(1, 1, boost::bind(&lua_kernel_base::throw_exception, this, _1, _2)); + protected_call(1, 1, std::bind(&lua_kernel_base::throw_exception, this, _1, _2)); } void mapgen_lua_kernel::user_config(const char * prog, const config & generator) diff --git a/src/scripting/plugins/context.cpp b/src/scripting/plugins/context.cpp index 2988f5dd16f5..e09dba625382 100644 --- a/src/scripting/plugins/context.cpp +++ b/src/scripting/plugins/context.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include "utils/functional.hpp" plugins_context::plugins_context(const std::string & name) : callbacks_() @@ -78,14 +78,14 @@ static config make_config(const std::string & name, const T & val) return config_of(name, val); } -void plugins_context::set_accessor_string(const std::string & name, boost::function func) +void plugins_context::set_accessor_string(const std::string & name, std::function func) { - set_accessor(name, boost::bind(&make_config, name, boost::bind(func, _1))); + set_accessor(name, std::bind(&make_config, name, std::bind(func, _1))); } -void plugins_context::set_accessor_int(const std::string & name, boost::function func) +void plugins_context::set_accessor_int(const std::string & name, std::function func) { - set_accessor(name, boost::bind(&make_config, name, boost::bind(func, _1))); + set_accessor(name, std::bind(&make_config, name, std::bind(func, _1))); } @@ -107,27 +107,27 @@ void plugins_context::play_slice() plugins_manager::get()->play_slice(*this); } -static bool shim(config cfg, boost::function func, bool return_value) +static bool shim(config cfg, std::function func, bool return_value) { func(cfg); return return_value; } -void plugins_context::set_callback(const std::string & name, boost::function func, bool preserves_context) +void plugins_context::set_callback(const std::string & name, std::function func, bool preserves_context) { - set_callback(name, boost::bind(shim, _1, func, preserves_context)); + set_callback(name, std::bind(shim, _1, func, preserves_context)); } -const boost::function< std::string ( const config & , const std::string & ) > get_str = - boost::bind(&config::attribute_value::str, - boost::bind(static_cast(&config::operator[]) , _1, _2)); +const std::function< std::string ( const config & , const std::string & ) > get_str = + std::bind(&config::attribute_value::str, + std::bind(static_cast(&config::operator[]) , _1, _2)); -const boost::function< int ( const config & , const std::string &, int ) > get_int = - boost::bind(&config::attribute_value::to_int, - boost::bind(static_cast(&config::operator[]) , _1, _2) +const std::function< int ( const config & , const std::string &, int ) > get_int = + std::bind(&config::attribute_value::to_int, + std::bind(static_cast(&config::operator[]) , _1, _2) , _3); -const boost::function< size_t ( const config & , const std::string &, size_t ) > get_size_t = - boost::bind(&config::attribute_value::to_size_t, - boost::bind(static_cast(&config::operator[]) , _1, _2) +const std::function< size_t ( const config & , const std::string &, size_t ) > get_size_t = + std::bind(&config::attribute_value::to_size_t, + std::bind(static_cast(&config::operator[]) , _1, _2) , _3); diff --git a/src/scripting/plugins/context.hpp b/src/scripting/plugins/context.hpp index 032a9f855a11..c663bead89be 100644 --- a/src/scripting/plugins/context.hpp +++ b/src/scripting/plugins/context.hpp @@ -20,9 +20,10 @@ #ifndef INCLUDED_PLUGINS_CONTEXT_HPP_ #define INCLUDED_PLUGINS_CONTEXT_HPP_ +#include "utils/functional.hpp" + #include #include -#include #include class config; @@ -30,10 +31,10 @@ class config; class plugins_context { public: - typedef boost::function callback_function; + typedef std::function callback_function; typedef struct { char const * name; callback_function func; } Reg; - typedef boost::function accessor_function; + typedef std::function accessor_function; typedef struct { char const * name; accessor_function func; } aReg; plugins_context( const std::string & name ); @@ -58,13 +59,13 @@ class plugins_context { void play_slice(); void set_callback(const std::string & name, callback_function); - void set_callback(const std::string & name, boost::function function, bool preserves_context); + void set_callback(const std::string & name, std::function function, bool preserves_context); size_t erase_callback(const std::string & name); size_t clear_callbacks(); void set_accessor(const std::string & name, accessor_function); - void set_accessor_string(const std::string & name, boost::function); //helpers which create a config from a simple type - void set_accessor_int(const std::string & name, boost::function); + void set_accessor_string(const std::string & name, std::function); //helpers which create a config from a simple type + void set_accessor_int(const std::string & name, std::function); size_t erase_accessor(const std::string & name); size_t clear_accessors(); @@ -73,7 +74,7 @@ class plugins_context { private: typedef std::map callback_list; typedef std::map accessor_list; - + void initialize(const std::vector& callbacks, const std::vector& accessors); callback_list callbacks_; @@ -82,8 +83,8 @@ class plugins_context { }; //A shim to assist in retrieving config attribute values -extern const boost::function< std::string ( const config & , const std::string & ) > get_str; -extern const boost::function< int ( const config & , const std::string &, int ) > get_int; -extern const boost::function< size_t ( const config & , const std::string &, size_t ) > get_size_t; +extern const std::function< std::string ( const config & , const std::string & ) > get_str; +extern const std::function< int ( const config & , const std::string &, int ) > get_int; +extern const std::function< size_t ( const config & , const std::string &, size_t ) > get_size_t; #endif diff --git a/src/scripting/plugins/manager.cpp b/src/scripting/plugins/manager.cpp index a267133fd575..5e862b03cc65 100644 --- a/src/scripting/plugins/manager.cpp +++ b/src/scripting/plugins/manager.cpp @@ -183,7 +183,7 @@ void plugins_manager::play_slice(const plugins_context & ctxt) plugins_[idx].queue = std::vector(); //application_lua_kernel::requests_list requests = - std::vector > requests = + std::vector > requests = plugins_[idx].thread->run_script(ctxt, input); DBG_PLG << "thread returned " << requests.size() << " requests\n"; diff --git a/src/server/ban.cpp b/src/server/ban.cpp index a24626ec62a7..eafde7bfae76 100644 --- a/src/server/ban.cpp +++ b/src/server/ban.cpp @@ -23,7 +23,7 @@ #include "ban.hpp" -#include +#include "utils/functional.hpp" namespace wesnothd { @@ -550,7 +550,7 @@ static lg::log_domain log_server("server"); { ban_set temp; std::insert_iterator temp_inserter(temp, temp.begin()); - std::remove_copy_if(bans_.begin(), bans_.end(), temp_inserter, boost::bind(&banned::match_group,boost::bind(&banned_ptr::get,_1),group)); + std::remove_copy_if(bans_.begin(), bans_.end(), temp_inserter, std::bind(&banned::match_group,std::bind(&banned_ptr::get,_1),group)); os << "Removed " << (bans_.size() - temp.size()) << " bans"; bans_.swap(temp); @@ -646,7 +646,7 @@ static lg::log_domain log_server("server"); out << *groups.begin(); std::ostream& (*fn)(std::ostream&,const std::string&) = &std::operator<<; - std::for_each( ++groups.begin(), groups.end(), boost::bind(fn,boost::bind(fn,boost::ref(out),std::string(", ")),_1)); + std::for_each( ++groups.begin(), groups.end(), std::bind(fn,std::bind(fn,std::ref(out),std::string(", ")),_1)); } } @@ -660,7 +660,7 @@ static lg::log_domain log_server("server"); } catch (banned::error&) { return ""; } - ban_set::const_iterator ban = std::find_if(bans_.begin(), bans_.end(), boost::bind(&banned::match_ip, boost::bind(&banned_ptr::get, _1), pair)); + ban_set::const_iterator ban = std::find_if(bans_.begin(), bans_.end(), std::bind(&banned::match_ip, std::bind(&banned_ptr::get, _1), pair)); if (ban == bans_.end()) return ""; const std::string& nick = (*ban)->get_nick(); return (*ban)->get_reason() + (nick.empty() ? "" : " (" + nick + ")") + " (" + (*ban)->get_human_time_span() + ")"; diff --git a/src/server/player_network.hpp b/src/server/player_network.hpp index 8a268806153a..1f203ee70966 100644 --- a/src/server/player_network.hpp +++ b/src/server/player_network.hpp @@ -20,7 +20,7 @@ #include "player.hpp" #include "simple_wml.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include "log.hpp" extern lg::log_domain log_config_pn; @@ -72,7 +72,7 @@ void send_to_many(simple_wml::document& data, /* void send_to_many(simple_wml::document& data, const connection_vector& vec, - boost::function pred, + std::function pred, const network::connection exclude = 0, std::string packet_type = ""); */ diff --git a/src/server/server.cpp b/src/server/server.cpp index 02b05cb71249..86030c5c1dc8 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -50,7 +50,8 @@ #include "forum_user_handler.hpp" #endif -#include +#include "utils/functional.hpp" + #include #include #include @@ -1403,10 +1404,10 @@ std::string server::process_command(std::string query, std::string issuer_name) const cmd_handler &handler = handler_itor->second; try { handler(this, issuer_name, query, parameters, &out); - } catch (boost::bad_function_call & ex) { - ERR_SERVER << "While handling a command '" << command << "', caught a boost::bad_function_call exception.\n"; + } catch (std::bad_function_call & ex) { + ERR_SERVER << "While handling a command '" << command << "', caught an std::bad_function_call exception.\n"; ERR_SERVER << ex.what() << std::endl; - out << "An internal server error occurred (boost::bad_function_call) while executing '" << command << "'\n"; + out << "An internal server error occurred (std::bad_function_call) while executing '" << command << "'\n"; } } @@ -2035,7 +2036,7 @@ void server::searchlog_handler(const std::string& /*issuer_name*/, const std::st if ((match_ip && utils::wildcard_string_match(ip, parameters)) || (!match_ip && utils::wildcard_string_match(username, parameters))) { found_something = true; - wesnothd::player_map::const_iterator pl = std::find_if(players_.begin(), players_.end(), boost::bind(&::match_user, _1, username, ip)); + wesnothd::player_map::const_iterator pl = std::find_if(players_.begin(), players_.end(), std::bind(&::match_user, _1, username, ip)); if (pl != players_.end()) { *out << std::endl << player_status(pl); } else { diff --git a/src/server/server.hpp b/src/server/server.hpp index cc476ba37180..62d7e814e2de 100644 --- a/src/server/server.hpp +++ b/src/server/server.hpp @@ -25,7 +25,6 @@ #include "room_manager.hpp" #include "simple_wml.hpp" -#include "utils/boost_function_guarded.hpp" #include #include class server @@ -186,7 +185,7 @@ class server void setup_handlers(); - typedef boost::function5 cmd_handler; + typedef std::function cmd_handler; std::map cmd_handlers_; void shut_down_handler(const std::string &, const std::string &, std::string &, std::ostringstream *); diff --git a/src/synced_commands.hpp b/src/synced_commands.hpp index 49e04986ce29..d386649a4a13 100644 --- a/src/synced_commands.hpp +++ b/src/synced_commands.hpp @@ -17,7 +17,7 @@ #include #include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" class config; @@ -30,7 +30,7 @@ class synced_command { TODO: remove the second argument because it isn't used. */ - typedef boost::function2 error_handler_function; + typedef std::function error_handler_function; /* returns: true if the action succeeded correclty, diff --git a/src/synced_context.hpp b/src/synced_context.hpp index a346742d7d7d..5d23922d3208 100644 --- a/src/synced_context.hpp +++ b/src/synced_context.hpp @@ -14,7 +14,7 @@ #ifndef SYNCED_CONTEXT_H_INCLUDED #define SYNCED_CONTEXT_H_INCLUDED -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include "synced_commands.hpp" #include "synced_checkup.hpp" #include "replay.hpp" diff --git a/src/tests/create_images.cpp b/src/tests/create_images.cpp index c826a2b1d5e1..f2d914978f37 100644 --- a/src/tests/create_images.cpp +++ b/src/tests/create_images.cpp @@ -23,7 +23,7 @@ #include -#include +#include "utils/functional.hpp" #include @@ -91,7 +91,7 @@ create_image_blend(const surface& src, const std::string& root) { blend_image( src - , boost::bind(&create_image_blend_functor, _1, root, _2, _3)); + , std::bind(&create_image_blend_functor, _1, root, _2, _3)); } typedef void (*tfunctor) (const surface&, const std::string&); diff --git a/src/tests/gui/fire_event.cpp b/src/tests/gui/fire_event.cpp index 05d7d8c44c7c..046bce4043e7 100644 --- a/src/tests/gui/fire_event.cpp +++ b/src/tests/gui/fire_event.cpp @@ -21,7 +21,7 @@ #include -#include +#include "utils/functional.hpp" #include @@ -39,15 +39,15 @@ void connect_queue( , gui2::twidget& widget) { widget.connect_signal( - boost::bind(print, boost::ref(sstr), "pre", widget.id()) + std::bind(print, std::ref(sstr), "pre", widget.id()) , gui2::event::tdispatcher::back_pre_child); widget.connect_signal( - boost::bind(print, boost::ref(sstr), "child", widget.id()) + std::bind(print, std::ref(sstr), "child", widget.id()) , gui2::event::tdispatcher::back_child); widget.connect_signal( - boost::bind(print, boost::ref(sstr), "post", widget.id()) + std::bind(print, std::ref(sstr), "post", widget.id()) , gui2::event::tdispatcher::back_post_child); } diff --git a/src/tests/gui/test_drop_target.cpp b/src/tests/gui/test_drop_target.cpp index bff97cc4cc4c..90106d3ae4b4 100644 --- a/src/tests/gui/test_drop_target.cpp +++ b/src/tests/gui/test_drop_target.cpp @@ -16,7 +16,7 @@ #include -#include +#include "utils/functional.hpp" #include "sdl/rect.hpp" #include "sdl/utils.hpp" @@ -92,7 +92,7 @@ BOOST_AUTO_TEST_CASE( test_create_drop_targets ) int id_counter = 0; std::for_each(locations.begin(), locations.end(), - boost::bind(create_drop_targets,_1, group, boost::ref(targets), boost::ref(id_counter))); + std::bind(create_drop_targets,_1, group, std::ref(targets), std::ref(id_counter))); BOOST_CHECK_EQUAL(targets.size(), locations.size()); @@ -144,10 +144,10 @@ BOOST_AUTO_TEST_CASE( test_multiple_drop_groups ) int id_counter = 0; std::for_each(locations.begin(), locations.end(), - boost::bind(create_drop_targets,_1, group, boost::ref(targets), boost::ref(id_counter))); + std::bind(create_drop_targets,_1, group, std::ref(targets), std::ref(id_counter))); id_counter = 0; std::for_each(locations2.begin(), locations2.end(), - boost::bind(create_drop_targets,_1, group2, boost::ref(targets2), boost::ref(id_counter))); + std::bind(create_drop_targets,_1, group2, std::ref(targets2), std::ref(id_counter))); BOOST_CHECK_EQUAL(targets.size(), locations.size()); BOOST_CHECK_EQUAL(targets2.size(), locations2.size()); diff --git a/src/tests/gui/test_gui2.cpp b/src/tests/gui/test_gui2.cpp index e8e3b969c672..1f9567f01c86 100644 --- a/src/tests/gui/test_gui2.cpp +++ b/src/tests/gui/test_gui2.cpp @@ -88,7 +88,7 @@ #include "video.hpp" #include "wml_exception.hpp" -#include +#include "utils/functional.hpp" #include diff --git a/src/tests/test_config_cache.cpp b/src/tests/test_config_cache.cpp index 8dd20edf8682..3d8dfa420bb7 100644 --- a/src/tests/test_config_cache.cpp +++ b/src/tests/test_config_cache.cpp @@ -25,7 +25,7 @@ #include "tests/utils/game_config_manager.hpp" -#include +#include "utils/functional.hpp" static preproc_map setup_test_preproc_map() diff --git a/src/tests/test_map_location.cpp b/src/tests/test_map_location.cpp index 3b34d53ec160..662d026a9923 100644 --- a/src/tests/test_map_location.cpp +++ b/src/tests/test_map_location.cpp @@ -15,7 +15,7 @@ #define GETTEXT_DOMAIN "wesnoth-test" #include -#include +#include "utils/functional.hpp" #include #include "map/location.hpp" diff --git a/src/tests/test_sdl_utils.cpp b/src/tests/test_sdl_utils.cpp index b07c00c393e6..49082adc4fe3 100644 --- a/src/tests/test_sdl_utils.cpp +++ b/src/tests/test_sdl_utils.cpp @@ -18,7 +18,7 @@ // //#include "image.hpp" // -//#include +//#include "utils/functional.hpp" //#include // //#include @@ -101,6 +101,6 @@ // // const surface base = image::get_image(root + "/base.png"); // -// blend_image(base, boost::bind(&test_blend, _1, _2, _3)); +// blend_image(base, std::bind(&test_blend, _1, _2, _3)); //} diff --git a/src/tests/test_sdl_utils.hpp b/src/tests/test_sdl_utils.hpp index 61a1dc9654ed..96564b225739 100644 --- a/src/tests/test_sdl_utils.hpp +++ b/src/tests/test_sdl_utils.hpp @@ -17,9 +17,9 @@ #include "sdl/utils.hpp" -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" -typedef boost::function< +typedef std::function< void(const surface&, const double, const Uint32)> tblend_functor; diff --git a/src/tests/test_unit_map.cpp b/src/tests/test_unit_map.cpp index a134a7eb7db1..2b82cec00f7f 100644 --- a/src/tests/test_unit_map.cpp +++ b/src/tests/test_unit_map.cpp @@ -23,7 +23,7 @@ #include "units/map.hpp" #include "units/id.hpp" -#include +#include "utils/functional.hpp" /* diff --git a/src/tod_manager.cpp b/src/tod_manager.cpp index 629144592d1e..43ec613f7bd9 100644 --- a/src/tod_manager.cpp +++ b/src/tod_manager.cpp @@ -33,7 +33,7 @@ #include #include #include -#include +#include "utils/functional.hpp" static lg::log_domain log_engine("engine"); #define LOG_NG LOG_STREAM(info, log_engine) @@ -93,7 +93,7 @@ void tod_manager::resolve_random(random_new::rng& r) //comma-separated string of integers >= 1 referring to the times_ array indices std::vector output; boost::copy( utils::split(random_tod_.str()) - | boost::adaptors::transformed(boost::bind(lexical_cast_default, _1 , 0)) + | boost::adaptors::transformed(std::bind(lexical_cast_default, _1 , 0)) | boost::adaptors::filtered(greater(0)) , std::back_inserter(output) ); diff --git a/src/units/unit.cpp b/src/units/unit.cpp index 9723efa0fe3a..3b82992e4c88 100644 --- a/src/units/unit.cpp +++ b/src/units/unit.cpp @@ -48,7 +48,7 @@ #include "units/map.hpp" // for unit_map, etc #include "variable.hpp" // for vconfig, etc -#include +#include "utils/functional.hpp" #include // for intrusive_ptr #include #include diff --git a/src/utils/boost_function_guarded.hpp b/src/utils/boost_function_guarded.hpp deleted file mode 100644 index b45fe3860964..000000000000 --- a/src/utils/boost_function_guarded.hpp +++ /dev/null @@ -1,5 +0,0 @@ -#ifndef INCL_BOOST_FUNCTION_GUARDED_HPP_ -#define INCL_BOOST_FUNCTION_GUARDED_HPP_ -#include -#endif - diff --git a/src/utils/functional.hpp b/src/utils/functional.hpp new file mode 100644 index 000000000000..90f5bcf4271e --- /dev/null +++ b/src/utils/functional.hpp @@ -0,0 +1,25 @@ +/* + Copyright (C) by the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. + */ + +/* + * Wrapper header to allow use of placeholder variables without a namespace. + */ + +#ifndef INCL_FUNCTIONAL_HPP_ +#define INCL_FUNCTIONAL_HPP_ + +#include + +using namespace std::placeholders; + +#endif diff --git a/src/wesmage/filter.cpp b/src/wesmage/filter.cpp index d4b2f1ea535c..c666f524d8e6 100644 --- a/src/wesmage/filter.cpp +++ b/src/wesmage/filter.cpp @@ -17,8 +17,7 @@ #include "serialization/string_utils.hpp" #include "wesmage/exit.hpp" -#include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include @@ -34,7 +33,7 @@ struct tfilter * supplied on the command line. So it should * be validated. */ - typedef boost::function @@ -101,7 +100,7 @@ struct tregister_filter #define REGISTER(name, description) \ tregister_filter register_filter_##name(std::make_pair( \ #name \ - , tfilter(#name, #name description, boost::bind(name, _1, _2)))); + , tfilter(#name, #name description, std::bind(name, _1, _2)))); static void scale(surface& surf, const std::string& parameters) diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 89ff71f32f24..a36f490d4088 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -73,7 +73,7 @@ #endif // _MSC_VER #include // for SDL_Init, SDL_INIT_TIMER -#include +#include "utils/functional.hpp" #include // for input, output #include // for copy #include // for bzip2_compressor, etc @@ -660,7 +660,7 @@ static int do_gameloop(const std::vector& args) gui2::tloadscreen::progress("refresh addons"); refresh_addon_version_info_cache(); }); - + if(res == false) { return 1; } @@ -672,15 +672,15 @@ static int do_gameloop(const std::vector& args) plugins_manager plugins_man(new application_lua_kernel(&game->video())); plugins_context::Reg const callbacks[] = { - { "play_multiplayer", boost::bind(&game_launcher::play_multiplayer, game.get())}, + { "play_multiplayer", std::bind(&game_launcher::play_multiplayer, game.get())}, }; plugins_context::aReg const accessors[] = { - { "command_line", boost::bind(&commandline_options::to_config, &cmdline_opts)}, + { "command_line", std::bind(&commandline_options::to_config, &cmdline_opts)}, }; plugins_context plugins("titlescreen", callbacks, accessors); - plugins.set_callback("exit", boost::bind(&safe_exit, boost::bind(get_int, _1, "code", 0)), false); + plugins.set_callback("exit", std::bind(&safe_exit, std::bind(get_int, std::placeholders::_1, "code", 0)), false); for (;;) { diff --git a/src/whiteboard/highlighter.cpp b/src/whiteboard/highlighter.cpp index b6df9014a05d..6b75a364953f 100644 --- a/src/whiteboard/highlighter.cpp +++ b/src/whiteboard/highlighter.cpp @@ -20,7 +20,7 @@ #include #include -#include +#include "utils/functional.hpp" #include "highlighter.hpp" diff --git a/src/whiteboard/manager.cpp b/src/whiteboard/manager.cpp index 49c7dc267d7d..7d312aaf7181 100644 --- a/src/whiteboard/manager.cpp +++ b/src/whiteboard/manager.cpp @@ -51,7 +51,7 @@ #include "units/udisplay.hpp" #include -#include +#include "utils/functional.hpp" #include @@ -515,7 +515,7 @@ void manager::pre_draw() { if (can_modify_game_state() && has_actions()) { move_owners_finder move_finder; - for_each_action(boost::ref(move_finder)); + for_each_action(std::ref(move_finder)); units_owning_moves_ = move_finder.get_units_owning_moves(); for (size_t unit_id : units_owning_moves_) { @@ -549,7 +549,7 @@ void manager::draw_hex(const map_location& hex) if (!wait_for_side_init_ && has_actions()) { //call draw() for all actions - for_each_action(boost::bind(&action::draw_hex, _1, hex)); + for_each_action(std::bind(&action::draw_hex, std::placeholders::_1, hex)); //Info about the action numbers to be displayed on screen. side_actions::numbers_t numbers; diff --git a/src/whiteboard/side_actions.cpp b/src/whiteboard/side_actions.cpp index dc34b09d9f00..4aaa1f540fb5 100644 --- a/src/whiteboard/side_actions.cpp +++ b/src/whiteboard/side_actions.cpp @@ -667,13 +667,13 @@ side_actions::iterator side_actions::safe_erase(iterator const& itor) } side_actions::iterator side_actions::queue_move(size_t turn, unit& mover, const pathfind::marked_route& route, arrow_ptr arrow, fake_unit_ptr fake_unit) { - move_ptr new_move(boost::make_shared(team_index(), hidden_, boost::ref(mover), route, arrow, fake_unit)); + move_ptr new_move(boost::make_shared(team_index(), hidden_, std::ref(mover), route, arrow, fake_unit)); return queue_action(turn, new_move); } side_actions::iterator side_actions::queue_attack(size_t turn, unit& mover, const map_location& target_hex, int weapon_choice, const pathfind::marked_route& route, arrow_ptr arrow, fake_unit_ptr fake_unit) { - attack_ptr new_attack(boost::make_shared(team_index(), hidden_, boost::ref(mover), target_hex, weapon_choice, route, arrow, fake_unit)); + attack_ptr new_attack(boost::make_shared(team_index(), hidden_, std::ref(mover), target_hex, weapon_choice, route, arrow, fake_unit)); return queue_action(turn, new_attack); } @@ -691,7 +691,7 @@ side_actions::iterator side_actions::queue_recall(size_t turn, const unit& unit, side_actions::iterator side_actions::queue_suppose_dead(size_t turn, unit& curr_unit, map_location const& loc) { - suppose_dead_ptr new_suppose_dead(boost::make_shared(team_index(), hidden_, boost::ref(curr_unit), loc)); + suppose_dead_ptr new_suppose_dead(boost::make_shared(team_index(), hidden_, std::ref(curr_unit), loc)); return queue_action(turn, new_suppose_dead); } diff --git a/src/whiteboard/utility.cpp b/src/whiteboard/utility.cpp index d909c820059c..30517e88d67a 100644 --- a/src/whiteboard/utility.cpp +++ b/src/whiteboard/utility.cpp @@ -165,7 +165,7 @@ bool team_has_visible_plan(team &t) return !t.get_side_actions()->hidden(); } -void for_each_action(boost::function function, team_filter team_filter) +void for_each_action(std::function function, team_filter team_filter) { bool end = false; for(size_t turn=0; !end; ++turn) { diff --git a/src/whiteboard/utility.hpp b/src/whiteboard/utility.hpp index 37c401aba403..5c14eb39f180 100644 --- a/src/whiteboard/utility.hpp +++ b/src/whiteboard/utility.hpp @@ -22,7 +22,7 @@ #include #include -#include "utils/boost_function_guarded.hpp" +#include "utils/functional.hpp" #include "typedefs.hpp" @@ -112,7 +112,7 @@ bool has_actions(); * * The argument is the team to consider. */ -typedef boost::function team_filter; +typedef std::function team_filter; /** Returns whether a given team's plan is visible. */ bool team_has_visible_plan(team&); @@ -126,7 +126,7 @@ bool team_has_visible_plan(team&); * @param function the function to execute. * @param team_filter select whether a team is visited (default to @ref team_has_visible_plan). */ -void for_each_action(boost::function function, +void for_each_action(std::function function, team_filter team_filter = team_has_visible_plan); /** diff --git a/src/widgets/drop_target.cpp b/src/widgets/drop_target.cpp index bfc90f0a138b..6846b18b78e9 100644 --- a/src/widgets/drop_target.cpp +++ b/src/widgets/drop_target.cpp @@ -16,7 +16,7 @@ #include "widgets/drop_target.hpp" -#include +#include "utils/functional.hpp" namespace gui { @@ -44,7 +44,7 @@ namespace gui { { return std::find_if(groups_.lower_bound(group_->get_group_id()), groups_.upper_bound(group_->get_group_id()), - boost::bind(&drop_target::is_this_id,boost::bind(&drop_groups::value_type::second,_1),id_)); + std::bind(&drop_target::is_this_id,std::bind(&drop_groups::value_type::second,_1),id_)); } drop_target::~drop_target() @@ -63,9 +63,9 @@ namespace gui { drop_target::drop_groups::iterator itor = std::find_if(groups_.lower_bound(group_->get_group_id()), end, - boost::bind(&drop_target::hit_rect, - boost::bind(&drop_groups::value_type::second,_1) - ,boost::cref(loc_), id_)); + std::bind(&drop_target::hit_rect, + std::bind(&drop_groups::value_type::second,_1), + std::cref(loc_), id_)); if (itor == end) return -1; diff --git a/src/xBRZ/xbrz.cpp b/src/xBRZ/xbrz.cpp index bddfffca1b54..c37472b3a087 100644 --- a/src/xBRZ/xbrz.cpp +++ b/src/xBRZ/xbrz.cpp @@ -41,8 +41,7 @@ #include #include -#include -#include +#include "utils/functional.hpp" #if defined(__GNUC__) && !defined(__clang__) && !defined(__WIN32__) // We only want this for gcc, not clang or tdm-gcc #if __GNUC__ < 4 || (__GNUC__ == 4 && __GNUC_MINOR__ <= 8 ) From 37f29408d53fff23dd56d586977cb9cc7ded1cbb Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 02:23:18 +1100 Subject: [PATCH 152/240] GUI2 tests: remove small resolution test sizes --- src/tests/gui/test_gui2.cpp | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/tests/gui/test_gui2.cpp b/src/tests/gui/test_gui2.cpp index 1f9567f01c86..e187f53ebc41 100644 --- a/src/tests/gui/test_gui2.cpp +++ b/src/tests/gui/test_gui2.cpp @@ -289,15 +289,6 @@ namespace { #pragma warning(pop) #endif -const tresolution_list& get_small_gui_resolutions() -{ - static tresolution_list result; - if(result.empty()) { - result.push_back(std::make_pair(800, 480)); - } - return result; -} - const tresolution_list& get_gui_resolutions() { static tresolution_list result; @@ -317,7 +308,6 @@ void test() for(size_t i = 0; i < 2; ++i) { - test_resolutions(get_small_gui_resolutions()); test_resolutions(get_gui_resolutions()); break; // FIXME: New widgets break @@ -332,7 +322,6 @@ void test_popup() for(size_t i = 0; i < 2; ++i) { - test_popup_resolutions(get_small_gui_resolutions()); test_popup_resolutions(get_gui_resolutions()); gui2::new_widgets = true; @@ -345,7 +334,6 @@ void test_tip(const std::string& id) for(size_t i = 0; i < 2; ++i) { - test_tip_resolutions(get_small_gui_resolutions(), id); test_tip_resolutions(get_gui_resolutions(), id); gui2::new_widgets = true; From aa449ee3045ba67dfe614965a48b36abf49b2b32 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 02:23:45 +1100 Subject: [PATCH 153/240] Removed two unnecessary boost includes --- src/tod_manager.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/tod_manager.cpp b/src/tod_manager.cpp index 43ec613f7bd9..73713a880d84 100644 --- a/src/tod_manager.cpp +++ b/src/tod_manager.cpp @@ -31,8 +31,6 @@ #include #include -#include -#include #include "utils/functional.hpp" static lg::log_domain log_engine("engine"); From 182732a04ce77a96ee1d2f81e6dde9b7de926a41 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 02:28:09 +1100 Subject: [PATCH 154/240] Attempt to fix travis --- src/actions/create.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/actions/create.cpp b/src/actions/create.cpp index 2a491746031d..e4fba1233e95 100644 --- a/src/actions/create.cpp +++ b/src/actions/create.cpp @@ -51,6 +51,8 @@ #include "variable.hpp" #include "whiteboard/manager.hpp" +#include "utils/functional.hpp" + #include static lg::log_domain log_engine("engine"); From e97b4f60e341ede7632269d9707e81be07860bd3 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 02:37:46 +1100 Subject: [PATCH 155/240] tloadscreen: use blank spaces for animation size label This reserved space for the label while removing the slight glimpse of the full string when the loadscreen first shows. --- data/gui/window/loadscreen.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index 3722ac7741c4..0da663c1151b 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -128,7 +128,7 @@ text_alignment = "center" definition = "default_large" id = "test_animation" - label = "...................." + label = " " [/label] [/column] From 1492a237a1981ddfd94caaf9bbd91274199a034d Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 02:40:28 +1100 Subject: [PATCH 156/240] Revert "Attempt to fix travis" This reverts commit 182732a04ce77a96ee1d2f81e6dde9b7de926a41. --- src/actions/create.cpp | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/actions/create.cpp b/src/actions/create.cpp index e4fba1233e95..2a491746031d 100644 --- a/src/actions/create.cpp +++ b/src/actions/create.cpp @@ -51,8 +51,6 @@ #include "variable.hpp" #include "whiteboard/manager.hpp" -#include "utils/functional.hpp" - #include static lg::log_domain log_engine("engine"); From f96b4ad11fc0b7c0f38fa47bf51ec0e67e100b53 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Mon, 4 Apr 2016 00:10:01 +0200 Subject: [PATCH 157/240] mix msvc build msvc doesn't accept NULL/0 in the std::function constructor --- src/gui/dialogs/multiplayer/mp_login.cpp | 2 +- src/gui/widgets/multi_page.cpp | 6 +++--- src/gui/widgets/stacked_widget.cpp | 2 +- src/gui/widgets/toggle_panel.cpp | 2 +- src/intro.cpp | 2 +- 5 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/gui/dialogs/multiplayer/mp_login.cpp b/src/gui/dialogs/multiplayer/mp_login.cpp index 60ed80c92fa4..07706cebd388 100644 --- a/src/gui/dialogs/multiplayer/mp_login.cpp +++ b/src/gui/dialogs/multiplayer/mp_login.cpp @@ -74,7 +74,7 @@ tmp_login::tmp_login(const std::string& label, const bool focus_password) register_text("password", true, &preferences::password, - NULL /* The password box returns '*' as value. */ + nullptr /* The password box returns '*' as value. */ , focus_password); diff --git a/src/gui/widgets/multi_page.cpp b/src/gui/widgets/multi_page.cpp index 336ba6fded4b..3f8a5b1adf73 100644 --- a/src/gui/widgets/multi_page.cpp +++ b/src/gui/widgets/multi_page.cpp @@ -42,14 +42,14 @@ tmulti_page::tmulti_page() void tmulti_page::add_page(const string_map& item) { assert(generator_); - generator_->create_item(-1, page_builder_, item, NULL); + generator_->create_item(-1, page_builder_, item, nullptr); } void tmulti_page::add_page( const std::map& data) { assert(generator_); - generator_->create_item(-1, page_builder_, data, NULL); + generator_->create_item(-1, page_builder_, data, nullptr); } void tmulti_page::remove_page(const unsigned page, unsigned count) @@ -154,7 +154,7 @@ void swap_grid(tgrid* grid, void tmulti_page::finalize(const std::vector& page_data) { assert(generator_); - generator_->create_items(-1, page_builder_, page_data, NULL); + generator_->create_items(-1, page_builder_, page_data, nullptr); swap_grid(nullptr, &grid(), generator_, "_content_grid"); } diff --git a/src/gui/widgets/stacked_widget.cpp b/src/gui/widgets/stacked_widget.cpp index 227c20aa7ebf..4b4aa56de8a6 100644 --- a/src/gui/widgets/stacked_widget.cpp +++ b/src/gui/widgets/stacked_widget.cpp @@ -100,7 +100,7 @@ tstacked_widget::finalize(std::vector widget_builder) string_map empty_data; for(const auto & builder : widget_builder) { - generator_->create_item(-1, builder, empty_data, NULL); + generator_->create_item(-1, builder, empty_data, nullptr); } swap_grid(nullptr, &grid(), generator_, "_content_grid"); diff --git a/src/gui/widgets/toggle_panel.cpp b/src/gui/widgets/toggle_panel.cpp index f81f65494c64..c401e0456ce1 100644 --- a/src/gui/widgets/toggle_panel.cpp +++ b/src/gui/widgets/toggle_panel.cpp @@ -42,7 +42,7 @@ ttoggle_panel::ttoggle_panel() , state_(ENABLED) , state_num_(0) , retval_(0) - , callback_state_change_(0) + , callback_state_change_(nullptr) , callback_mouse_left_double_click_() { set_wants_mouse_left_double_click(); diff --git a/src/intro.cpp b/src/intro.cpp index 6dfd6ee53a0e..6d623c53e41e 100644 --- a/src/intro.cpp +++ b/src/intro.cpp @@ -53,7 +53,7 @@ void the_end(CVideo &video, std::string text, unsigned int duration) if(n) sdl::fill_rect(video.getSurface(),&area,0); - const SDL_Color col = create_color(n, n, n, n); + const SDL_Color col = create_color(uint8_t(n), uint8_t(n), uint8_t(n), uint8_t(n)); font::draw_text(&video,area,font_size,col,text,area.x,area.y); update_rect(area); From 5d28a2caa565d16a3d6d9621247b6ca00900937b Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 13:10:11 +1100 Subject: [PATCH 158/240] Updated min_allowed_height to 600 --- src/preferences.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/preferences.cpp b/src/preferences.cpp index b64a4d67c7c9..51e6f3b99b98 100644 --- a/src/preferences.cpp +++ b/src/preferences.cpp @@ -353,7 +353,7 @@ int min_allowed_width() int min_allowed_height() { - return 480; + return 600; } std::pair resolution() From 0a7190c605677ccf6a79c7f1f0f8d861f04a3dd9 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 4 Apr 2016 13:11:05 +1100 Subject: [PATCH 159/240] Updated cb projfile --- projectfiles/CodeBlocks/wesnoth.cbp | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index e6811e2c4185..804b86401c12 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -910,6 +910,8 @@ + + @@ -1062,8 +1064,8 @@ - + From 38010fd991388895bcddf4830999370c34abef01 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sat, 2 Apr 2016 17:35:52 -0400 Subject: [PATCH 160/240] Revert "remove unused queued_event parameter from WML_HANDLER_FUNCTION" This reverts commit 310ba26704873a89268d7dfef10f384a12ab2559. --- src/game_events/action_wml.cpp | 58 +++++++++++++++---------------- src/game_events/action_wml.hpp | 2 +- src/scripting/game_lua_kernel.cpp | 2 +- 3 files changed, 31 insertions(+), 31 deletions(-) diff --git a/src/game_events/action_wml.cpp b/src/game_events/action_wml.cpp index c520724e262b..2693b072cf36 100644 --- a/src/game_events/action_wml.cpp +++ b/src/game_events/action_wml.cpp @@ -310,21 +310,21 @@ wml_action::wml_action(const std::string & tag, handler function) * } * \endcode */ -#define WML_HANDLER_FUNCTION(pname, pcfg) \ - static void wml_func_##pname(const vconfig &pcfg); \ +#define WML_HANDLER_FUNCTION(pname, pei, pcfg) \ + static void wml_func_##pname(const queued_event &pei, const vconfig &pcfg); \ static wml_action wml_action_##pname(#pname, &wml_func_##pname); \ - static void wml_func_##pname(const vconfig& pcfg) + static void wml_func_##pname(const queued_event& pei, const vconfig& pcfg) /// Experimental data persistence /// @todo Finish experimenting. -WML_HANDLER_FUNCTION(clear_global_variable,pcfg) +WML_HANDLER_FUNCTION(clear_global_variable,,pcfg) { if (!resources::controller->is_replay()) verify_and_clear_global_variable(pcfg); } -WML_HANDLER_FUNCTION(deprecated_message, cfg) +WML_HANDLER_FUNCTION(deprecated_message,, cfg) { handle_deprecated_message( cfg.get_parsed_config() ); } @@ -337,7 +337,7 @@ static void on_replay_error(const std::string& message, bool /*b*/) // This tag exposes part of the code path used to handle [command]'s in replays // This allows to perform scripting in WML that will use the same code path as player actions, for example. -WML_HANDLER_FUNCTION(do_command, cfg) +WML_HANDLER_FUNCTION(do_command,, cfg) { // Doing this in a whiteboard applied context will cause bugs // Note that even though game_events::pump() will always apply the real unit map @@ -380,17 +380,17 @@ WML_HANDLER_FUNCTION(do_command, cfg) /// Experimental data persistence /// @todo Finish experimenting. -WML_HANDLER_FUNCTION(get_global_variable, pcfg) +WML_HANDLER_FUNCTION(get_global_variable,,pcfg) { verify_and_get_global_variable(pcfg); } -WML_HANDLER_FUNCTION(lift_fog, cfg) +WML_HANDLER_FUNCTION(lift_fog,, cfg) { toggle_fog(true, cfg, !cfg["multiturn"].to_bool(false)); } -WML_HANDLER_FUNCTION(modify_turns, cfg) +WML_HANDLER_FUNCTION(modify_turns,, cfg) { config::attribute_value value = cfg["value"]; std::string add = cfg["add"]; @@ -417,7 +417,7 @@ WML_HANDLER_FUNCTION(modify_turns, cfg) /// Moving a 'unit' - i.e. a dummy unit /// that is just moving for the visual effect -WML_HANDLER_FUNCTION(move_unit_fake, cfg) +WML_HANDLER_FUNCTION(move_unit_fake,, cfg) { fake_unit_ptr dummy_unit(create_fake_unit(cfg)); if(!dummy_unit.get()) @@ -438,7 +438,7 @@ WML_HANDLER_FUNCTION(move_unit_fake, cfg) } } -WML_HANDLER_FUNCTION(move_units_fake, cfg) +WML_HANDLER_FUNCTION(move_units_fake,, cfg) { LOG_NG << "Processing [move_units_fake]\n"; @@ -491,7 +491,7 @@ WML_HANDLER_FUNCTION(move_units_fake, cfg) } /// If we should recall units that match a certain description. -WML_HANDLER_FUNCTION(recall, cfg) +WML_HANDLER_FUNCTION(recall,, cfg) { LOG_NG << "recalling unit...\n"; config temp_config(cfg.get_config()); @@ -573,7 +573,7 @@ WML_HANDLER_FUNCTION(recall, cfg) LOG_WML << "A [recall] tag with the following content failed:\n" << cfg.get_config().debug(); } -WML_HANDLER_FUNCTION(remove_sound_source, cfg) +WML_HANDLER_FUNCTION(remove_sound_source,, cfg) { resources::soundsources->remove(cfg["id"]); } @@ -618,7 +618,7 @@ namespace { } /// Experimental map replace /// @todo Finish experimenting. -WML_HANDLER_FUNCTION(replace_map, cfg) +WML_HANDLER_FUNCTION(replace_map,, cfg) { /* * When a hex changes from a village terrain to a non-village terrain, and @@ -676,20 +676,20 @@ WML_HANDLER_FUNCTION(replace_map, cfg) ai::manager::raise_map_changed(); } -WML_HANDLER_FUNCTION(reset_fog, cfg) +WML_HANDLER_FUNCTION(reset_fog,, cfg) { toggle_fog(false, cfg, cfg["reset_view"].to_bool(false)); } /// Experimental data persistence /// @todo Finish experimenting. -WML_HANDLER_FUNCTION(set_global_variable, pcfg) +WML_HANDLER_FUNCTION(set_global_variable,,pcfg) { if (!resources::controller->is_replay()) verify_and_set_global_variable(pcfg); } -WML_HANDLER_FUNCTION(set_variable, cfg) +WML_HANDLER_FUNCTION(set_variable,, cfg) { game_data *gameinfo = resources::gamedata; const std::string name = cfg["name"]; @@ -927,7 +927,7 @@ WML_HANDLER_FUNCTION(set_variable, cfg) } } -WML_HANDLER_FUNCTION(set_variables, cfg) +WML_HANDLER_FUNCTION(set_variables,, cfg) { const t_string& name = cfg["name"]; variable_access_create dest = resources::gamedata->get_variable_access_write(name); @@ -1029,7 +1029,7 @@ WML_HANDLER_FUNCTION(set_variables, cfg) } } -WML_HANDLER_FUNCTION(sound_source, cfg) +WML_HANDLER_FUNCTION(sound_source,, cfg) { config parsed = cfg.get_parsed_config(); try { @@ -1045,7 +1045,7 @@ WML_HANDLER_FUNCTION(sound_source, cfg) /// Store the relative direction from one hex to another in a WML variable. /// This is mainly useful as a diagnostic tool, but could be useful /// for some kind of scenario. -WML_HANDLER_FUNCTION(store_relative_direction, cfg) +WML_HANDLER_FUNCTION(store_relative_direction,, cfg) { if (!cfg.child("source")) { WRN_NG << "No source in [store_relative_direction]" << std::endl; @@ -1081,7 +1081,7 @@ WML_HANDLER_FUNCTION(store_relative_direction, cfg) /// In increments of 60 degrees, clockwise. /// This is mainly useful as a diagnostic tool, but could be useful /// for some kind of scenario. -WML_HANDLER_FUNCTION(store_rotate_map_location, cfg) +WML_HANDLER_FUNCTION(store_rotate_map_location,, cfg) { if (!cfg.child("source")) { WRN_NG << "No source in [store_rotate_map_location]" << std::endl; @@ -1118,7 +1118,7 @@ WML_HANDLER_FUNCTION(store_rotate_map_location, cfg) /// Store time of day config in a WML variable. This is useful for those who /// are too lazy to calculate the corresponding time of day for a given turn, /// or if the turn / time-of-day sequence mutates in a scenario. -WML_HANDLER_FUNCTION(store_time_of_day, cfg) +WML_HANDLER_FUNCTION(store_time_of_day,, cfg) { const map_location loc = cfg_to_loc(cfg); int turn = cfg["turn"]; @@ -1141,7 +1141,7 @@ WML_HANDLER_FUNCTION(store_time_of_day, cfg) } /// Creating a mask of the terrain -WML_HANDLER_FUNCTION(terrain_mask, cfg) +WML_HANDLER_FUNCTION(terrain_mask,, cfg) { map_location loc = cfg_to_loc(cfg, 1, 1); @@ -1172,7 +1172,7 @@ WML_HANDLER_FUNCTION(terrain_mask, cfg) resources::screen->needs_rebuild(true); } -WML_HANDLER_FUNCTION(tunnel, cfg) +WML_HANDLER_FUNCTION(tunnel,, cfg) { const bool remove = cfg["remove"].to_bool(false); if (remove) { @@ -1197,7 +1197,7 @@ WML_HANDLER_FUNCTION(tunnel, cfg) } /// If we should spawn a new unit on the map somewhere -WML_HANDLER_FUNCTION(unit, cfg) +WML_HANDLER_FUNCTION(unit,, cfg) { config parsed_cfg = cfg.get_parsed_config(); @@ -1246,7 +1246,7 @@ WML_HANDLER_FUNCTION(unit, cfg) } -WML_HANDLER_FUNCTION(volume, cfg) +WML_HANDLER_FUNCTION(volume,, cfg) { int vol; @@ -1274,12 +1274,12 @@ WML_HANDLER_FUNCTION(volume, cfg) } -WML_HANDLER_FUNCTION(wml_message, cfg) +WML_HANDLER_FUNCTION(wml_message,, cfg) { handle_wml_log_message( cfg.get_parsed_config() ); } -WML_HANDLER_FUNCTION(on_undo, cfg) +WML_HANDLER_FUNCTION(on_undo,, cfg) { if(cfg["delayed_variable_substitution"].to_bool(false)) { synced_context::add_undo_commands(cfg.get_config()); @@ -1288,7 +1288,7 @@ WML_HANDLER_FUNCTION(on_undo, cfg) } } -WML_HANDLER_FUNCTION(on_redo, cfg) +WML_HANDLER_FUNCTION(on_redo,, cfg) { if(cfg["delayed_variable_substitution"].to_bool(false)) { synced_context::add_redo_commands(cfg.get_config()); diff --git a/src/game_events/action_wml.hpp b/src/game_events/action_wml.hpp index 2389fd21b7fb..09834a8e1c27 100644 --- a/src/game_events/action_wml.hpp +++ b/src/game_events/action_wml.hpp @@ -48,7 +48,7 @@ namespace game_events class wml_action { public: - typedef void (*handler)(const vconfig &); + typedef void (*handler)(const queued_event &, const vconfig &); typedef std::map map; /// Using this constructor for a static object outside action_wml.cpp diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 0efc286cd5ae..df050632e97d 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -4865,7 +4865,7 @@ int game_lua_kernel::cfun_wml_action(lua_State *L) (lua_touserdata(L, lua_upvalueindex(1))); vconfig vcfg = luaW_checkvconfig(L, 1); - h(vcfg); + h(get_event_info(), vcfg); return 0; } From ff3e1bf83a3253f99c97de1bdd831b0f9e2a32b4 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sun, 3 Apr 2016 19:44:12 -0400 Subject: [PATCH 161/240] Variadic config methods to combine remove_attribute or clear_children calls --- src/ai/default/recruitment.cpp | 3 +-- src/carryover.cpp | 6 +----- src/config.hpp | 16 +++++++++++++++- src/game_initialization/connect_engine.cpp | 6 +----- src/gui/dialogs/gamestate_inspector.cpp | 3 +-- 5 files changed, 19 insertions(+), 15 deletions(-) diff --git a/src/ai/default/recruitment.cpp b/src/ai/default/recruitment.cpp index 3ecd8819fedd..ca9d54257e04 100644 --- a/src/ai/default/recruitment.cpp +++ b/src/ai/default/recruitment.cpp @@ -1786,12 +1786,11 @@ recruitment_aspect::recruitment_aspect(readonly_context &context, const config & parsed_cfg["pattern"] = true; parsed_cfg.add_child("recruit", pattern); } - parsed_cfg.clear_children("pattern"); for (config total : parsed_cfg.child_range("total")) { parsed_cfg["total"] = true; parsed_cfg.add_child("recruit", total); } - parsed_cfg.clear_children("total"); + parsed_cfg.clear_children("pattern", "total"); // Then, if there's no [recruit], add one. if (!parsed_cfg.has_child("recruit")) { parsed_cfg.add_child("recruit", config_of("importance", 0)); diff --git a/src/carryover.cpp b/src/carryover.cpp index 1b3d2f2b20cb..fa4ad1c683d7 100644 --- a/src/carryover.cpp +++ b/src/carryover.cpp @@ -34,11 +34,7 @@ carryover::carryover(const config& side) for(const config& u : side.child_range("unit")) { recall_list_.push_back(u); config& u_back = recall_list_.back(); - u_back.remove_attribute("side"); - u_back.remove_attribute("goto_x"); - u_back.remove_attribute("goto_y"); - u_back.remove_attribute("x"); - u_back.remove_attribute("y"); + u_back.remove_attributes("side", "goto_x", "goto_y", "x", "y"); } } diff --git a/src/config.hpp b/src/config.hpp index 701f6b45fb1b..9fc315c9b3f4 100644 --- a/src/config.hpp +++ b/src/config.hpp @@ -450,7 +450,9 @@ class config template config &child(const char(&key)[N], int n = 0) { return child_impl(key, N - 1, n); } +private: config &child_impl(const char* key, int len, int n = 0); +public: #endif /** * Returns the nth child with the given @a key, or @@ -564,6 +566,12 @@ class config void remove_attribute(const std::string &key); void merge_attributes(const config &); + template + void remove_attributes(T... keys) { + for(const std::string& key : {keys...}) { + remove_attribute(key); + } + } const_attr_itors attribute_range() const; @@ -579,6 +587,12 @@ class config { return const_cast(this)->find_child(key, name, value); } void clear_children(const std::string& key); + template + void clear_children(T... keys) { + for(std::string key : {keys...}) { + clear_children(key); + } + } /** * Moves all the children with tag @a key from @a src to this. @@ -660,7 +674,7 @@ class config * A function to get the differences between this object, * and 'c', as another config object. * I.e. calling cfg2.apply_diff(cfg1.get_diff(cfg2)) - * will make cfg1 identical to cfg2. + * will make cfg2 identical to cfg1. */ config get_diff(const config& c) const; void get_diff(const config& c, config& res) const; diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index cd2819c587b5..0211aca50b89 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -988,11 +988,7 @@ config side_engine::new_config() const // Merge the faction data to res. config faction = flg_.current_faction(); res["faction_name"] = faction["name"]; - faction.remove_attribute("id"); - faction.remove_attribute("name"); - faction.remove_attribute("image"); - faction.remove_attribute("gender"); - faction.remove_attribute("type"); + faction.remove_attributes("id", "name", "image", "gender", "type"); res.append(faction); } diff --git a/src/gui/dialogs/gamestate_inspector.cpp b/src/gui/dialogs/gamestate_inspector.cpp index 6eeb828fd2fc..45dc36a7b814 100644 --- a/src/gui/dialogs/gamestate_inspector.cpp +++ b/src/gui/dialogs/gamestate_inspector.cpp @@ -563,8 +563,7 @@ class team_mode_controller : public single_mode_controller config c = resources::teams ? resources::teams->at(side_ - 1).to_config() : config(); - c.clear_children("ai"); - c.clear_children("village"); + c.clear_children("ai", "village"); model_.set_inspect_window_text(config_to_string(c)); return; } From ca6ec3b900105fa4bd07b3ef6ba58d98da3979f4 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sun, 3 Apr 2016 19:50:50 -0400 Subject: [PATCH 162/240] NULL -> nullptr --- src/formula/callable_objects.cpp | 2 +- src/scripting/lua_formula_bridge.cpp | 2 +- src/scripting/lua_formula_bridge.hpp | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 83d9bbe3f574..248f22038ab1 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -528,7 +528,7 @@ void config_callable::get_inputs(std::vector* inputs) int config_callable::do_compare(const game_logic::formula_callable* callable) const { const config_callable* cfg_callable = dynamic_cast(callable); - if(cfg_callable == NULL) { + if(cfg_callable == nullptr) { return formula_callable::do_compare(callable); } diff --git a/src/scripting/lua_formula_bridge.cpp b/src/scripting/lua_formula_bridge.cpp index 477570399132..409cd9961210 100644 --- a/src/scripting/lua_formula_bridge.cpp +++ b/src/scripting/lua_formula_bridge.cpp @@ -77,7 +77,7 @@ class lua_callable : public formula_callable { } int do_compare(const formula_callable* other) const { const lua_callable* lua = dynamic_cast(other); - if(lua == NULL) { + if(lua == nullptr) { return formula_callable::do_compare(other); } if(mState == lua->mState) { // Which should always be the case, but let's be safe here diff --git a/src/scripting/lua_formula_bridge.hpp b/src/scripting/lua_formula_bridge.hpp index f64b7f434b38..7fb4774dd986 100644 --- a/src/scripting/lua_formula_bridge.hpp +++ b/src/scripting/lua_formula_bridge.hpp @@ -36,9 +36,9 @@ namespace lua_formula_bridge { class fwrapper { boost::shared_ptr formula_ptr; public: - fwrapper(const std::string& code, game_logic::function_symbol_table* functions = NULL); + fwrapper(const std::string& code, game_logic::function_symbol_table* functions = nullptr); std::string str() const; - variant evaluate(const game_logic::formula_callable& variables, game_logic::formula_debugger* fdb = NULL) const; + variant evaluate(const game_logic::formula_callable& variables, game_logic::formula_debugger* fdb = nullptr) const; }; } // end namespace lua_formula_bridge From 4f2367648e00df9eff554807a3c73d488dfc9289 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Sun, 3 Apr 2016 19:55:54 -0400 Subject: [PATCH 163/240] Update XCode project --- projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 3cb749247b6d..878044c3dfae 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -1555,6 +1555,7 @@ 912DCA6A1CA6F65A0019A6F9 /* manual.en.html */ = {isa = PBXFileReference; lastKnownFileType = text.html; name = manual.en.html; path = manual/manual.en.html; sourceTree = ""; }; 9130A45E1C73BB6100852782 /* select_orb_colors.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = select_orb_colors.cpp; sourceTree = ""; }; 9130A45F1C73BB6100852782 /* select_orb_colors.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = select_orb_colors.hpp; sourceTree = ""; }; + 918056BE1CB1E4C0001A7F35 /* functional.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = functional.hpp; sourceTree = ""; }; 9190B73A1CA0554900B0EF66 /* lua_pathfind_cost_calculator.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = lua_pathfind_cost_calculator.hpp; sourceTree = ""; }; 9190B73B1CA0564700B0EF66 /* register_widget.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = register_widget.hpp; sourceTree = ""; }; 919B37F71BAF789D00E0094C /* synced_user_choice.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = synced_user_choice.cpp; sourceTree = ""; }; @@ -1699,7 +1700,6 @@ 91E3562D1CACA6E600774252 /* visitor.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = visitor.cpp; sourceTree = ""; }; 91ECD5D01BA11A5200B25CF1 /* unit_creator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unit_creator.cpp; sourceTree = ""; }; 91ECD5D11BA11A5200B25CF1 /* unit_creator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unit_creator.hpp; sourceTree = ""; }; - 91EF6BFB1C9E22E400E2A733 /* boost_function_guarded.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = boost_function_guarded.hpp; sourceTree = ""; }; 91EF6BFC1C9E22E400E2A733 /* const_clone.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = const_clone.hpp; sourceTree = ""; }; 91EF6BFF1C9E22E400E2A733 /* iterator.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = iterator.hpp; sourceTree = ""; }; 91EF6C001C9E22E400E2A733 /* reference_counter.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = reference_counter.hpp; sourceTree = ""; }; @@ -1713,9 +1713,9 @@ 91F462871C7115C50050A9C9 /* combobox.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = combobox.hpp; sourceTree = ""; }; 91F462921C7117400050A9C9 /* drop_down_list.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = drop_down_list.cpp; sourceTree = ""; }; 91F462931C7117400050A9C9 /* drop_down_list.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = drop_down_list.hpp; sourceTree = ""; }; - 91FAC70B1C80168600DAB2C3 /* group.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = group.hpp; sourceTree = ""; }; 91FAC7081C7F931900DAB2C3 /* lua_formula_bridge.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = lua_formula_bridge.hpp; sourceTree = ""; }; 91FAC7091C7FBC2C00DAB2C3 /* lua_formula_bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lua_formula_bridge.cpp; sourceTree = ""; }; + 91FAC70B1C80168600DAB2C3 /* group.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = group.hpp; sourceTree = ""; }; B504B94A1284C06B00261FE9 /* tips.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tips.cpp; sourceTree = ""; }; B504B94B1284C06B00261FE9 /* tips.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tips.hpp; sourceTree = ""; }; B508D13E10013BF900B12852 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = lib/Growl.framework; sourceTree = ""; }; @@ -3566,8 +3566,8 @@ 91EF6BF01C9E217C00E2A733 /* utils */ = { isa = PBXGroup; children = ( - 91EF6BFB1C9E22E400E2A733 /* boost_function_guarded.hpp */, 91EF6BFC1C9E22E400E2A733 /* const_clone.hpp */, + 918056BE1CB1E4C0001A7F35 /* functional.hpp */, 911F471B1CAE5A7E00F47035 /* iterable_pair.hpp */, 91EF6BFF1C9E22E400E2A733 /* iterator.hpp */, EC53B04D1B23BB0E002F758F /* make_enum.cpp */, From 1bdce5b937325de25ac9a9fd94fc52a8e665b5ab Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 15:39:03 -0400 Subject: [PATCH 164/240] Fix build This fixes my build and should also fix the Travis builds. --- src/game_launcher.cpp | 11 +- src/gui/dialogs/campaign_selection.cpp | 1 + src/gui/dialogs/editor/custom_tod.cpp | 3 + src/gui/dialogs/game_cache_options.cpp | 1 + src/gui/dialogs/game_load.cpp | 6 +- src/gui/dialogs/game_load.hpp | 2 +- src/gui/dialogs/multiplayer/mp_connect.cpp | 1 + src/gui/dialogs/preferences_dialog.cpp | 10 +- src/gui/dialogs/screenshot_notification.cpp | 4 +- src/gui/dialogs/unit_create.cpp | 6 +- src/gui/dialogs/unit_create.hpp | 2 +- src/hotkey/command_executor.cpp | 6 +- src/preferences_display.cpp | 2 +- src/preferences_display.hpp | 2 +- src/tod_manager.cpp | 2 +- src/utils/functional.hpp | 106 +++++++++++++++++++- 16 files changed, 134 insertions(+), 31 deletions(-) diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 29e619e91957..8ea22ba01c6e 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -883,14 +883,11 @@ bool game_launcher::play_multiplayer() start_wesnothd(); } catch(game::mp_server_error&) { - std::string path = preferences::show_wesnothd_server_search(video()); - - if (!path.empty()) - { - preferences::set_mp_server_program_name(path); + preferences::show_wesnothd_server_search(video()); + + try { start_wesnothd(); - } - else + } catch(game::mp_server_error&) { return false; } diff --git a/src/gui/dialogs/campaign_selection.cpp b/src/gui/dialogs/campaign_selection.cpp index 4f4cd1904183..d21d67ca3882 100644 --- a/src/gui/dialogs/campaign_selection.cpp +++ b/src/gui/dialogs/campaign_selection.cpp @@ -37,6 +37,7 @@ #include "serialization/string_utils.hpp" #include "utils/functional.hpp" +#include "video.hpp" namespace gui2 { diff --git a/src/gui/dialogs/editor/custom_tod.cpp b/src/gui/dialogs/editor/custom_tod.cpp index b89bcf5dd22c..895b784a6229 100644 --- a/src/gui/dialogs/editor/custom_tod.cpp +++ b/src/gui/dialogs/editor/custom_tod.cpp @@ -320,9 +320,12 @@ void tcustom_tod::pre_show(twindow& window) delete_button, std::bind(&tcustom_tod::do_delete_tod, this, std::ref(window))); + // FIXME: This doesn't work (it does nothing at all) + /* tbutton& save_button = find_widget(&window, "save", false); connect_signal_mouse_left_click( save_button, std::bind(&tcustom_tod::do_save_schedule, this)); + */ connect_signal_notify_modified( *(lawful_bonus_field_->widget()), diff --git a/src/gui/dialogs/game_cache_options.cpp b/src/gui/dialogs/game_cache_options.cpp index dea0b4de04ac..98784dcfcfd5 100644 --- a/src/gui/dialogs/game_cache_options.cpp +++ b/src/gui/dialogs/game_cache_options.cpp @@ -32,6 +32,7 @@ #include "utils/functional.hpp" #include "gettext.hpp" +#include "video.hpp" namespace gui2 { diff --git a/src/gui/dialogs/game_load.cpp b/src/gui/dialogs/game_load.cpp index db5693c7a1a8..122f8d6e9b3d 100644 --- a/src/gui/dialogs/game_load.cpp +++ b/src/gui/dialogs/game_load.cpp @@ -200,7 +200,7 @@ void tgame_load::list_item_clicked(twindow& window) display_savegame(window); } -bool tgame_load::filter_text_changed(ttext_* textbox, const std::string& text) +void tgame_load::filter_text_changed(ttext_* textbox, const std::string& text) { twindow& window = *textbox->get_window(); @@ -209,7 +209,7 @@ bool tgame_load::filter_text_changed(ttext_* textbox, const std::string& text) const std::vector words = utils::split(text, ' '); if(words == last_words_) - return false; + return; last_words_ = words; std::vector show_items(list.get_item_count(), true); @@ -243,8 +243,6 @@ bool tgame_load::filter_text_changed(ttext_* textbox, const std::string& text) } list.set_row_shown(show_items); - - return false; } void tgame_load::post_show(twindow& window) diff --git a/src/gui/dialogs/game_load.hpp b/src/gui/dialogs/game_load.hpp index 8dd3360d5ca0..6efc52358ff2 100644 --- a/src/gui/dialogs/game_load.hpp +++ b/src/gui/dialogs/game_load.hpp @@ -62,7 +62,7 @@ class tgame_load : public tdialog /** Inherited from tdialog, implemented by REGISTER_DIALOG. */ virtual const std::string& window_id() const; - bool filter_text_changed(ttext_* textbox, const std::string& text); + void filter_text_changed(ttext_* textbox, const std::string& text); void list_item_clicked(twindow& window); void delete_button_callback(twindow& window); diff --git a/src/gui/dialogs/multiplayer/mp_connect.cpp b/src/gui/dialogs/multiplayer/mp_connect.cpp index f646b00c07a8..ea0ec3252c20 100644 --- a/src/gui/dialogs/multiplayer/mp_connect.cpp +++ b/src/gui/dialogs/multiplayer/mp_connect.cpp @@ -28,6 +28,7 @@ #include "gui/widgets/settings.hpp" #include "utils/functional.hpp" +#include "video.hpp" namespace gui2 { diff --git a/src/gui/dialogs/preferences_dialog.cpp b/src/gui/dialogs/preferences_dialog.cpp index e76de3a05b70..e3e5ed3e8e40 100644 --- a/src/gui/dialogs/preferences_dialog.cpp +++ b/src/gui/dialogs/preferences_dialog.cpp @@ -603,7 +603,7 @@ void tpreferences::initialize_members(twindow& window) /* SELECT THEME */ connect_signal_mouse_left_click( find_widget(&window, "choose_theme", false), - std::bind(&show_theme_dialog, + bind_void(&show_theme_dialog, std::ref(window.video()))); @@ -614,22 +614,22 @@ void tpreferences::initialize_members(twindow& window) /* SOUND FX */ setup_toggle_slider_pair("sound_toggle_sfx", "sound_volume_sfx", sound_on(), sound_volume(), - set_sound, set_sound_volume, window); + bind_void(set_sound, _1), set_sound_volume, window); /* MUSIC */ setup_toggle_slider_pair("sound_toggle_music", "sound_volume_music", music_on(), music_volume(), - set_music, set_music_volume, window); + bind_void(set_music, _1), set_music_volume, window); /* TURN BELL */ setup_toggle_slider_pair("sound_toggle_bell", "sound_volume_bell", turn_bell(), bell_volume(), - set_turn_bell, set_bell_volume, window); + bind_void(set_turn_bell, _1), set_bell_volume, window); /* UI FX */ setup_toggle_slider_pair("sound_toggle_uisfx", "sound_volume_uisfx", UI_sound_on(), UI_volume(), - set_UI_sound, set_UI_volume, window); + bind_void(set_UI_sound, _1), set_UI_volume, window); // diff --git a/src/gui/dialogs/screenshot_notification.cpp b/src/gui/dialogs/screenshot_notification.cpp index be50d95a18b6..e470047ee42a 100644 --- a/src/gui/dialogs/screenshot_notification.cpp +++ b/src/gui/dialogs/screenshot_notification.cpp @@ -96,12 +96,12 @@ void tscreenshot_notification::pre_show(twindow& window) tbutton& open_b = find_widget(&window, "open", false); connect_signal_mouse_left_click( - open_b, std::bind(&desktop::open_object, std::ref(path_))); + open_b, bind_void(&desktop::open_object, std::ref(path_))); tbutton& bdir_b = find_widget(&window, "browse_dir", false); connect_signal_mouse_left_click( bdir_b, - std::bind(&desktop::open_object, + bind_void(&desktop::open_object, std::ref(screenshots_dir_path_))); } } diff --git a/src/gui/dialogs/unit_create.cpp b/src/gui/dialogs/unit_create.cpp index a14163947e33..2def34929c97 100644 --- a/src/gui/dialogs/unit_create.cpp +++ b/src/gui/dialogs/unit_create.cpp @@ -226,7 +226,7 @@ void tunit_create::list_item_clicked(twindow& window) .set_displayed_type(units_[selected_row]); } -bool tunit_create::filter_text_changed(ttext_* textbox, const std::string& text) +void tunit_create::filter_text_changed(ttext_* textbox, const std::string& text) { twindow& window = *textbox->get_window(); @@ -235,7 +235,7 @@ bool tunit_create::filter_text_changed(ttext_* textbox, const std::string& text) const std::vector words = utils::split(text, ' '); if(words == last_words_) - return false; + return; last_words_ = words; std::vector show_items(list.get_item_count(), true); @@ -269,8 +269,6 @@ bool tunit_create::filter_text_changed(ttext_* textbox, const std::string& text) } list.set_row_shown(show_items); - - return false; } void tunit_create::gender_toggle_callback(twindow&) diff --git a/src/gui/dialogs/unit_create.hpp b/src/gui/dialogs/unit_create.hpp index a54ef9200db7..da0c27c5547a 100644 --- a/src/gui/dialogs/unit_create.hpp +++ b/src/gui/dialogs/unit_create.hpp @@ -78,7 +78,7 @@ class tunit_create : public tdialog /** Callbacks */ void list_item_clicked(twindow& window); - bool filter_text_changed(ttext_* textbox, const std::string& text); + void filter_text_changed(ttext_* textbox, const std::string& text); void gender_toggle_callback(twindow& window); tgroup gender_toggle; diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index 9f2a735d740f..7d708ae6af6a 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -58,7 +58,7 @@ void make_screenshot(const std::string& name, CVideo& video, const TFunc& func) const std::string ext = ".bmp"; #endif filename = filesystem::get_next_filename(filename, ext); - const bool res = func(filename); + const bool res = func(filename, video); if (res) { gui2::tscreenshot_notification::display(filename, video); } else { @@ -553,7 +553,7 @@ void execute_command(const hotkey_command& command, command_executor* executor, executor->get_video().set_fullscreen(!preferences::fullscreen()); break; case HOTKEY_SCREENSHOT: - make_screenshot(_("Screenshot"), executor->get_video(), std::bind(&::screenshot, _1, std::ref(executor->get_video()))); + make_screenshot(_("Screenshot"), executor->get_video(), &::screenshot); break; case HOTKEY_ANIMATE_MAP: preferences::set_animate_map(!preferences::animate_map()); @@ -689,6 +689,6 @@ void command_executor_default::zoom_default() } void command_executor_default::map_screenshot() { - make_screenshot(_("Map-Screenshot"), get_video(), std::bind(&display::screenshot, &get_display(), _1, true)); + make_screenshot(_("Map-Screenshot"), get_video(), boost::bind(&display::screenshot, &get_display(), _1, true)); } } diff --git a/src/preferences_display.cpp b/src/preferences_display.cpp index f40dee5f8999..aee78f062592 100644 --- a/src/preferences_display.cpp +++ b/src/preferences_display.cpp @@ -150,7 +150,7 @@ bool show_theme_dialog(CVideo& video) return false; } -std::string show_wesnothd_server_search(CVideo& video) +void show_wesnothd_server_search(CVideo& video) { // Showing file_chooser so user can search the wesnothd std::string old_path = preferences::get_mp_server_program_name(); diff --git a/src/preferences_display.hpp b/src/preferences_display.hpp index 9ea5c9b9201f..f15294f6c814 100644 --- a/src/preferences_display.hpp +++ b/src/preferences_display.hpp @@ -39,7 +39,7 @@ namespace preferences { void set_idle_anim(bool ison); void set_idle_anim_rate(int rate); - std::string show_wesnothd_server_search(CVideo&); + void show_wesnothd_server_search(CVideo&); void show_preferences_dialog(CVideo& disp, const config& game_cfg, const DIALOG_OPEN_TO initial_view = VIEW_DEFAULT); bool show_theme_dialog(CVideo& disp); diff --git a/src/tod_manager.cpp b/src/tod_manager.cpp index 73713a880d84..7582bee2f807 100644 --- a/src/tod_manager.cpp +++ b/src/tod_manager.cpp @@ -91,7 +91,7 @@ void tod_manager::resolve_random(random_new::rng& r) //comma-separated string of integers >= 1 referring to the times_ array indices std::vector output; boost::copy( utils::split(random_tod_.str()) - | boost::adaptors::transformed(std::bind(lexical_cast_default, _1 , 0)) + | boost::adaptors::transformed(boost::bind(lexical_cast_default, _1 , 0)) | boost::adaptors::filtered(greater(0)) , std::back_inserter(output) ); diff --git a/src/utils/functional.hpp b/src/utils/functional.hpp index 90f5bcf4271e..8555f5792add 100644 --- a/src/utils/functional.hpp +++ b/src/utils/functional.hpp @@ -18,8 +18,112 @@ #ifndef INCL_FUNCTIONAL_HPP_ #define INCL_FUNCTIONAL_HPP_ +#include "global.hpp" #include +#include // Because std::bind is just not flexible enough -using namespace std::placeholders; +// We'd like to just say "using namespace std::placeholders", but unfortunately +// that clashes with Boost.Bind's placeholders in some cases (even if bind.hpp is not included). +// Instead, we specialize std::is_placeholder for the Boost placeholders, +// so that Boost placeholders can be passed to std::bind. + +template +struct std::is_placeholder> : public std::integral_constant {}; + +namespace detail { + template + struct apply { + using result_type = void; + apply(std::function fcn) : fcn(fcn) {} + void operator()(T... params) { + fcn(std::forward(params)...); + } + private: + std::function fcn; + }; + + template + apply make_apply(std::function fcn) { + return apply(fcn); + } + + template + struct function_base { + using type = typename function_base::type; + }; + + template + struct function_base { + using type = Ret(P...); + }; + + template + struct function_base { + using type = Ret(P...); + }; + + template + struct function_base { + using type = Ret(Class,P...); + }; + + template + struct function_base { + using type = Ret(const Class,P...); + }; + + template + struct function_base { + using type = Ret(volatile Class,P...); + }; + + template + struct function_base { + using type = Ret(const volatile Class,P...); + }; + + template + struct function_base> { + using type = Ret(P...); + }; +} + +template +auto bind_void(F fcn, P... bindings) +#ifndef HAVE_CXX14 +-> decltype(boost::bind( + detail::make_apply(std::function::type>(fcn)), bindings...) +) +#endif +{ + using T = typename detail::function_base::type; + return boost::bind(detail::make_apply(std::function(fcn)), bindings...); +} + +template +auto bind_void_exact(F fcn, P... bindings) +#ifndef HAVE_CXX14 +-> decltype( + boost::bind(detail::make_apply(std::function::type>(fcn)), bindings...) +) +#endif +{ + using T = typename detail::function_base::type; + return std::bind(detail::make_apply(std::function(fcn)), bindings...); +} + +/* A note on why std::bind is not flexible enough: + +1. The functions produced do not silently consume extra parameters passed to them. +This is not a bad thing per se, but some of Wesnoth's code relied on it. +It's useful behaviour, as well. + +2. A function that returns a value cannot be bound in a function type that returns void. +This is also relied upon in several places. + +If behaviour #1 is needed, we need to use boost::bind. For behaviour #2, this won't work; +instead, the bind_void function is provided. (This also provides behaviour #1. +To get #2 without #1, use bind_void_exact.) +*/ #endif From 74fd5395a9b4cd08ec5001ce35f003c98396cfe2 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 15:49:21 -0400 Subject: [PATCH 165/240] Fix "set wesnothd path" preference --- src/preferences_display.cpp | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/preferences_display.cpp b/src/preferences_display.cpp index aee78f062592..c1c2fc0c0e97 100644 --- a/src/preferences_display.cpp +++ b/src/preferences_display.cpp @@ -192,10 +192,9 @@ void show_wesnothd_server_search(CVideo& video) , &symbols); int res = dialogs::show_file_chooser_dialog(video, path, title, false, filename); - if (res == 0) - return path; - else - return ""; + if (res == 0) { + preferences::set_mp_server_program_name(path); + } } } // end namespace preferences From 2d72d1512bb23b429cfb88845d476df4628705b7 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 17:00:41 -0400 Subject: [PATCH 166/240] Attempt to fix Travis build --- .travis.yml | 2 +- src/utils/functional.hpp | 6 ++++-- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/.travis.yml b/.travis.yml index 6a2ce24d13b0..e9c76bbd7e44 100644 --- a/.travis.yml +++ b/.travis.yml @@ -47,7 +47,7 @@ before_install: - if [ "$BUILD" == "C++14 -O2" ]; then export WML_TEST_TIME=15; fi - if [ "$BUILD" == "C++14 -O2" ]; then export CXXSTD="1y"; fi - - if [ "$BUILD" == "-O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations"; fi + - if [ "$BUILD" == "-O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-deprecated-declarations"; fi - if [[ "$BUILD" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations -Wno-deprecated-register"; fi - if [ "$BUILD" == "-O0" ]; then export PLAY_TEST=false; fi - if [ "$BUILD" == "-O0" ]; then export MP_TEST=false; fi diff --git a/src/utils/functional.hpp b/src/utils/functional.hpp index 8555f5792add..c509a26fba5c 100644 --- a/src/utils/functional.hpp +++ b/src/utils/functional.hpp @@ -27,8 +27,10 @@ // Instead, we specialize std::is_placeholder for the Boost placeholders, // so that Boost placeholders can be passed to std::bind. -template -struct std::is_placeholder> : public std::integral_constant {}; +namespace std { // Some compilers can't handle it being specialized in the global scope + template + struct is_placeholder> : public integral_constant {}; +} namespace detail { template From a791909544167ff07be82d02d16d54e05c9f9753 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 17:03:38 -0400 Subject: [PATCH 167/240] Split the more complicated WML tags into separate Lua files --- data/lua/wml-flow.lua | 257 ++++++++++ data/lua/wml-tags.lua | 796 +----------------------------- data/lua/wml/endlevel.lua | 93 ++++ data/lua/wml/find_path.lua | 98 ++++ data/lua/wml/harm_unit.lua | 202 ++++++++ data/lua/wml/modify_unit.lua | 72 +++ data/lua/wml/random_placement.lua | 74 +++ 7 files changed, 802 insertions(+), 790 deletions(-) create mode 100644 data/lua/wml-flow.lua create mode 100644 data/lua/wml/endlevel.lua create mode 100644 data/lua/wml/find_path.lua create mode 100644 data/lua/wml/harm_unit.lua create mode 100644 data/lua/wml/modify_unit.lua create mode 100644 data/lua/wml/random_placement.lua diff --git a/data/lua/wml-flow.lua b/data/lua/wml-flow.lua new file mode 100644 index 000000000000..84e8e45d2ce9 --- /dev/null +++ b/data/lua/wml-flow.lua @@ -0,0 +1,257 @@ + + +function wml_actions.command(cfg) + utils.handle_event_commands(cfg, "plain") +end + +-- we can't create functions with names that are Lua keywords (eg if, while) +-- instead, we store the following anonymous functions directly into +-- the table, using the [] operator, rather than by using the point syntax + +wml_actions["if"] = function(cfg) + if not (helper.get_child(cfg, 'then') or helper.get_child(cfg, 'elseif') or helper.get_child(cfg, 'else')) then + helper.wml_error("[if] didn't find any [then], [elseif], or [else] children.") + end + + if wesnoth.eval_conditional(cfg) then -- evaluate [if] tag + for then_child in helper.child_range(cfg, "then") do + local action = utils.handle_event_commands(then_child, "conditional") + if action ~= "none" then break end + end + return -- stop after executing [then] tags + end + + for elseif_child in helper.child_range(cfg, "elseif") do + if wesnoth.eval_conditional(elseif_child) then -- we'll evaluate the [elseif] tags one by one + for then_tag in helper.child_range(elseif_child, "then") do + local action = utils.handle_event_commands(then_tag, "conditional") + if action ~= "none" then break end + end + return -- stop on first matched condition + end + end + + -- no matched condition, try the [else] tags + for else_child in helper.child_range(cfg, "else") do + local action = utils.handle_event_commands(else_child, "conditional") + if action ~= "none" then break end + end +end + +wml_actions["while"] = function( cfg ) + if helper.child_count(cfg, "do") == 0 then + helper.wml_error "[while] does not contain any [do] tags" + end + + -- execute [do] up to 65536 times + for i = 1, 65536 do + if wesnoth.eval_conditional( cfg ) then + for do_child in helper.child_range( cfg, "do" ) do + local action = utils.handle_event_commands(do_child, "loop") + if action == "break" then + utils.set_exiting("none") + return + elseif action == "continue" then + utils.set_exiting("none") + break + elseif action ~= "none" then + return + end + end + else return end + end +end + +wml_actions["break"] = function(cfg) + utils.set_exiting("break") +end + +wml_actions["return"] = function(cfg) + utils.set_exiting("return") +end + +function wml_actions.continue(cfg) + utils.set_exiting("continue") +end + +wesnoth.wml_actions["for"] = function(cfg) + if helper.child_count(cfg, "do") == 0 then + helper.wml_error "[for] does not contain any [do] tags" + end + + local loop_lim = {} + local first + if cfg.array ~= nil then + if cfg.reverse then + first = wesnoth.get_variable(cfg.array .. ".length") - 1 + loop_lim.last = 0 + loop_lim.step = -1 + else + first = 0 + loop_lim.last = '$($' .. cfg.array .. ".length - 1)" + loop_lim.step = 1 + end + else + -- Get a literal config to fetch end and step; + -- this done is to delay expansion of variables + local cfg_lit = helper.literal(cfg) + first = cfg.start or 0 + loop_lim.last = cfg_lit["end"] or first + if cfg.step then loop_lim.step = cfg_lit.step end + end + loop_lim = wesnoth.tovconfig(loop_lim) + if loop_lim.step == 0 then -- Sanity check + helper.wml_error("[for] has a step of 0!") + end + if (first < loop_lim.last and loop_lim.step <= 0) or (first > loop_lim.last and loop_lim.step >= 0) then + -- Sanity check: If they specify something like start,end,step=1,4,-1 + -- then we do nothing + return + end + local i_var = cfg.variable or "i" + local save_i = utils.start_var_scope(i_var) + wesnoth.set_variable(i_var, first) + local function loop_condition() + local sentinel = loop_lim.last + if loop_lim.step then + sentinel = sentinel + loop_lim.step + elseif loop_lim.last < first then + sentinel = sentinel - 1 + else + sentinel = sentinel + 1 + end + if loop_lim.step > 0 then + return wesnoth.get_variable(i_var) < sentinel + else + return wesnoth.get_variable(i_var) > sentinel + end + end + while loop_condition() do + for do_child in helper.child_range( cfg, "do" ) do + local action = utils.handle_event_commands(do_child, "loop") + if action == "break" then + utils.set_exiting("none") + goto exit + elseif action == "continue" then + utils.set_exiting("none") + break + elseif action ~= "none" then + goto exit + end + end + wesnoth.set_variable(i_var, wesnoth.get_variable(i_var) + loop_lim.step) + end + ::exit:: + utils.end_var_scope(i_var, save_i) +end + +wml_actions["repeat"] = function(cfg) + if helper.child_count(cfg, "do") == 0 then + helper.wml_error "[repeat] does not contain any [do] tags" + end + + local times = cfg.times or 1 + for i = 1, times do + for do_child in helper.child_range( cfg, "do" ) do + local action = utils.handle_event_commands(do_child, "loop") + if action == "break" then + utils.set_exiting("none") + return + elseif action == "continue" then + utils.set_exiting("none") + break + elseif action ~= "none" then + return + end + end + end +end + +function wml_actions.foreach(cfg) + if helper.child_count(cfg, "do") == 0 then + helper.wml_error "[foreach] does not contain any [do] tags" + end + + local array_name = cfg.variable or helper.wml_error "[foreach] missing required variable= attribute" + local array = helper.get_variable_array(array_name) + if #array == 0 then return end -- empty and scalars unwanted + local item_name = cfg.item_var or "this_item" + local this_item = utils.start_var_scope(item_name) -- if this_item is already set + local i_name = cfg.index_var or "i" + local i = utils.start_var_scope(i_name) -- if i is already set + local array_length = wesnoth.get_variable(array_name .. ".length") + + for index, value in ipairs(array) do + -- Some protection against external modification + -- It's not perfect, though - it'd be nice if *any* change could be detected + if array_length ~= wesnoth.get_variable(array_name .. ".length") then + helper.wml_error("WML array length changed during [foreach] iteration") + end + wesnoth.set_variable(item_name, value) + -- set index variable + wesnoth.set_variable(i_name, index-1) -- here -1, because of WML array + -- perform actions + for do_child in helper.child_range(cfg, "do") do + local action = utils.handle_event_commands(do_child, "loop") + if action == "break" then + utils.set_exiting("none") + goto exit + elseif action == "continue" then + utils.set_exiting("none") + break + elseif action ~= "none" then + goto exit + end + end + -- set back the content, in case the author made some modifications + if not cfg.readonly then + array[index] = wesnoth.get_variable(item_name) + end + end + ::exit:: + + -- house cleaning + utils.end_var_scope(item_name, this_item) + utils.end_var_scope(i_name, i) + + --[[ + This forces the readonly key to be taken literally. + + If readonly=yes, then this line guarantees that the array + is unchanged after the [foreach] loop ends. + + If readonly=no, then this line updates the array with any + changes the user has applied through the $this_item + variable (or whatever variable was given in item_var). + + Note that altering the array via indexing (with the index_var) + is not supported; any such changes will be reverted by this line. + ]] + helper.set_variable_array(array_name, array) +end + +function wml_actions.switch(cfg) + local var_value = wesnoth.get_variable(cfg.variable) + local found = false + + -- Execute all the [case]s where the value matches. + for v in helper.child_range(cfg, "case") do + for w in utils.split(v.value) do + if w == tostring(var_value) then + local action = utils.handle_event_commands(v, "switch") + found = true + if action ~= "none" then goto exit end + break + end + end + end + ::exit:: + + -- Otherwise execute [else] statements. + if not found then + for v in helper.child_range(cfg, "else") do + local action = utils.handle_event_commands(v, "switch") + if action ~= "none" then break end + end + end +end \ No newline at end of file diff --git a/data/lua/wml-tags.lua b/data/lua/wml-tags.lua index 21c1b1a78001..da547ad42dfb 100644 --- a/data/lua/wml-tags.lua +++ b/data/lua/wml-tags.lua @@ -11,10 +11,16 @@ function wesnoth.game_events.on_save() return {} end +wesnoth.require "lua/wml-flow.lua" wesnoth.require "lua/wml/objectives.lua" wesnoth.require "lua/wml/items.lua" wesnoth.require "lua/wml/message.lua" wesnoth.require "lua/wml/object.lua" +wesnoth.require "lua/wml/modify_unit.lua" +wesnoth.require "lua/wml/harm_unit.lua" +wesnoth.require "lua/wml/find_path.lua" +wesnoth.require "lua/wml/endlevel.lua" +wesnoth.require "lua/wml/random_placement.lua" local helper = wesnoth.require "lua/helper.lua" local location_set = wesnoth.require "lua/location_set.lua" @@ -260,262 +266,6 @@ function wml_actions.music(cfg) wesnoth.set_music(cfg) end -function wml_actions.command(cfg) - utils.handle_event_commands(cfg, "plain") -end - --- we can't create functions with names that are Lua keywords (eg if, while) --- instead, we store the following anonymous functions directly into --- the table, using the [] operator, rather than by using the point syntax - -wml_actions["if"] = function(cfg) - if not (helper.get_child(cfg, 'then') or helper.get_child(cfg, 'elseif') or helper.get_child(cfg, 'else')) then - helper.wml_error("[if] didn't find any [then], [elseif], or [else] children.") - end - - if wesnoth.eval_conditional(cfg) then -- evaluate [if] tag - for then_child in helper.child_range(cfg, "then") do - local action = utils.handle_event_commands(then_child, "conditional") - if action ~= "none" then break end - end - return -- stop after executing [then] tags - end - - for elseif_child in helper.child_range(cfg, "elseif") do - if wesnoth.eval_conditional(elseif_child) then -- we'll evaluate the [elseif] tags one by one - for then_tag in helper.child_range(elseif_child, "then") do - local action = utils.handle_event_commands(then_tag, "conditional") - if action ~= "none" then break end - end - return -- stop on first matched condition - end - end - - -- no matched condition, try the [else] tags - for else_child in helper.child_range(cfg, "else") do - local action = utils.handle_event_commands(else_child, "conditional") - if action ~= "none" then break end - end -end - -wml_actions["while"] = function( cfg ) - if helper.child_count(cfg, "do") == 0 then - helper.wml_error "[while] does not contain any [do] tags" - end - - -- execute [do] up to 65536 times - for i = 1, 65536 do - if wesnoth.eval_conditional( cfg ) then - for do_child in helper.child_range( cfg, "do" ) do - local action = utils.handle_event_commands(do_child, "loop") - if action == "break" then - utils.set_exiting("none") - return - elseif action == "continue" then - utils.set_exiting("none") - break - elseif action ~= "none" then - return - end - end - else return end - end -end - -wml_actions["break"] = function(cfg) - utils.set_exiting("break") -end - -wml_actions["return"] = function(cfg) - utils.set_exiting("return") -end - -function wml_actions.continue(cfg) - utils.set_exiting("continue") -end - -wesnoth.wml_actions["for"] = function(cfg) - if helper.child_count(cfg, "do") == 0 then - helper.wml_error "[for] does not contain any [do] tags" - end - - local loop_lim = {} - local first - if cfg.array ~= nil then - if cfg.reverse then - first = wesnoth.get_variable(cfg.array .. ".length") - 1 - loop_lim.last = 0 - loop_lim.step = -1 - else - first = 0 - loop_lim.last = '$($' .. cfg.array .. ".length - 1)" - loop_lim.step = 1 - end - else - -- Get a literal config to fetch end and step; - -- this done is to delay expansion of variables - local cfg_lit = helper.literal(cfg) - first = cfg.start or 0 - loop_lim.last = cfg_lit["end"] or first - if cfg.step then loop_lim.step = cfg_lit.step end - end - loop_lim = wesnoth.tovconfig(loop_lim) - if loop_lim.step == 0 then -- Sanity check - helper.wml_error("[for] has a step of 0!") - end - if (first < loop_lim.last and loop_lim.step <= 0) or (first > loop_lim.last and loop_lim.step >= 0) then - -- Sanity check: If they specify something like start,end,step=1,4,-1 - -- then we do nothing - return - end - local i_var = cfg.variable or "i" - local save_i = utils.start_var_scope(i_var) - wesnoth.set_variable(i_var, first) - local function loop_condition() - local sentinel = loop_lim.last - if loop_lim.step then - sentinel = sentinel + loop_lim.step - elseif loop_lim.last < first then - sentinel = sentinel - 1 - else - sentinel = sentinel + 1 - end - if loop_lim.step > 0 then - return wesnoth.get_variable(i_var) < sentinel - else - return wesnoth.get_variable(i_var) > sentinel - end - end - while loop_condition() do - for do_child in helper.child_range( cfg, "do" ) do - local action = utils.handle_event_commands(do_child, "loop") - if action == "break" then - utils.set_exiting("none") - goto exit - elseif action == "continue" then - utils.set_exiting("none") - break - elseif action ~= "none" then - goto exit - end - end - wesnoth.set_variable(i_var, wesnoth.get_variable(i_var) + loop_lim.step) - end - ::exit:: - utils.end_var_scope(i_var, save_i) -end - -wml_actions["repeat"] = function(cfg) - if helper.child_count(cfg, "do") == 0 then - helper.wml_error "[repeat] does not contain any [do] tags" - end - - local times = cfg.times or 1 - for i = 1, times do - for do_child in helper.child_range( cfg, "do" ) do - local action = utils.handle_event_commands(do_child, "loop") - if action == "break" then - utils.set_exiting("none") - return - elseif action == "continue" then - utils.set_exiting("none") - break - elseif action ~= "none" then - return - end - end - end -end - -function wml_actions.foreach(cfg) - if helper.child_count(cfg, "do") == 0 then - helper.wml_error "[foreach] does not contain any [do] tags" - end - - local array_name = cfg.variable or helper.wml_error "[foreach] missing required variable= attribute" - local array = helper.get_variable_array(array_name) - if #array == 0 then return end -- empty and scalars unwanted - local item_name = cfg.item_var or "this_item" - local this_item = utils.start_var_scope(item_name) -- if this_item is already set - local i_name = cfg.index_var or "i" - local i = utils.start_var_scope(i_name) -- if i is already set - local array_length = wesnoth.get_variable(array_name .. ".length") - - for index, value in ipairs(array) do - -- Some protection against external modification - -- It's not perfect, though - it'd be nice if *any* change could be detected - if array_length ~= wesnoth.get_variable(array_name .. ".length") then - helper.wml_error("WML array length changed during [foreach] iteration") - end - wesnoth.set_variable(item_name, value) - -- set index variable - wesnoth.set_variable(i_name, index-1) -- here -1, because of WML array - -- perform actions - for do_child in helper.child_range(cfg, "do") do - local action = utils.handle_event_commands(do_child, "loop") - if action == "break" then - utils.set_exiting("none") - goto exit - elseif action == "continue" then - utils.set_exiting("none") - break - elseif action ~= "none" then - goto exit - end - end - -- set back the content, in case the author made some modifications - if not cfg.readonly then - array[index] = wesnoth.get_variable(item_name) - end - end - ::exit:: - - -- house cleaning - utils.end_var_scope(item_name, this_item) - utils.end_var_scope(i_name, i) - - --[[ - This forces the readonly key to be taken literally. - - If readonly=yes, then this line guarantees that the array - is unchanged after the [foreach] loop ends. - - If readonly=no, then this line updates the array with any - changes the user has applied through the $this_item - variable (or whatever variable was given in item_var). - - Note that altering the array via indexing (with the index_var) - is not supported; any such changes will be reverted by this line. - ]] - helper.set_variable_array(array_name, array) -end - -function wml_actions.switch(cfg) - local var_value = wesnoth.get_variable(cfg.variable) - local found = false - - -- Execute all the [case]s where the value matches. - for v in helper.child_range(cfg, "case") do - for w in utils.split(v.value) do - if w == tostring(var_value) then - local action = utils.handle_event_commands(v, "switch") - found = true - if action ~= "none" then goto exit end - break - end - end - end - ::exit:: - - -- Otherwise execute [else] statements. - if not found then - for v in helper.child_range(cfg, "else") do - local action = utils.handle_event_commands(v, "switch") - if action ~= "none" then break end - end - end -end - -- This is mainly for use in unit test macros, but maybe it can be useful elsewhere too function wml_actions.test_condition(cfg) local logger = cfg.logger or "warning" @@ -748,77 +498,6 @@ function wml_actions.unhide_unit(cfg) wml_actions.redraw {} end -function wml_actions.modify_unit(cfg) - local unit_variable = "LUA_modify_unit" - - local function handle_attributes(cfg, unit_path, toplevel) - for current_key, current_value in pairs(helper.shallow_parsed(cfg)) do - if type(current_value) ~= "table" and (not toplevel or current_key ~= "type") then - wesnoth.set_variable(string.format("%s.%s", unit_path, current_key), current_value) - end - end - end - - local function handle_child(cfg, unit_path) - local children_handled = {} - local cfg = helper.shallow_parsed(cfg) - handle_attributes(cfg, unit_path) - - for current_index, current_table in ipairs(cfg) do - local current_tag = current_table[1] - local tag_index = children_handled[current_tag] or 0 - handle_child(current_table[2], string.format("%s.%s[%u]", - unit_path, current_tag, tag_index)) - children_handled[current_tag] = tag_index + 1 - end - end - - local filter = helper.get_child(cfg, "filter") or helper.wml_error "[modify_unit] missing required [filter] tag" - local function handle_unit(unit_num) - local children_handled = {} - local unit_path = string.format("%s[%u]", unit_variable, unit_num) - local this_unit = wesnoth.get_variable(unit_path) - wesnoth.set_variable("this_unit", this_unit) - handle_attributes(cfg, unit_path, true) - - for current_index, current_table in ipairs(helper.shallow_parsed(cfg)) do - local current_tag = current_table[1] - if current_tag == "filter" then - -- nothing - elseif current_tag == "object" or current_tag == "trait" or current_tag == "advancement" then - local unit = wesnoth.get_variable(unit_path) - unit = wesnoth.create_unit(unit) - wesnoth.add_modification(unit, current_tag, current_table[2]) - unit = unit.__cfg; - wesnoth.set_variable(unit_path, unit) - else - local tag_index = children_handled[current_tag] or 0 - handle_child(current_table[2], string.format("%s.%s[%u]", - unit_path, current_tag, tag_index)) - children_handled[current_tag] = tag_index + 1 - end - end - - if cfg.type then - if cfg.type ~= "" then wesnoth.set_variable(unit_path .. ".advances_to", cfg.type) end - wesnoth.set_variable(unit_path .. ".experience", wesnoth.get_variable(unit_path .. ".max_experience")) - end - wml_actions.kill({ id = this_unit.id, animate = false }) - wml_actions.unstore_unit { variable = unit_path } - end - - wml_actions.store_unit { {"filter", filter}, variable = unit_variable } - local max_index = wesnoth.get_variable(unit_variable .. ".length") - 1 - - local this_unit = utils.start_var_scope("this_unit") - for current_unit = 0, max_index do - handle_unit(current_unit) - end - utils.end_var_scope("this_unit", this_unit) - - wesnoth.set_variable(unit_variable) -end - function wml_actions.move_unit(cfg) local coordinate_error = "invalid coordinate in [move_unit]" local to_x = tostring(cfg.to_x or helper.wml_error(coordinate_error)) @@ -949,207 +628,6 @@ function wml_actions.unpetrify(cfg) end end -function wml_actions.harm_unit(cfg) - local filter = helper.get_child(cfg, "filter") or helper.wml_error("[harm_unit] missing required [filter] tag") - -- we need to use shallow_literal field, to avoid raising an error if $this_unit (not yet assigned) is used - if not helper.shallow_literal(cfg).amount then helper.wml_error("[harm_unit] has missing required amount= attribute") end - local variable = cfg.variable -- kept out of the way to avoid problems - local _ = wesnoth.textdomain "wesnoth" - -- #textdomain wesnoth - local harmer - - local function toboolean( value ) -- helper for animate fields - -- units will be animated upon leveling or killing, even - -- with special attacker and defender values - if value then return true - else return false end - end - - local this_unit = utils.start_var_scope("this_unit") - - for index, unit_to_harm in ipairs(wesnoth.get_units(filter)) do - if unit_to_harm.valid then - -- block to support $this_unit - wesnoth.set_variable ( "this_unit" ) -- clearing this_unit - wesnoth.set_variable("this_unit", unit_to_harm.__cfg) -- cfg field needed - local amount = tonumber(cfg.amount) - local animate = cfg.animate -- attacker and defender are special values - local delay = cfg.delay or 500 - local kill = cfg.kill - local fire_event = cfg.fire_event - local primary_attack = helper.get_child(cfg, "primary_attack") - local secondary_attack = helper.get_child(cfg, "secondary_attack") - local harmer_filter = helper.get_child(cfg, "filter_second") - local experience = cfg.experience - local resistance_multiplier = tonumber(cfg.resistance_multiplier) or 1 - if harmer_filter then harmer = wesnoth.get_units(harmer_filter)[1] end - -- end of block to support $this_unit - - if animate then - if animate ~= "defender" and harmer and harmer.valid then - wesnoth.scroll_to_tile(harmer.x, harmer.y, true) - wml_actions.animate_unit { - flag = "attack", - hits = true, - with_bars = true, - T.filter { id = harmer.id }, - T.primary_attack ( primary_attack ), - T.secondary_attack ( secondary_attack ), - T.facing { x = unit_to_harm.x, y = unit_to_harm.y }, - } - end - wesnoth.scroll_to_tile(unit_to_harm.x, unit_to_harm.y, true) - end - - -- the two functions below are taken straight from the C++ engine, utils.cpp and actions.cpp, with a few unuseful parts removed - -- may be moved in helper.lua in 1.11 - local function round_damage( base_damage, bonus, divisor ) - local rounding - if base_damage == 0 then return 0 - else - if bonus < divisor or divisor == 1 then - rounding = divisor / 2 - 0 - else - rounding = divisor / 2 - 1 - end - return math.max( 1, math.floor( ( base_damage * bonus + rounding ) / divisor ) ) - end - end - - local function calculate_damage( base_damage, alignment, tod_bonus, resistance, modifier ) - local damage_multiplier = 100 - if alignment == "lawful" then - damage_multiplier = damage_multiplier + tod_bonus - elseif alignment == "chaotic" then - damage_multiplier = damage_multiplier - tod_bonus - elseif alignment == "liminal" then - damage_multiplier = damage_multiplier - math.abs( tod_bonus ) - else -- neutral, do nothing - end - local resistance_modified = resistance * modifier - damage_multiplier = damage_multiplier * resistance_modified - local damage = round_damage( base_damage, damage_multiplier, 10000 ) -- if harmer.status.slowed, this may be 20000 ? - return damage - end - - local damage = calculate_damage( - amount, - cfg.alignment or "neutral", - wesnoth.get_time_of_day( { unit_to_harm.x, unit_to_harm.y, true } ).lawful_bonus, - wesnoth.unit_resistance( unit_to_harm, cfg.damage_type or "dummy" ), - resistance_multiplier - ) - - if unit_to_harm.hitpoints <= damage then - if kill == false then damage = unit_to_harm.hitpoints - 1 - else damage = unit_to_harm.hitpoints - end - end - - unit_to_harm.hitpoints = unit_to_harm.hitpoints - damage - local text = string.format("%d%s", damage, "\n") - local add_tab = false - local gender = unit_to_harm.__cfg.gender - - local function set_status(name, male_string, female_string, sound) - if not cfg[name] or unit_to_harm.status[name] then return end - if gender == "female" then - text = string.format("%s%s%s", text, tostring(female_string), "\n") - else - text = string.format("%s%s%s", text, tostring(male_string), "\n") - end - - unit_to_harm.status[name] = true - add_tab = true - - if animate and sound then -- for unhealable, that has no sound - wesnoth.play_sound (sound) - end - end - - if not unit_to_harm.status.unpoisonable then - set_status("poisoned", _"poisoned", _"female^poisoned", "poison.ogg") - end - set_status("slowed", _"slowed", _"female^slowed", "slowed.wav") - set_status("petrified", _"petrified", _"female^petrified", "petrified.ogg") - set_status("unhealable", _"unhealable", _"female^unhealable") - - -- Extract unit and put it back to update animation if status was changed - wesnoth.extract_unit(unit_to_harm) - wesnoth.put_unit(unit_to_harm) - - if add_tab then - text = string.format("%s%s", "\t", text) - end - - if animate and animate ~= "attacker" then - if harmer and harmer.valid then - wml_actions.animate_unit { - flag = "defend", - hits = true, - with_bars = true, - T.filter { id = unit_to_harm.id }, - T.primary_attack ( primary_attack ), - T.secondary_attack ( secondary_attack ), - T.facing { x = harmer.x, y = harmer.y }, - } - else - wml_actions.animate_unit { - flag = "defend", - hits = true, - with_bars = true, - T.filter { id = unit_to_harm.id }, - T.primary_attack ( primary_attack ), - T.secondary_attack ( secondary_attack ), - } - end - end - - wesnoth.float_label( unit_to_harm.x, unit_to_harm.y, string.format( "%s", text ) ) - - local function calc_xp( level ) -- to calculate the experience in case of kill - if level == 0 then return 4 - else return level * 8 end - end - - if experience ~= false and harmer and harmer.valid and wesnoth.is_enemy( unit_to_harm.side, harmer.side ) then -- no XP earned for harming friendly units - if kill ~= false and unit_to_harm.hitpoints <= 0 then - harmer.experience = harmer.experience + calc_xp( unit_to_harm.__cfg.level ) - else - unit_to_harm.experience = unit_to_harm.experience + harmer.__cfg.level - harmer.experience = harmer.experience + unit_to_harm.__cfg.level - end - end - - if kill ~= false and unit_to_harm.hitpoints <= 0 then - wml_actions.kill { id = unit_to_harm.id, animate = toboolean( animate ), fire_event = fire_event } - end - - if animate then - wesnoth.delay(delay) - end - - if variable then - wesnoth.set_variable(string.format("%s[%d]", variable, index - 1), { harm_amount = damage }) - end - - -- both units may no longer be alive at this point, so double check - if experience ~= false and unit_to_harm and unit_to_harm.valid then - unit_to_harm:advance(toboolean(animate), fire_event ~= false) - end - - if experience ~= false and harmer and harmer.valid then - harmer:advance(toboolean(animate), fire_event ~= false) - end - end - - wml_actions.redraw {} - end - - wesnoth.set_variable ( "this_unit" ) -- clearing this_unit - utils.end_var_scope("this_unit", this_unit) -end - function wml_actions.heal_unit(cfg) wesnoth.heal_unit(cfg) end @@ -1255,103 +733,6 @@ function wml_actions.add_ai_behavior(cfg) } end -function wml_actions.find_path(cfg) - local filter_unit = helper.get_child(cfg, "traveler") or helper.wml_error("[find_path] missing required [traveler] tag") - -- only the first unit matching - local unit = wesnoth.get_units(filter_unit)[1] or helper.wml_error("[find_path]'s filter didn't match any unit") - local filter_location = helper.get_child(cfg, "destination") or helper.wml_error( "[find_path] missing required [destination] tag" ) - -- support for $this_unit - local this_unit = utils.start_var_scope("this_unit") - - wesnoth.set_variable ( "this_unit" ) -- clearing this_unit - wesnoth.set_variable("this_unit", unit.__cfg) -- cfg field needed - - local variable = cfg.variable or "path" - local ignore_units = false - local ignore_teleport = false - - if cfg.check_zoc == false then --if we do not want to check the ZoCs, we must ignore units - ignore_units = true - end - if cfg.check_teleport == false then --if we do not want to check teleport, we must ignore it - ignore_teleport = true - end - - local allow_multiple_turns = cfg.allow_multiple_turns - local viewing_side - - if not cfg.check_visibility then viewing_side = 0 end -- if check_visiblity then shroud is taken in account - - local locations = wesnoth.get_locations(filter_location) -- only the location with the lowest distance and lowest movement cost will match. If there will still be more than 1, only the 1st maching one. - local max_cost = nil - if not allow_multiple_turns then max_cost = unit.moves end --to avoid wrong calculation on already moved units - local current_distance, current_cost = math.huge, math.huge - local current_location = {} - - local width,heigth,border = wesnoth.get_map_size() -- data for test below - - for index, location in ipairs(locations) do - -- we test if location passed to pathfinder is invalid (border); if is, do nothing, do not return and continue the cycle - if location[1] == 0 or location[1] == ( width + 1 ) or location[2] == 0 or location[2] == ( heigth + 1 ) then - else - local distance = helper.distance_between ( unit.x, unit.y, location[1], location[2] ) - -- if we pass an unreachable locations an high value will be returned - local path, cost = wesnoth.find_path( unit, location[1], location[2], { max_cost = max_cost, ignore_units = ignore_units, ignore_teleport = ignore_teleport, viewing_side = viewing_side } ) - - if ( distance < current_distance and cost <= current_cost ) or ( cost < current_cost and distance <= current_distance ) then -- to avoid changing the hex with one with less distance and more cost, or vice versa - current_distance = distance - current_cost = cost - current_location = location - end - end - end - - if #current_location == 0 then wesnoth.message("WML warning","[find_path]'s filter didn't match any location") - else - local path, cost = wesnoth.find_path( unit, current_location[1], current_location[2], { max_cost = max_cost, ignore_units = ignore_units, ignore_teleport = ignore_teleport, viewing_side = viewing_side } ) - local turns - - if cost == 0 then -- if location is the same, of course it doesn't cost any MP - turns = 0 - else - turns = math.ceil( ( ( cost - unit.moves ) / unit.max_moves ) + 1 ) - end - - if cost >= 42424242 then -- it's the high value returned for unwalkable or busy terrains - wesnoth.set_variable ( string.format("%s", variable), { hexes = 0 } ) -- set only length, nil all other values - -- support for $this_unit - wesnoth.set_variable ( "this_unit" ) -- clearing this_unit - utils.end_var_scope("this_unit", this_unit) - return end - - if not allow_multiple_turns and turns > 1 then -- location cannot be reached in one turn - wesnoth.set_variable ( string.format("%s", variable), { hexes = 0 } ) - -- support for $this_unit - wesnoth.set_variable ( "this_unit" ) -- clearing this_unit - utils.end_var_scope("this_unit", this_unit) - return end -- skip the cycles below - - wesnoth.set_variable ( string.format( "%s", variable ), { hexes = current_distance, from_x = unit.x, from_y = unit.y, to_x = current_location[1], to_y = current_location[2], movement_cost = cost, required_turns = turns } ) - - for index, path_loc in ipairs(path) do - local sub_path, sub_cost = wesnoth.find_path( unit, path_loc[1], path_loc[2], { max_cost = max_cost, ignore_units = ignore_units, ignore_teleport = ignore_teleport, viewing_side = viewing_side } ) - local sub_turns - - if sub_cost == 0 then - sub_turns = 0 - else - sub_turns = math.ceil( ( ( sub_cost - unit.moves ) / unit.max_moves ) + 1 ) - end - - wesnoth.set_variable ( string.format( "%s.step[%d]", variable, index - 1 ), { x = path_loc[1], y = path_loc[2], terrain = wesnoth.get_terrain( path_loc[1], path_loc[2] ), movement_cost = sub_cost, required_turns = sub_turns } ) -- this structure takes less space in the inspection window - end - end - - -- support for $this_unit - wesnoth.set_variable ( "this_unit" ) -- clearing this_unit - utils.end_var_scope("this_unit", this_unit) -end - function wml_actions.store_starting_location(cfg) local writer = utils.vwriter.init(cfg, "location") for possibly_wrong_index, side in ipairs(wesnoth.get_sides(cfg)) do @@ -1459,98 +840,6 @@ function wml_actions.end_turn(cfg) wesnoth.end_turn() end -function wml_actions.endlevel(cfg) - local parsed = helper.parsed(cfg) - if wesnoth.check_end_level_disabled() then - wesnoth.message("Repeated [endlevel] execution, ignoring") - return - end - - local next_scenario = cfg.next_scenario - if next_scenario then - wesnoth.set_next_scenario(next_scenario) - end - - local end_text = cfg.end_text - local end_text_duration = cfg.end_text_duration - if end_text or end_text_duration then - wesnoth.set_end_campaign_text(end_text or "", end_text_duration) - end - - local end_credits = cfg.end_credits - if end_credits ~= nil then - wesnoth.set_end_campaign_credits(end_credits) - end - - local side_results = {} - for result in helper.child_range(parsed, "result") do - local side = result.side or helper.wml_error("[result] in [endlevel] missing required side= key") - side_results[side] = result - end - local there_is_a_human_victory = false - local there_is_a_human_defeat = false - local there_is_a_local_human_victory = false - local there_is_a_local_human_defeat = false - local bool_int = function(b) - if b == true then - return 1 - elseif b == false then - return 0 - else - return b - end - end - for k,v in ipairs(wesnoth.sides) do - local side_result = side_results[v.side] or {} - local victory_or_defeat = side_result.result or cfg.result or "victory" - local victory = victory_or_defeat == "victory" - if victory_or_defeat ~= "victory" and victory_or_defeat ~= "defeat" then - return helper.wml_error("invalid result= key in [endlevel] '" .. victory_or_defeat .."'") - end - if v.controller == "human" or v.controller == "network" then - if victory then - there_is_a_human_victory = true - else - there_is_a_human_defeat = true - end - end - if v.controller == "human" then - if victory then - there_is_a_local_human_victory = true - else - there_is_a_local_human_defeat = true - end - end - if side_result.bonus ~= nil then - v.carryover_bonus = bool_int(side_result.bonus) - elseif cfg.bonus ~= nil then - v.carryover_bonus = bool_int(cfg.bonus) - end - if side_result.carryover_add ~= nil then - v.carryover_add = side_result.carryover_add - elseif cfg.carryover_add ~= nil then - v.carryover_add = cfg.carryover_add - end - if side_result.carryover_percentage ~= nil then - v.carryover_percentage = side_result.carryover_percentage - elseif cfg.carryover_percentage ~= nil then - v.carryover_percentage = cfg.carryover_percentage - end - end - local proceed_to_next_level = there_is_a_human_victory or (not there_is_a_human_defeat and cfg.result ~= "defeat") - local victory = there_is_a_local_human_victory or (not there_is_a_local_human_defeat and proceed_to_next_level) - wesnoth.end_level { - music = cfg.music, - carryover_report = cfg.carryover_report, - save = cfg.save, - replay_save = cfg.replay_save, - linger_mode = cfg.linger_mode, - reveal_map = cfg.reveal_map, - proceed_to_next_level = proceed_to_next_level, - result = victory and "victory" or "defeat", - } -end - function wml_actions.event(cfg) if cfg.remove then wml_actions.remove_event(cfg) @@ -1661,79 +950,6 @@ function wml_actions.unsynced(cfg) end) end -wesnoth.wml_actions.random_placement = function(cfg) - local dist_le = nil - - local parsed = helper.shallow_parsed(cfg) - -- TODO: In most cases this tag is used to place units, so maybe make include_borders=no the default for [filter_location]? - local filter = helper.get_child(parsed, "filter_location") or {} - local command = helper.get_child(parsed, "command") or helper.wml_error("[random_placement] missing required [command] subtag") - local distance = cfg.min_distance or 0 - local num_items = cfg.num_items or helper.wml_error("[random_placement] missing required 'num_items' attribute") - local variable = cfg.variable or helper.wml_error("[random_placement] missing required 'variable' attribute") - local allow_less = cfg.allow_less == true - local variable_previous = utils.start_var_scope(variable) - - if distance < 0 then - -- optimisation for distance = -1 - dist_le = function() return false end - elseif distance == 0 then - -- optimisation for distance = 0 - dist_le = function(x1,y1,x2,y2) return x1 == x2 and y1 == y2 end - else - -- optimisation: cloasure is faster than string lookups. - local math_abs = math.abs - -- same effect as helper.distance_between(x1,y1,x2,y2) <= distance but faster. - dist_le = function(x1,y1,x2,y2) - local d_x = math_abs(x1-x2) - if d_x > distance then - return false - end - if d_x % 2 ~= 0 then - if x1 % 2 == 0 then - y2 = y2 - 0.5 - else - y2 = y2 + 0.5 - end - end - local d_y = math_abs(y1-y2) - return d_x + 2*d_y <= 2*distance - end - end - - local locs = wesnoth.get_locations(filter) - if type(num_items) == "string" then - num_items = math.floor(loadstring("local size = " .. #locs .. "; return " .. num_items)()) - print("num_items=" .. num_items .. ", #locs=" .. #locs) - end - local size = #locs - for i = 1, num_items do - if size == 0 then - if allow_less then - print("placed only " .. i .. " items") - return - else - helper.wml_error("[random_placement] failed to place items. only " .. i .. " items were placed") - end - end - local index = wesnoth.random(size) - local point = locs[index] - wesnoth.set_variable(variable .. ".x", point[1]) - wesnoth.set_variable(variable .. ".y", point[2]) - wesnoth.set_variable(variable .. ".n", i) - for j = size, 1, -1 do - if dist_le(locs[j][1], locs[j][2], point[1], point[2]) then - -- optimisation: swapping elements and storing size in an extra variable is faster than table.remove(locs, j) - locs[j] = locs[size] - size = size - 1 - end - end - wesnoth.wml_actions.command (command) - end - utils.end_var_scope(variable, variable_previous) - -end - local function on_board(x, y) if type(x) ~= "number" or type(y) ~= "number" then return false diff --git a/data/lua/wml/endlevel.lua b/data/lua/wml/endlevel.lua new file mode 100644 index 000000000000..5590ccba0932 --- /dev/null +++ b/data/lua/wml/endlevel.lua @@ -0,0 +1,93 @@ + + +function wml_actions.endlevel(cfg) + local parsed = helper.parsed(cfg) + if wesnoth.check_end_level_disabled() then + wesnoth.message("Repeated [endlevel] execution, ignoring") + return + end + + local next_scenario = cfg.next_scenario + if next_scenario then + wesnoth.set_next_scenario(next_scenario) + end + + local end_text = cfg.end_text + local end_text_duration = cfg.end_text_duration + if end_text or end_text_duration then + wesnoth.set_end_campaign_text(end_text or "", end_text_duration) + end + + local end_credits = cfg.end_credits + if end_credits ~= nil then + wesnoth.set_end_campaign_credits(end_credits) + end + + local side_results = {} + for result in helper.child_range(parsed, "result") do + local side = result.side or helper.wml_error("[result] in [endlevel] missing required side= key") + side_results[side] = result + end + local there_is_a_human_victory = false + local there_is_a_human_defeat = false + local there_is_a_local_human_victory = false + local there_is_a_local_human_defeat = false + local bool_int = function(b) + if b == true then + return 1 + elseif b == false then + return 0 + else + return b + end + end + for k,v in ipairs(wesnoth.sides) do + local side_result = side_results[v.side] or {} + local victory_or_defeat = side_result.result or cfg.result or "victory" + local victory = victory_or_defeat == "victory" + if victory_or_defeat ~= "victory" and victory_or_defeat ~= "defeat" then + return helper.wml_error("invalid result= key in [endlevel] '" .. victory_or_defeat .."'") + end + if v.controller == "human" or v.controller == "network" then + if victory then + there_is_a_human_victory = true + else + there_is_a_human_defeat = true + end + end + if v.controller == "human" then + if victory then + there_is_a_local_human_victory = true + else + there_is_a_local_human_defeat = true + end + end + if side_result.bonus ~= nil then + v.carryover_bonus = bool_int(side_result.bonus) + elseif cfg.bonus ~= nil then + v.carryover_bonus = bool_int(cfg.bonus) + end + if side_result.carryover_add ~= nil then + v.carryover_add = side_result.carryover_add + elseif cfg.carryover_add ~= nil then + v.carryover_add = cfg.carryover_add + end + if side_result.carryover_percentage ~= nil then + v.carryover_percentage = side_result.carryover_percentage + elseif cfg.carryover_percentage ~= nil then + v.carryover_percentage = cfg.carryover_percentage + end + end + local proceed_to_next_level = there_is_a_human_victory or (not there_is_a_human_defeat and cfg.result ~= "defeat") + local victory = there_is_a_local_human_victory or (not there_is_a_local_human_defeat and proceed_to_next_level) + wesnoth.end_level { + music = cfg.music, + carryover_report = cfg.carryover_report, + save = cfg.save, + replay_save = cfg.replay_save, + linger_mode = cfg.linger_mode, + reveal_map = cfg.reveal_map, + proceed_to_next_level = proceed_to_next_level, + result = victory and "victory" or "defeat", + } +end \ No newline at end of file diff --git a/data/lua/wml/find_path.lua b/data/lua/wml/find_path.lua new file mode 100644 index 000000000000..23be65cd0c5e --- /dev/null +++ b/data/lua/wml/find_path.lua @@ -0,0 +1,98 @@ + + +function wml_actions.find_path(cfg) + local filter_unit = helper.get_child(cfg, "traveler") or helper.wml_error("[find_path] missing required [traveler] tag") + -- only the first unit matching + local unit = wesnoth.get_units(filter_unit)[1] or helper.wml_error("[find_path]'s filter didn't match any unit") + local filter_location = helper.get_child(cfg, "destination") or helper.wml_error( "[find_path] missing required [destination] tag" ) + -- support for $this_unit + local this_unit = utils.start_var_scope("this_unit") + + wesnoth.set_variable ( "this_unit" ) -- clearing this_unit + wesnoth.set_variable("this_unit", unit.__cfg) -- cfg field needed + + local variable = cfg.variable or "path" + local ignore_units = false + local ignore_teleport = false + + if cfg.check_zoc == false then --if we do not want to check the ZoCs, we must ignore units + ignore_units = true + end + if cfg.check_teleport == false then --if we do not want to check teleport, we must ignore it + ignore_teleport = true + end + + local allow_multiple_turns = cfg.allow_multiple_turns + local viewing_side + + if not cfg.check_visibility then viewing_side = 0 end -- if check_visiblity then shroud is taken in account + + local locations = wesnoth.get_locations(filter_location) -- only the location with the lowest distance and lowest movement cost will match. If there will still be more than 1, only the 1st maching one. + local max_cost = nil + if not allow_multiple_turns then max_cost = unit.moves end --to avoid wrong calculation on already moved units + local current_distance, current_cost = math.huge, math.huge + local current_location = {} + + local width,heigth,border = wesnoth.get_map_size() -- data for test below + + for index, location in ipairs(locations) do + -- we test if location passed to pathfinder is invalid (border); if is, do nothing, do not return and continue the cycle + if location[1] == 0 or location[1] == ( width + 1 ) or location[2] == 0 or location[2] == ( heigth + 1 ) then + else + local distance = helper.distance_between ( unit.x, unit.y, location[1], location[2] ) + -- if we pass an unreachable locations an high value will be returned + local path, cost = wesnoth.find_path( unit, location[1], location[2], { max_cost = max_cost, ignore_units = ignore_units, ignore_teleport = ignore_teleport, viewing_side = viewing_side } ) + + if ( distance < current_distance and cost <= current_cost ) or ( cost < current_cost and distance <= current_distance ) then -- to avoid changing the hex with one with less distance and more cost, or vice versa + current_distance = distance + current_cost = cost + current_location = location + end + end + end + + if #current_location == 0 then wesnoth.message("WML warning","[find_path]'s filter didn't match any location") + else + local path, cost = wesnoth.find_path( unit, current_location[1], current_location[2], { max_cost = max_cost, ignore_units = ignore_units, ignore_teleport = ignore_teleport, viewing_side = viewing_side } ) + local turns + + if cost == 0 then -- if location is the same, of course it doesn't cost any MP + turns = 0 + else + turns = math.ceil( ( ( cost - unit.moves ) / unit.max_moves ) + 1 ) + end + + if cost >= 42424242 then -- it's the high value returned for unwalkable or busy terrains + wesnoth.set_variable ( string.format("%s", variable), { hexes = 0 } ) -- set only length, nil all other values + -- support for $this_unit + wesnoth.set_variable ( "this_unit" ) -- clearing this_unit + utils.end_var_scope("this_unit", this_unit) + return end + + if not allow_multiple_turns and turns > 1 then -- location cannot be reached in one turn + wesnoth.set_variable ( string.format("%s", variable), { hexes = 0 } ) + -- support for $this_unit + wesnoth.set_variable ( "this_unit" ) -- clearing this_unit + utils.end_var_scope("this_unit", this_unit) + return end -- skip the cycles below + + wesnoth.set_variable ( string.format( "%s", variable ), { hexes = current_distance, from_x = unit.x, from_y = unit.y, to_x = current_location[1], to_y = current_location[2], movement_cost = cost, required_turns = turns } ) + + for index, path_loc in ipairs(path) do + local sub_path, sub_cost = wesnoth.find_path( unit, path_loc[1], path_loc[2], { max_cost = max_cost, ignore_units = ignore_units, ignore_teleport = ignore_teleport, viewing_side = viewing_side } ) + local sub_turns + + if sub_cost == 0 then + sub_turns = 0 + else + sub_turns = math.ceil( ( ( sub_cost - unit.moves ) / unit.max_moves ) + 1 ) + end + + wesnoth.set_variable ( string.format( "%s.step[%d]", variable, index - 1 ), { x = path_loc[1], y = path_loc[2], terrain = wesnoth.get_terrain( path_loc[1], path_loc[2] ), movement_cost = sub_cost, required_turns = sub_turns } ) -- this structure takes less space in the inspection window + end + end + + -- support for $this_unit + wesnoth.set_variable ( "this_unit" ) -- clearing this_unit + utils.end_var_scope("this_unit", this_unit) +end \ No newline at end of file diff --git a/data/lua/wml/harm_unit.lua b/data/lua/wml/harm_unit.lua new file mode 100644 index 000000000000..e57bfdf2109e --- /dev/null +++ b/data/lua/wml/harm_unit.lua @@ -0,0 +1,202 @@ + + +function wml_actions.harm_unit(cfg) + local filter = helper.get_child(cfg, "filter") or helper.wml_error("[harm_unit] missing required [filter] tag") + -- we need to use shallow_literal field, to avoid raising an error if $this_unit (not yet assigned) is used + if not helper.shallow_literal(cfg).amount then helper.wml_error("[harm_unit] has missing required amount= attribute") end + local variable = cfg.variable -- kept out of the way to avoid problems + local _ = wesnoth.textdomain "wesnoth" + -- #textdomain wesnoth + local harmer + + local function toboolean( value ) -- helper for animate fields + -- units will be animated upon leveling or killing, even + -- with special attacker and defender values + if value then return true + else return false end + end + + local this_unit = utils.start_var_scope("this_unit") + + for index, unit_to_harm in ipairs(wesnoth.get_units(filter)) do + if unit_to_harm.valid then + -- block to support $this_unit + wesnoth.set_variable ( "this_unit" ) -- clearing this_unit + wesnoth.set_variable("this_unit", unit_to_harm.__cfg) -- cfg field needed + local amount = tonumber(cfg.amount) + local animate = cfg.animate -- attacker and defender are special values + local delay = cfg.delay or 500 + local kill = cfg.kill + local fire_event = cfg.fire_event + local primary_attack = helper.get_child(cfg, "primary_attack") + local secondary_attack = helper.get_child(cfg, "secondary_attack") + local harmer_filter = helper.get_child(cfg, "filter_second") + local experience = cfg.experience + local resistance_multiplier = tonumber(cfg.resistance_multiplier) or 1 + if harmer_filter then harmer = wesnoth.get_units(harmer_filter)[1] end + -- end of block to support $this_unit + + if animate then + if animate ~= "defender" and harmer and harmer.valid then + wesnoth.scroll_to_tile(harmer.x, harmer.y, true) + wml_actions.animate_unit { + flag = "attack", + hits = true, + with_bars = true, + T.filter { id = harmer.id }, + T.primary_attack ( primary_attack ), + T.secondary_attack ( secondary_attack ), + T.facing { x = unit_to_harm.x, y = unit_to_harm.y }, + } + end + wesnoth.scroll_to_tile(unit_to_harm.x, unit_to_harm.y, true) + end + + -- the two functions below are taken straight from the C++ engine, utils.cpp and actions.cpp, with a few unuseful parts removed + -- may be moved in helper.lua in 1.11 + local function round_damage( base_damage, bonus, divisor ) + local rounding + if base_damage == 0 then return 0 + else + if bonus < divisor or divisor == 1 then + rounding = divisor / 2 - 0 + else + rounding = divisor / 2 - 1 + end + return math.max( 1, math.floor( ( base_damage * bonus + rounding ) / divisor ) ) + end + end + + local function calculate_damage( base_damage, alignment, tod_bonus, resistance, modifier ) + local damage_multiplier = 100 + if alignment == "lawful" then + damage_multiplier = damage_multiplier + tod_bonus + elseif alignment == "chaotic" then + damage_multiplier = damage_multiplier - tod_bonus + elseif alignment == "liminal" then + damage_multiplier = damage_multiplier - math.abs( tod_bonus ) + else -- neutral, do nothing + end + local resistance_modified = resistance * modifier + damage_multiplier = damage_multiplier * resistance_modified + local damage = round_damage( base_damage, damage_multiplier, 10000 ) -- if harmer.status.slowed, this may be 20000 ? + return damage + end + + local damage = calculate_damage( + amount, + cfg.alignment or "neutral", + wesnoth.get_time_of_day( { unit_to_harm.x, unit_to_harm.y, true } ).lawful_bonus, + wesnoth.unit_resistance( unit_to_harm, cfg.damage_type or "dummy" ), + resistance_multiplier + ) + + if unit_to_harm.hitpoints <= damage then + if kill == false then damage = unit_to_harm.hitpoints - 1 + else damage = unit_to_harm.hitpoints + end + end + + unit_to_harm.hitpoints = unit_to_harm.hitpoints - damage + local text = string.format("%d%s", damage, "\n") + local add_tab = false + local gender = unit_to_harm.__cfg.gender + + local function set_status(name, male_string, female_string, sound) + if not cfg[name] or unit_to_harm.status[name] then return end + if gender == "female" then + text = string.format("%s%s%s", text, tostring(female_string), "\n") + else + text = string.format("%s%s%s", text, tostring(male_string), "\n") + end + + unit_to_harm.status[name] = true + add_tab = true + + if animate and sound then -- for unhealable, that has no sound + wesnoth.play_sound (sound) + end + end + + if not unit_to_harm.status.unpoisonable then + set_status("poisoned", _"poisoned", _"female^poisoned", "poison.ogg") + end + set_status("slowed", _"slowed", _"female^slowed", "slowed.wav") + set_status("petrified", _"petrified", _"female^petrified", "petrified.ogg") + set_status("unhealable", _"unhealable", _"female^unhealable") + + -- Extract unit and put it back to update animation if status was changed + wesnoth.extract_unit(unit_to_harm) + wesnoth.put_unit(unit_to_harm) + + if add_tab then + text = string.format("%s%s", "\t", text) + end + + if animate and animate ~= "attacker" then + if harmer and harmer.valid then + wml_actions.animate_unit { + flag = "defend", + hits = true, + with_bars = true, + T.filter { id = unit_to_harm.id }, + T.primary_attack ( primary_attack ), + T.secondary_attack ( secondary_attack ), + T.facing { x = harmer.x, y = harmer.y }, + } + else + wml_actions.animate_unit { + flag = "defend", + hits = true, + with_bars = true, + T.filter { id = unit_to_harm.id }, + T.primary_attack ( primary_attack ), + T.secondary_attack ( secondary_attack ), + } + end + end + + wesnoth.float_label( unit_to_harm.x, unit_to_harm.y, string.format( "%s", text ) ) + + local function calc_xp( level ) -- to calculate the experience in case of kill + if level == 0 then return 4 + else return level * 8 end + end + + if experience ~= false and harmer and harmer.valid and wesnoth.is_enemy( unit_to_harm.side, harmer.side ) then -- no XP earned for harming friendly units + if kill ~= false and unit_to_harm.hitpoints <= 0 then + harmer.experience = harmer.experience + calc_xp( unit_to_harm.__cfg.level ) + else + unit_to_harm.experience = unit_to_harm.experience + harmer.__cfg.level + harmer.experience = harmer.experience + unit_to_harm.__cfg.level + end + end + + if kill ~= false and unit_to_harm.hitpoints <= 0 then + wml_actions.kill { id = unit_to_harm.id, animate = toboolean( animate ), fire_event = fire_event } + end + + if animate then + wesnoth.delay(delay) + end + + if variable then + wesnoth.set_variable(string.format("%s[%d]", variable, index - 1), { harm_amount = damage }) + end + + -- both units may no longer be alive at this point, so double check + if experience ~= false and unit_to_harm and unit_to_harm.valid then + unit_to_harm:advance(toboolean(animate), fire_event ~= false) + end + + if experience ~= false and harmer and harmer.valid then + harmer:advance(toboolean(animate), fire_event ~= false) + end + end + + wml_actions.redraw {} + end + + wesnoth.set_variable ( "this_unit" ) -- clearing this_unit + utils.end_var_scope("this_unit", this_unit) +end \ No newline at end of file diff --git a/data/lua/wml/modify_unit.lua b/data/lua/wml/modify_unit.lua new file mode 100644 index 000000000000..3ce4f0363a61 --- /dev/null +++ b/data/lua/wml/modify_unit.lua @@ -0,0 +1,72 @@ + + +function wml_actions.modify_unit(cfg) + local unit_variable = "LUA_modify_unit" + + local function handle_attributes(cfg, unit_path, toplevel) + for current_key, current_value in pairs(helper.shallow_parsed(cfg)) do + if type(current_value) ~= "table" and (not toplevel or current_key ~= "type") then + wesnoth.set_variable(string.format("%s.%s", unit_path, current_key), current_value) + end + end + end + + local function handle_child(cfg, unit_path) + local children_handled = {} + local cfg = helper.shallow_parsed(cfg) + handle_attributes(cfg, unit_path) + + for current_index, current_table in ipairs(cfg) do + local current_tag = current_table[1] + local tag_index = children_handled[current_tag] or 0 + handle_child(current_table[2], string.format("%s.%s[%u]", + unit_path, current_tag, tag_index)) + children_handled[current_tag] = tag_index + 1 + end + end + + local filter = helper.get_child(cfg, "filter") or helper.wml_error "[modify_unit] missing required [filter] tag" + local function handle_unit(unit_num) + local children_handled = {} + local unit_path = string.format("%s[%u]", unit_variable, unit_num) + local this_unit = wesnoth.get_variable(unit_path) + wesnoth.set_variable("this_unit", this_unit) + handle_attributes(cfg, unit_path, true) + + for current_index, current_table in ipairs(helper.shallow_parsed(cfg)) do + local current_tag = current_table[1] + if current_tag == "filter" then + -- nothing + elseif current_tag == "object" or current_tag == "trait" or current_tag == "advancement" then + local unit = wesnoth.get_variable(unit_path) + unit = wesnoth.create_unit(unit) + wesnoth.add_modification(unit, current_tag, current_table[2]) + unit = unit.__cfg; + wesnoth.set_variable(unit_path, unit) + else + local tag_index = children_handled[current_tag] or 0 + handle_child(current_table[2], string.format("%s.%s[%u]", + unit_path, current_tag, tag_index)) + children_handled[current_tag] = tag_index + 1 + end + end + + if cfg.type then + if cfg.type ~= "" then wesnoth.set_variable(unit_path .. ".advances_to", cfg.type) end + wesnoth.set_variable(unit_path .. ".experience", wesnoth.get_variable(unit_path .. ".max_experience")) + end + wml_actions.kill({ id = this_unit.id, animate = false }) + wml_actions.unstore_unit { variable = unit_path } + end + + wml_actions.store_unit { {"filter", filter}, variable = unit_variable } + local max_index = wesnoth.get_variable(unit_variable .. ".length") - 1 + + local this_unit = utils.start_var_scope("this_unit") + for current_unit = 0, max_index do + handle_unit(current_unit) + end + utils.end_var_scope("this_unit", this_unit) + + wesnoth.set_variable(unit_variable) +end \ No newline at end of file diff --git a/data/lua/wml/random_placement.lua b/data/lua/wml/random_placement.lua new file mode 100644 index 000000000000..20f8293f424d --- /dev/null +++ b/data/lua/wml/random_placement.lua @@ -0,0 +1,74 @@ + + +wesnoth.wml_actions.random_placement = function(cfg) + local dist_le = nil + + local parsed = helper.shallow_parsed(cfg) + -- TODO: In most cases this tag is used to place units, so maybe make include_borders=no the default for [filter_location]? + local filter = helper.get_child(parsed, "filter_location") or {} + local command = helper.get_child(parsed, "command") or helper.wml_error("[random_placement] missing required [command] subtag") + local distance = cfg.min_distance or 0 + local num_items = cfg.num_items or helper.wml_error("[random_placement] missing required 'num_items' attribute") + local variable = cfg.variable or helper.wml_error("[random_placement] missing required 'variable' attribute") + local allow_less = cfg.allow_less == true + local variable_previous = utils.start_var_scope(variable) + + if distance < 0 then + -- optimisation for distance = -1 + dist_le = function() return false end + elseif distance == 0 then + -- optimisation for distance = 0 + dist_le = function(x1,y1,x2,y2) return x1 == x2 and y1 == y2 end + else + -- optimisation: cloasure is faster than string lookups. + local math_abs = math.abs + -- same effect as helper.distance_between(x1,y1,x2,y2) <= distance but faster. + dist_le = function(x1,y1,x2,y2) + local d_x = math_abs(x1-x2) + if d_x > distance then + return false + end + if d_x % 2 ~= 0 then + if x1 % 2 == 0 then + y2 = y2 - 0.5 + else + y2 = y2 + 0.5 + end + end + local d_y = math_abs(y1-y2) + return d_x + 2*d_y <= 2*distance + end + end + + local locs = wesnoth.get_locations(filter) + if type(num_items) == "string" then + num_items = math.floor(loadstring("local size = " .. #locs .. "; return " .. num_items)()) + print("num_items=" .. num_items .. ", #locs=" .. #locs) + end + local size = #locs + for i = 1, num_items do + if size == 0 then + if allow_less then + print("placed only " .. i .. " items") + return + else + helper.wml_error("[random_placement] failed to place items. only " .. i .. " items were placed") + end + end + local index = wesnoth.random(size) + local point = locs[index] + wesnoth.set_variable(variable .. ".x", point[1]) + wesnoth.set_variable(variable .. ".y", point[2]) + wesnoth.set_variable(variable .. ".n", i) + for j = size, 1, -1 do + if dist_le(locs[j][1], locs[j][2], point[1], point[2]) then + -- optimisation: swapping elements and storing size in an extra variable is faster than table.remove(locs, j) + locs[j] = locs[size] + size = size - 1 + end + end + wesnoth.wml_actions.command (command) + end + utils.end_var_scope(variable, variable_previous) + +end \ No newline at end of file From 19fe2aa8178a33bd32a911011c0ec9dcd9d90f89 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 18:29:39 -0400 Subject: [PATCH 168/240] using -> typedef in some cases This is because MSVC 2013's using-alias support is buggy --- src/utils/functional.hpp | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/utils/functional.hpp b/src/utils/functional.hpp index c509a26fba5c..10ec58b3bdf1 100644 --- a/src/utils/functional.hpp +++ b/src/utils/functional.hpp @@ -56,37 +56,37 @@ namespace detail { template struct function_base { - using type = Ret(P...); + typedef Ret type(P...); }; template struct function_base { - using type = Ret(P...); + typedef Ret type(P...); }; template struct function_base { - using type = Ret(Class,P...); + typedef Ret type(Class,P...); }; template struct function_base { - using type = Ret(const Class,P...); + typedef Ret type(const Class,P...); }; template struct function_base { - using type = Ret(volatile Class,P...); + typedef Ret type(volatile Class,P...); }; template struct function_base { - using type = Ret(const volatile Class,P...); + typedef Ret type(const volatile Class,P...); }; template struct function_base> { - using type = Ret(P...); + typedef Ret type(P...); }; } From d3374d3670c3327a9f9456fe1aa77fb58627346c Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 20:10:52 -0400 Subject: [PATCH 169/240] WML tags fixup --- data/lua/wml-flow.lua | 4 +++- data/lua/wml/endlevel.lua | 4 ++-- data/lua/wml/find_path.lua | 5 +++-- data/lua/wml/harm_unit.lua | 4 +++- data/lua/wml/modify_unit.lua | 4 +++- data/lua/wml/random_placement.lua | 3 ++- 6 files changed, 16 insertions(+), 8 deletions(-) diff --git a/data/lua/wml-flow.lua b/data/lua/wml-flow.lua index 84e8e45d2ce9..8043129850bd 100644 --- a/data/lua/wml-flow.lua +++ b/data/lua/wml-flow.lua @@ -1,4 +1,6 @@ - +local helper = wesnoth.require "lua/helper.lua" +local utils = wesnoth.require "lua/wml-utils.lua" +local wml_actions = wesnoth.wml_actions function wml_actions.command(cfg) utils.handle_event_commands(cfg, "plain") diff --git a/data/lua/wml/endlevel.lua b/data/lua/wml/endlevel.lua index 5590ccba0932..67cdbbd3a52f 100644 --- a/data/lua/wml/endlevel.lua +++ b/data/lua/wml/endlevel.lua @@ -1,6 +1,6 @@ +local helper = wesnoth.require "lua/helper.lua" - -function wml_actions.endlevel(cfg) +function wesnoth.wml_actions.endlevel(cfg) local parsed = helper.parsed(cfg) if wesnoth.check_end_level_disabled() then wesnoth.message("Repeated [endlevel] execution, ignoring") diff --git a/data/lua/wml/find_path.lua b/data/lua/wml/find_path.lua index 23be65cd0c5e..654597c66159 100644 --- a/data/lua/wml/find_path.lua +++ b/data/lua/wml/find_path.lua @@ -1,6 +1,7 @@ +local helper = wesnoth.require "lua/helper.lua" +local utils = wesnoth.require "lua/wml-utils.lua" - -function wml_actions.find_path(cfg) +function wesnoth.wml_actions.find_path(cfg) local filter_unit = helper.get_child(cfg, "traveler") or helper.wml_error("[find_path] missing required [traveler] tag") -- only the first unit matching local unit = wesnoth.get_units(filter_unit)[1] or helper.wml_error("[find_path]'s filter didn't match any unit") diff --git a/data/lua/wml/harm_unit.lua b/data/lua/wml/harm_unit.lua index e57bfdf2109e..30fbbb47c8e9 100644 --- a/data/lua/wml/harm_unit.lua +++ b/data/lua/wml/harm_unit.lua @@ -1,4 +1,6 @@ - +local helper = wesnoth.require "lua/helper.lua" +local utils = wesnoth.require "lua/wml-utils.lua" +local wml_actions = wesnoth.wml_actions function wml_actions.harm_unit(cfg) local filter = helper.get_child(cfg, "filter") or helper.wml_error("[harm_unit] missing required [filter] tag") diff --git a/data/lua/wml/modify_unit.lua b/data/lua/wml/modify_unit.lua index 3ce4f0363a61..10766719e23a 100644 --- a/data/lua/wml/modify_unit.lua +++ b/data/lua/wml/modify_unit.lua @@ -1,4 +1,6 @@ - +local helper = wesnoth.require "lua/helper.lua" +local utils = wesnoth.require "lua/wml-utils.lua" +local wml_actions = wesnoth.wml_actions function wml_actions.modify_unit(cfg) local unit_variable = "LUA_modify_unit" diff --git a/data/lua/wml/random_placement.lua b/data/lua/wml/random_placement.lua index 20f8293f424d..6f4e1c66642e 100644 --- a/data/lua/wml/random_placement.lua +++ b/data/lua/wml/random_placement.lua @@ -1,4 +1,5 @@ - +local helper = wesnoth.require "lua/helper.lua" +local utils = wesnoth.require "lua/wml-utils.lua" wesnoth.wml_actions.random_placement = function(cfg) local dist_le = nil From a275f22ebee2c91b1a228dd136f42b8893488580 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 20:55:45 -0400 Subject: [PATCH 170/240] Fix potential "image is nil" error in [message] --- data/lua/wml/message.lua | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/lua/wml/message.lua b/data/lua/wml/message.lua index 8f5b3629bca9..d116e3fbf495 100644 --- a/data/lua/wml/message.lua +++ b/data/lua/wml/message.lua @@ -24,6 +24,10 @@ local function get_image(cfg, speaker) image = speaker.portrait end + if image == "none" or image == nil then + return "", true + end + if image:find("~RIGHT%(%)") then left_side = false -- The percent signs escape the parentheses for a literal match @@ -38,10 +42,6 @@ local function get_image(cfg, speaker) image = image:gsub("~LEFT%(%)", "") end - if image == "none" or image == nil then - return "", true - end - return image, left_side end From ff618e7eb3cac51cb723bf221ae577e687c49ae7 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Mon, 4 Apr 2016 22:20:40 -0400 Subject: [PATCH 171/240] Eliminate resources.hpp usage in game_lua_kernel --- src/scripting/game_lua_kernel.cpp | 31 +++++++++++++++---------------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index df050632e97d..83e9e03c5ccc 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -71,7 +71,6 @@ #include "recall_list_manager.hpp" // for recall_list_manager #include "replay.hpp" // for get_user_choice, etc #include "reports.hpp" // for register_generator, etc -#include "resources.hpp" #include "scripting/lua_api.hpp" // for luaW_toboolean, etc #include "scripting/lua_common.hpp" #include "scripting/lua_cpp_function.hpp" @@ -2918,8 +2917,8 @@ int game_lua_kernel::intf_deselect_hex(lua_State*) int game_lua_kernel::intf_is_skipping_messages(lua_State *L) { bool skipping = play_controller_.is_skipping_replay(); - if (!skipping && resources::game_events) { - skipping = resources::game_events->pump().context_skip_messages(); + if (!skipping) { + skipping = game_state_.events_manager_->pump().context_skip_messages(); } lua_pushboolean(L, skipping); return 1; @@ -2935,7 +2934,7 @@ int game_lua_kernel::intf_skip_messages(lua_State *L) if (!lua_isnone(L, 1)) { skip = luaW_toboolean(L, 1); } - resources::game_events->pump().context_skip_messages(skip); + game_state_.events_manager_->pump().context_skip_messages(skip); return 0; } @@ -4047,7 +4046,7 @@ int game_lua_kernel::intf_set_time_of_day(lua_State * L) size_t area_i; if (lua_isstring(L, 2)) { area_id = lua_tostring(L, 1); - std::vector area_ids = resources::tod_manager->get_area_ids(); + std::vector area_ids = tod_man().get_area_ids(); area_i = std::find(area_ids.begin(), area_ids.end(), area_id) - area_ids.begin(); if(area_i >= area_ids.size()) { return luaL_argerror(L, 1, "invalid time area ID"); @@ -4056,8 +4055,8 @@ int game_lua_kernel::intf_set_time_of_day(lua_State * L) int is_num = false; int new_time = lua_tonumberx(L, 1, &is_num) - 1; const std::vector& times = area_id.empty() - ? game_display_->get_tod_man().times() - : game_display_->get_tod_man().times(area_i); + ? tod_man().times() + : tod_man().times(area_i); int num_times = times.size(); if(!is_num) { std::string time_id = luaL_checkstring(L, 1); @@ -4077,9 +4076,9 @@ int game_lua_kernel::intf_set_time_of_day(lua_State * L) } if(area_id.empty()) { - resources::tod_manager->set_current_time(new_time); + tod_man().set_current_time(new_time); } else { - resources::tod_manager->set_current_time(new_time, area_i); + tod_man().set_current_time(new_time, area_i); } return 0; } @@ -4191,11 +4190,11 @@ int game_lua_kernel::intf_teleport(lua_State *L) bool clear_shroud = luaW_toboolean(L, 4); bool animate = luaW_toboolean(L, 5); - if (dst == u->get_location() || !resources::gameboard->map().on_board(dst)) { + if (dst == u->get_location() || !map().on_board(dst)) { return 0; } const map_location vacant_dst = find_vacant_tile(dst, pathfind::VACANT_ANY, check_passability ? u.get() : nullptr); - if (!resources::gameboard->map().on_board(vacant_dst)) { + if (!map().on_board(vacant_dst)) { return 0; } // Clear the destination hex before the move (so the animation can be seen). @@ -4211,10 +4210,10 @@ int game_lua_kernel::intf_teleport(lua_State *L) teleport_path.push_back(vacant_dst); unit_display::move_unit(teleport_path, u, animate); - resources::units->move(src_loc, vacant_dst); + units().move(src_loc, vacant_dst); unit::clear_status_caches(); - u = &*resources::units->find(vacant_dst); + u = &*units().find(vacant_dst); u->anim_comp().set_standing(); if ( clear_shroud ) { @@ -4222,12 +4221,12 @@ int game_lua_kernel::intf_teleport(lua_State *L) clearer.clear_unit(vacant_dst, *u); } - if (resources::gameboard->map().is_village(vacant_dst)) { + if (map().is_village(vacant_dst)) { actions::get_village(vacant_dst, u->side()); } - resources::screen->invalidate_unit_after_move(src_loc, vacant_dst); - resources::screen->draw(); + game_display_->invalidate_unit_after_move(src_loc, vacant_dst); + game_display_->draw(); // Sighted events. clearer.fire_events(); From 5cf12798ce832a270861bdbe02b339599b2cb9c5 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 02:24:42 -0400 Subject: [PATCH 172/240] Port "trivial" WML tags to Lua This is more about adding Lua API for things that should have it than porting WML tags to Lua. The following new Lua API functions have been added to the wesnoth table: - add_fog, remove_fog - add_sound_source, remove_sound_source, get_sound_source - log --- changelog | 7 ++ data/lua/wml-tags.lua | 36 ++++++++ data/lua/wml/message.lua | 5 +- src/game_events/action_wml.cpp | 101 +-------------------- src/game_events/action_wml.hpp | 5 -- src/scripting/game_lua_kernel.cpp | 141 ++++++++++++++++++++++++++++++ src/scripting/game_lua_kernel.hpp | 5 ++ src/soundsource.cpp | 10 +++ src/soundsource.hpp | 1 + src/storyscreen/controller.cpp | 9 +- src/storyscreen/part.cpp | 9 +- 11 files changed, 212 insertions(+), 117 deletions(-) diff --git a/changelog b/changelog index da8f1a9f38cc..f8247708a772 100644 --- a/changelog +++ b/changelog @@ -120,6 +120,13 @@ Version 1.13.4+dev: of the time in the overall schedule (eg, 1 would be dawn in the default schedule). Optional second argument takes a time area ID, to set local instead of global time. + * New wesnoth.add_fog and wesnoth.remove_fog functions allow changing fog + on the map. The [lift_fog] and [clear_fog] tags now use this. + * New wesnoth.add_sound_source, wesnoth.remove_sound_source, and + wesnoth.get_sound_source functions to allow manipulation of sound + sources. The [sound_source] and [remove_sound_source] now use these. + * New wesnoth.log function for printing log messages. The [wml_message] + and [deprecated_message] tags now use this. * WML tables defined in Lua now accept string keys with array values (where "array" is a table whose keys are all integers). This joins the elements of the array with commas and produces a single string diff --git a/data/lua/wml-tags.lua b/data/lua/wml-tags.lua index da547ad42dfb..7a79945c6320 100644 --- a/data/lua/wml-tags.lua +++ b/data/lua/wml-tags.lua @@ -1003,3 +1003,39 @@ wml_actions.teleport = function(cfg) end wesnoth.teleport(unit, cfg.check_passability == false, cfg.clear_shroud ~= false, cfg.animate) end + +function wml_actions.remove_sound_source(cfg) + wesnoth.remove_sound_source(cfg.id) +end + +function wml_actions.sound_source(cfg) + wesnoth.add_sound_source(cfg) +end + +function wml_actions.deprecated_message(cfg) + wesnoth.log('wml', cfg.message) +end + +function wml_actions.wml_message(cfg) + local logger = logger_aliases[cfg.logger] or '' + wesnoth.log(cfg.logger or 'warn', cfg.message. cfg.to_chat) +end + +local function parse_fog_cfg(cfg) + -- Side filter + local ssf = helper.child(cfg, "filter_side") + local sides = wesnoth.get_sides(ssf or {}) + -- Location filter + local locs = wesnoth.get_locations(cfg) + return locs, sides +end + +function wml_actions.lift_fog(cfg) + local locs, sides = parse_fog_cfg(cfg) + wesnoth.remove_fog(sides, locs, not cfg.multiturn) +end + +function wml_actions.reset_fog(cfg) + local locs, sides = parse_fog_cfg(cfg) + wesnoth.add_fog(sides, locs, cfg.reset_view) +end diff --git a/data/lua/wml/message.lua b/data/lua/wml/message.lua index d116e3fbf495..16c36e51847c 100644 --- a/data/lua/wml/message.lua +++ b/data/lua/wml/message.lua @@ -5,10 +5,7 @@ local location_set = wesnoth.require "lua/location_set.lua" local _ = wesnoth.textdomain "wesnoth" local function log(msg, level) - wesnoth.wml_actions.wml_message({ - message = msg, - logger = level, - }) + wesnoth.log(level, msg, true) end local function get_image(cfg, speaker) diff --git a/src/game_events/action_wml.cpp b/src/game_events/action_wml.cpp index 2693b072cf36..54eeb1153cb9 100644 --- a/src/game_events/action_wml.cpp +++ b/src/game_events/action_wml.cpp @@ -205,71 +205,8 @@ namespace { // Support functions } return path; } - - /** - * Implements the lifting and resetting of fog via WML. - * Keeping affect_normal_fog as false causes only the fog override to be affected. - * Otherwise, fog lifting will be implemented similar to normal sight (cannot be - * individually reset and ends at the end of the turn), and fog resetting will, in - * addition to removing overrides, extend the specified teams' normal fog to all - * hexes. - */ - void toggle_fog(const bool clear, const vconfig& cfg, const bool affect_normal_fog=false) - { - // Filter the sides. - const vconfig &ssf = cfg.child("filter_side"); - const side_filter s_filter(ssf.null() ? vconfig::empty_vconfig() : ssf, resources::filter_con); - const std::vector sides = s_filter.get_teams(); - - // Filter the locations. - std::set locs; - const terrain_filter t_filter(cfg, resources::filter_con); - t_filter.get_locations(locs, true); - - // Loop through sides. - for (const int &side_num : sides) - { - team &t = (*resources::teams)[side_num-1]; - if ( !clear ) - { - // Extend fog. - t.remove_fog_override(locs); - if ( affect_normal_fog ) - t.refog(); - } - else if ( !affect_normal_fog ) - // Force the locations clear of fog. - t.add_fog_override(locs); - else - // Simply clear fog from the locations. - for (const map_location &hex : locs) { - t.clear_fog(hex); - } - } - - // Flag a screen update. - resources::screen->recalculate_minimap(); - resources::screen->invalidate_all(); - } } // end anonymous namespace (support functions) -void handle_deprecated_message(const config& cfg) -{ - // Note: no need to translate the string, since only used for deprecated things. - const std::string& message = cfg["message"]; - lg::wml_error() << message << '\n'; -} - -void handle_wml_log_message(const config& cfg) -{ - const std::string& logger = cfg["logger"]; - const std::string& msg = cfg["message"]; - bool in_chat = cfg["to_chat"].to_bool(true); - - resources::game_events->pump().put_wml_message(logger,msg,in_chat); -} - - /** * Using this constructor for a static object outside action_wml.cpp * will likely lead to a static initialization fiasco. @@ -324,11 +261,6 @@ WML_HANDLER_FUNCTION(clear_global_variable,,pcfg) verify_and_clear_global_variable(pcfg); } -WML_HANDLER_FUNCTION(deprecated_message,, cfg) -{ - handle_deprecated_message( cfg.get_parsed_config() ); -} - static void on_replay_error(const std::string& message, bool /*b*/) { ERR_NG << "Error via [do_command]:" << std::endl; @@ -385,11 +317,6 @@ WML_HANDLER_FUNCTION(get_global_variable,,pcfg) verify_and_get_global_variable(pcfg); } -WML_HANDLER_FUNCTION(lift_fog,, cfg) -{ - toggle_fog(true, cfg, !cfg["multiturn"].to_bool(false)); -} - WML_HANDLER_FUNCTION(modify_turns,, cfg) { config::attribute_value value = cfg["value"]; @@ -573,10 +500,6 @@ WML_HANDLER_FUNCTION(recall,, cfg) LOG_WML << "A [recall] tag with the following content failed:\n" << cfg.get_config().debug(); } -WML_HANDLER_FUNCTION(remove_sound_source,, cfg) -{ - resources::soundsources->remove(cfg["id"]); -} namespace { struct map_choice : public mp_sync::user_choice { @@ -616,6 +539,7 @@ namespace { }; } + /// Experimental map replace /// @todo Finish experimenting. WML_HANDLER_FUNCTION(replace_map,, cfg) @@ -676,11 +600,6 @@ WML_HANDLER_FUNCTION(replace_map,, cfg) ai::manager::raise_map_changed(); } -WML_HANDLER_FUNCTION(reset_fog,, cfg) -{ - toggle_fog(false, cfg, cfg["reset_view"].to_bool(false)); -} - /// Experimental data persistence /// @todo Finish experimenting. WML_HANDLER_FUNCTION(set_global_variable,,pcfg) @@ -1029,19 +948,6 @@ WML_HANDLER_FUNCTION(set_variables,, cfg) } } -WML_HANDLER_FUNCTION(sound_source,, cfg) -{ - config parsed = cfg.get_parsed_config(); - try { - soundsource::sourcespec spec(parsed); - resources::soundsources->add(spec); - } catch (bad_lexical_cast &) { - ERR_NG << "Error when parsing sound_source config: bad lexical cast." << std::endl; - ERR_NG << "sound_source config was: " << parsed.debug() << std::endl; - ERR_NG << "Skipping this sound source..." << std::endl; - } -} - /// Store the relative direction from one hex to another in a WML variable. /// This is mainly useful as a diagnostic tool, but could be useful /// for some kind of scenario. @@ -1274,11 +1180,6 @@ WML_HANDLER_FUNCTION(volume,, cfg) } -WML_HANDLER_FUNCTION(wml_message,, cfg) -{ - handle_wml_log_message( cfg.get_parsed_config() ); -} - WML_HANDLER_FUNCTION(on_undo,, cfg) { if(cfg["delayed_variable_substitution"].to_bool(false)) { diff --git a/src/game_events/action_wml.hpp b/src/game_events/action_wml.hpp index 09834a8e1c27..717f3a894fe5 100644 --- a/src/game_events/action_wml.hpp +++ b/src/game_events/action_wml.hpp @@ -72,11 +72,6 @@ namespace game_events */ void change_terrain(const map_location &loc, const t_translation::t_terrain &t, terrain_type_data::tmerge_mode mode, bool replace_if_failed); - - /** Used for [deprecated_message]. */ - void handle_deprecated_message(const config& cfg); - /** Used for [wml_message]. */ - void handle_wml_log_message(const config& cfg); } #endif // GAME_EVENTS_ACTION_WML_H_INCLUDED diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 83e9e03c5ccc..f8230f4b69b7 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -85,6 +85,7 @@ #include "sdl/utils.hpp" // for surface #include "side_filter.hpp" // for side_filter #include "sound.hpp" // for commit_music_changes, etc +#include "soundsource.hpp" #include "synced_context.hpp" // for synced_context, etc #include "synced_user_choice.hpp" #include "team.hpp" // for team, village_owner @@ -121,6 +122,7 @@ #include // for set #include // for operator<<, basic_ostream, etc #include // for pair +#include #include // for vector, etc #include // for SDL_GetTicks #include // for SDL_Color, SDL_Surface @@ -4233,6 +4235,139 @@ int game_lua_kernel::intf_teleport(lua_State *L) return 0; } +/** + * Removes a sound source by its ID + * Arg 1: sound source ID + */ +int game_lua_kernel::intf_remove_sound_source(lua_State *L) +{ + soundsource::manager* man = play_controller_.get_soundsource_man(); + std::string id = luaL_checkstring(L, 1); + man->remove(id); + return 0; +} + +/** + * Add a new sound source + * Arg 1: Table containing keyword arguments + */ +int game_lua_kernel::intf_add_sound_source(lua_State *L) +{ + soundsource::manager* man = play_controller_.get_soundsource_man(); + config cfg = luaW_checkconfig(L, 1); + try { + soundsource::sourcespec spec(cfg); + man->add(spec); + } catch (bad_lexical_cast &) { + ERR_LUA << "Error when parsing sound_source config: invalid parameter." << std::endl; + ERR_LUA << "sound_source config was: " << cfg.debug() << std::endl; + ERR_LUA << "Skipping this sound source..." << std::endl; + } + return 0; +} + +/** + * Get an existing sound source + * Arg 1: The sound source ID + * Return: Config of sound source info, or nil if it didn't exist + * This is a copy of the sound source info, so you need to call + * add_sound_source again after changing it. + */ +int game_lua_kernel::intf_get_sound_source(lua_State *L) +{ + soundsource::manager* man = play_controller_.get_soundsource_man(); + std::string id = luaL_checkstring(L, 1); + config cfg = man->get(id); + if(cfg.empty()) { + return 0; + } + // Sound sources do not know their own string ID + // Thus, we need to add this manually + cfg["id"] = id; + luaW_pushconfig(L, cfg); + return 1; +} + +/** + * Logs a message + * Arg 1: (optional) Logger; "wml" for WML errors or deprecations + * Arg 2: Message + * Arg 3: Whether to print to chat (always true if arg 1 is "wml") + */ +int game_lua_kernel::intf_log(lua_State *L) +{ + const std::string& logger = lua_isstring(L, 2) ? luaL_checkstring(L, 1) : ""; + const std::string& msg = lua_isstring(L, 2) ? luaL_checkstring(L, 2) : luaL_checkstring(L, 1); + + if(logger == "wml" || logger == "WML") { + lg::wml_error() << msg << '\n'; + } else { + bool in_chat = luaW_toboolean(L, -1); + game_state_.events_manager_->pump().put_wml_message(logger,msg,in_chat); + } + return 0; +} + +/** + * Implements the lifting and resetting of fog via WML. + * Keeping affect_normal_fog as false causes only the fog override to be affected. + * Otherwise, fog lifting will be implemented similar to normal sight (cannot be + * individually reset and ends at the end of the turn), and fog resetting will, in + * addition to removing overrides, extend the specified teams' normal fog to all + * hexes. + * + * Arg 1: (optional) Side number, or list of side numbers + * Arg 2: List of locations; each is a two-element array or a table with x and y keys + * Arg 3: (optional) boolean + */ +int game_lua_kernel::intf_toggle_fog(lua_State *L, const bool clear) +{ + bool affect_normal_fog = false; + if(lua_isboolean(L, -1)) { + affect_normal_fog = luaW_toboolean(L, -1); + } + std::set sides; + if(lua_isnumber(L, 1)) { + sides.insert(lua_tonumber(L, 1)); + } else if(lua_istable(L, 2)) { + const auto& v = lua_check>(L, 1); + sides.insert(v.begin(), v.end()); + } else { + for(const team& t : teams()) { + sides.insert(t.side()+1); + } + } + const auto& v_locs = lua_check>(L, lua_istable(L, 2) ? 2 : 1); + std::set locs(v_locs.begin(), v_locs.end()); + + for(const int &side_num : sides) { + if(side_num < 1 || static_cast(side_num) > teams().size()) { + continue; + } + team &t = teams()[side_num-1]; + if(!clear) { + // Extend fog. + t.remove_fog_override(locs); + if(affect_normal_fog) { + t.refog(); + } + } else if(!affect_normal_fog) { + // Force the locations clear of fog. + t.add_fog_override(locs); + } else { + // Simply clear fog from the locations. + for(const map_location &hex : locs) { + t.clear_fog(hex); + } + } + } + + // Flag a screen update. + game_display_->recalculate_minimap(); + game_display_->invalidate_all(); + return 0; +} + // END CALLBACK IMPLEMENTATION game_board & game_lua_kernel::board() { @@ -4325,8 +4460,10 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "unit_resistance", &intf_unit_resistance }, { "unsynced", &intf_do_unsynced }, { "add_event_handler", &dispatch<&game_lua_kernel::intf_add_event > }, + { "add_fog", &dispatch2<&game_lua_kernel::intf_toggle_fog, true > }, { "add_tile_overlay", &dispatch<&game_lua_kernel::intf_add_tile_overlay > }, { "add_time_area", &dispatch<&game_lua_kernel::intf_add_time_area > }, + { "add_sound_source", &dispatch<&game_lua_kernel::intf_add_sound_source > }, { "allow_end_turn", &dispatch<&game_lua_kernel::intf_allow_end_turn > }, { "allow_undo", &dispatch<&game_lua_kernel::intf_allow_undo > }, { "animate_unit", &dispatch<&game_lua_kernel::intf_animate_unit > }, @@ -4354,6 +4491,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "get_recall_units", &dispatch<&game_lua_kernel::intf_get_recall_units > }, { "get_selected_tile", &dispatch<&game_lua_kernel::intf_get_selected_tile > }, { "get_sides", &dispatch<&game_lua_kernel::intf_get_sides > }, + { "get_sound_source", &dispatch<&game_lua_kernel::intf_get_sound_source > }, { "get_starting_location", &dispatch<&game_lua_kernel::intf_get_starting_location > }, { "get_terrain", &dispatch<&game_lua_kernel::intf_get_terrain > }, { "get_terrain_info", &dispatch<&game_lua_kernel::intf_get_terrain_info > }, @@ -4371,6 +4509,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "kill", &dispatch<&game_lua_kernel::intf_kill > }, { "label", &dispatch<&game_lua_kernel::intf_label > }, { "lock_view", &dispatch<&game_lua_kernel::intf_lock_view > }, + { "log", &dispatch<&game_lua_kernel::intf_log > }, { "match_location", &dispatch<&game_lua_kernel::intf_match_location > }, { "match_side", &dispatch<&game_lua_kernel::intf_match_side > }, { "match_unit", &dispatch<&game_lua_kernel::intf_match_unit > }, @@ -4385,8 +4524,10 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "random", &dispatch<&game_lua_kernel::intf_random > }, { "redraw", &dispatch<&game_lua_kernel::intf_redraw > }, { "remove_event_handler", &dispatch<&game_lua_kernel::intf_remove_event > }, + { "remove_fog", &dispatch2<&game_lua_kernel::intf_toggle_fog, false > }, { "remove_tile_overlay", &dispatch<&game_lua_kernel::intf_remove_tile_overlay > }, { "remove_time_area", &dispatch<&game_lua_kernel::intf_remove_time_area > }, + { "remove_sound_source", &dispatch<&game_lua_kernel::intf_remove_sound_source > }, { "replace_schedule", &dispatch<&game_lua_kernel::intf_replace_schedule > }, { "scroll", &dispatch<&game_lua_kernel::intf_scroll > }, { "scroll_to_tile", &dispatch<&game_lua_kernel::intf_scroll_to_tile > }, diff --git a/src/scripting/game_lua_kernel.hpp b/src/scripting/game_lua_kernel.hpp index 8d13b1a124ca..ebf599e5af91 100644 --- a/src/scripting/game_lua_kernel.hpp +++ b/src/scripting/game_lua_kernel.hpp @@ -164,6 +164,11 @@ class game_lua_kernel : public lua_kernel_base int intf_fire_event(lua_State *L); int intf_fire_wml_menu_item(lua_State *L); int intf_teleport(lua_State *L); + int intf_remove_sound_source(lua_State *L); + int intf_add_sound_source(lua_State *L); + int intf_get_sound_source(lua_State *L); + int intf_log(lua_State *L); + int intf_toggle_fog(lua_State *L, const bool clear); //private helpers std::string synced_state(); diff --git a/src/soundsource.cpp b/src/soundsource.cpp index d3d3e08ac44f..d8cbe1cb7c65 100644 --- a/src/soundsource.cpp +++ b/src/soundsource.cpp @@ -67,6 +67,16 @@ void manager::add(const sourcespec &spec) } } +config manager::get(const std::string &id) +{ + config cfg; + positional_source_iterator it = sources_.find(id); + if(it != sources_.end()) { + it->second->write_config(cfg); + } + return cfg; +} + void manager::remove(const std::string &id) { positional_source_iterator it; diff --git a/src/soundsource.hpp b/src/soundsource.hpp index 4127104d14b4..6f7a472a9e1c 100644 --- a/src/soundsource.hpp +++ b/src/soundsource.hpp @@ -93,6 +93,7 @@ class manager : public events::observer, public savegame::savegame_config { // add or replace a soundsource void add(const sourcespec &source); void remove(const std::string &id); + config get(const std::string &id); void update(); // checks which sound sources are visible diff --git a/src/storyscreen/controller.cpp b/src/storyscreen/controller.cpp index 49bb615e0c63..56b88bbf815b 100644 --- a/src/storyscreen/controller.cpp +++ b/src/storyscreen/controller.cpp @@ -26,8 +26,9 @@ #include "asserts.hpp" #include "variable.hpp" -#include "game_events/action_wml.hpp" #include "game_events/conditional_wml.hpp" +#include "game_events/manager.hpp" +#include "game_events/pump.hpp" #include "game_data.hpp" #include "gettext.hpp" #include "intro.hpp" @@ -129,13 +130,13 @@ void controller::resolve_wml(const vconfig& cfg) // [deprecated_message] else if(key == "deprecated_message") { // Won't appear until the scenario start event finishes. - game_events::handle_deprecated_message(node.get_parsed_config()); + lg::wml_error() << node["message"] << '\n'; } // [wml_message] else if(key == "wml_message") { - // Pass to game events handler. As with [deprecated_message], + // As with [deprecated_message], // it won't appear until the scenario start event is complete. - game_events::handle_wml_log_message(node.get_parsed_config()); + resources::game_events->pump().put_wml_message(node["logger"],node["message"],node["in_chat"]); } } } diff --git a/src/storyscreen/part.cpp b/src/storyscreen/part.cpp index ce292bacb85a..6dc4c974dc34 100644 --- a/src/storyscreen/part.cpp +++ b/src/storyscreen/part.cpp @@ -25,8 +25,9 @@ #include "config.hpp" #include "game_data.hpp" -#include "game_events/action_wml.hpp" #include "game_events/conditional_wml.hpp" +#include "game_events/manager.hpp" +#include "game_events/pump.hpp" #include "image.hpp" #include "serialization/string_utils.hpp" #include "util.hpp" @@ -349,13 +350,13 @@ void part::resolve_wml(const vconfig &cfg) // [deprecated_message] else if(key == "deprecated_message") { // Won't appear until the scenario start event finishes. - game_events::handle_deprecated_message(node.get_parsed_config()); + lg::wml_error() << node["message"] << '\n'; } // [wml_message] else if(key == "wml_message") { - // Pass to game events handler. As with [deprecated_message], + // As with [deprecated_message], // it won't appear until the scenario start event is complete. - game_events::handle_wml_log_message(node.get_parsed_config()); + resources::game_events->pump().put_wml_message(node["logger"],node["message"],node["in_chat"]); } } } From ce7cd0191a811a12c84f18debc7c1f2300e80ec1 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 02:42:09 -0400 Subject: [PATCH 173/240] Attempt to fix Travis build --- src/gui/dialogs/addon/description.cpp | 2 ++ src/gui/dialogs/lua_interpreter.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/gui/dialogs/addon/description.cpp b/src/gui/dialogs/addon/description.cpp index 15792bb740cb..f62282c99382 100644 --- a/src/gui/dialogs/addon/description.cpp +++ b/src/gui/dialogs/addon/description.cpp @@ -31,6 +31,8 @@ #include "utils/functional.hpp" +#include + namespace { std::string format_addon_time(time_t time) diff --git a/src/gui/dialogs/lua_interpreter.cpp b/src/gui/dialogs/lua_interpreter.cpp index 39cb0dbbdc2f..f48fa4b06cc3 100644 --- a/src/gui/dialogs/lua_interpreter.cpp +++ b/src/gui/dialogs/lua_interpreter.cpp @@ -321,7 +321,7 @@ class tlua_interpreter::input_model { #ifdef HAVE_HISTORY // Do history expansions char * cmd_cstr = new char [cmd.length()+1]; - std::strcpy (cmd_cstr, cmd.c_str()); + strcpy (cmd_cstr, cmd.c_str()); char * expansion; From 71b154b6e300aa3e6d2f1e0af20960d6dd5b2d3a Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Tue, 5 Apr 2016 18:10:44 +1100 Subject: [PATCH 174/240] Refactored out savegame::savegame_config class This was basically an unnecessary stub class. It also allows us to remove the unused soundsource::manager::to_config() function (write_sourcespecs() did the actual job). --- projectfiles/CodeBlocks/wesnoth.cbp | 1 - src/game_classification.cpp | 3 --- src/game_classification.hpp | 4 ++-- src/mp_game_settings.cpp | 4 +--- src/mp_game_settings.hpp | 3 +-- src/pathfind/teleport.hpp | 8 ++++---- src/play_controller.cpp | 1 - src/play_controller.hpp | 2 +- src/savegame_config.hpp | 31 ----------------------------- src/soundsource.cpp | 8 -------- src/soundsource.hpp | 6 ++---- src/team.cpp | 1 - src/team.hpp | 3 +-- src/tod_manager.cpp | 1 - src/tod_manager.hpp | 3 +-- 15 files changed, 13 insertions(+), 66 deletions(-) delete mode 100644 src/savegame_config.hpp diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index 804b86401c12..df0347a4a959 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -894,7 +894,6 @@ - diff --git a/src/game_classification.cpp b/src/game_classification.cpp index 2f220f93a189..a2aefa411fc2 100644 --- a/src/game_classification.cpp +++ b/src/game_classification.cpp @@ -30,7 +30,6 @@ static lg::log_domain log_engine("engine"); const std::string DEFAULT_DIFFICULTY("NORMAL"); game_classification::game_classification(): - savegame_config(), label(), version(), campaign_type(), @@ -50,7 +49,6 @@ game_classification::game_classification(): {} game_classification::game_classification(const config& cfg): - savegame_config(), label(cfg["label"]), version(cfg["version"]), campaign_type(cfg["campaign_type"].to_enum(game_classification::CAMPAIGN_TYPE::SCENARIO)), @@ -70,7 +68,6 @@ game_classification::game_classification(const config& cfg): {} game_classification::game_classification(const game_classification& gc): - savegame_config(), label(gc.label), version(gc.version), campaign_type(gc.campaign_type), diff --git a/src/game_classification.hpp b/src/game_classification.hpp index 8a8d5cdcb874..6e5522513e63 100644 --- a/src/game_classification.hpp +++ b/src/game_classification.hpp @@ -16,7 +16,7 @@ #define GAME_CLASSIFICATION_HPP_INCLUDED #include "utils/make_enum.hpp" -#include "savegame_config.hpp" + #include class config; @@ -25,7 +25,7 @@ class config; extern const std::string DEFAULT_DIFFICULTY; //meta information of the game -class game_classification : public savegame::savegame_config +class game_classification { public: game_classification(); diff --git a/src/mp_game_settings.cpp b/src/mp_game_settings.cpp index 63932a45d7ec..c42781625bad 100644 --- a/src/mp_game_settings.cpp +++ b/src/mp_game_settings.cpp @@ -29,7 +29,6 @@ static lg::log_domain log_engine("engine"); #define DBG_NG LOG_STREAM(debug, log_engine) mp_game_settings::mp_game_settings() : - savegame_config(), name(), password(), hash(), @@ -62,8 +61,7 @@ mp_game_settings::mp_game_settings() : {} mp_game_settings::mp_game_settings(const config& cfg) - : savegame_config() - , name(cfg["scenario"].str()) + : name(cfg["scenario"].str()) , password() , hash(cfg["hash"].str()) , mp_era(cfg["mp_era"].str()) diff --git a/src/mp_game_settings.hpp b/src/mp_game_settings.hpp index 4b6a84cea1d1..ac29c93fc4f9 100644 --- a/src/mp_game_settings.hpp +++ b/src/mp_game_settings.hpp @@ -20,12 +20,11 @@ #include "config.hpp" #include "gettext.hpp" #include "utils/make_enum.hpp" -#include "savegame_config.hpp" #include "version.hpp" #include -struct mp_game_settings : public savegame::savegame_config +struct mp_game_settings { mp_game_settings(); mp_game_settings(const config& cfg); diff --git a/src/pathfind/teleport.hpp b/src/pathfind/teleport.hpp index 1241324a40d5..efca976b85c2 100644 --- a/src/pathfind/teleport.hpp +++ b/src/pathfind/teleport.hpp @@ -16,8 +16,6 @@ #include "config.hpp" #include "map/location.hpp" -#include "savegame_config.hpp" - class team; class unit; @@ -32,7 +30,8 @@ typedef std::pair, std::set > /* * Represents the tunnel wml tag. */ -class teleport_group: public savegame::savegame_config { +class teleport_group +{ public: /* * Constructs the object from a saved file. @@ -141,7 +140,8 @@ class teleport_map { const teleport_map get_teleport_locations(const unit &u, const team &viewing_team, bool see_all = false, bool ignore_units = false); -class manager: public savegame::savegame_config { +class manager +{ public: manager(const config &cfg); diff --git a/src/play_controller.cpp b/src/play_controller.cpp index d231d0b9b956..58e35c82b3a5 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -149,7 +149,6 @@ play_controller::play_controller(const config& level, saved_game& state_of_game, CVideo& video, bool skip_replay) : controller_base(game_config, video) , observer() - , savegame_config() , quit_confirmation() , ticks_(SDL_GetTicks()) , tdata_(tdata) diff --git a/src/play_controller.hpp b/src/play_controller.hpp index 1778a834a0bb..894e2373efa1 100644 --- a/src/play_controller.hpp +++ b/src/play_controller.hpp @@ -76,7 +76,7 @@ namespace wb { // Holds gamestate related objects class game_state; -class play_controller : public controller_base, public events::observer, public savegame::savegame_config, quit_confirmation +class play_controller : public controller_base, public events::observer, public quit_confirmation { public: play_controller(const config& level, saved_game& state_of_game, diff --git a/src/savegame_config.hpp b/src/savegame_config.hpp deleted file mode 100644 index 08352838cc79..000000000000 --- a/src/savegame_config.hpp +++ /dev/null @@ -1,31 +0,0 @@ -/* - Copyright (C) 2009 - 2016 by Eugen Jiresch - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -#ifndef SAVEGAME_CONFIG_HPP_INCLUDED -#define SAVEGAME_CONFIG_HPP_INCLUDED - -/* interface for building a config from savegame related objects */ -class config; - -namespace savegame { - -class savegame_config -{ -public: - virtual ~savegame_config() {} - virtual config to_config() const = 0; -}; - -} -#endif diff --git a/src/soundsource.cpp b/src/soundsource.cpp index d8cbe1cb7c65..64f42783bffd 100644 --- a/src/soundsource.cpp +++ b/src/soundsource.cpp @@ -32,7 +32,6 @@ unsigned int positional_source::last_id = 0; manager::manager(const display &disp) : observer(), - savegame_config(), sources_(), disp_(disp) { @@ -118,13 +117,6 @@ void manager::write_sourcespecs(config& cfg) const } } -config manager::to_config() const -{ - config cfg; - write_sourcespecs(cfg); - return cfg.child("sound_source"); -} - positional_source::positional_source(const sourcespec &spec) : last_played_(0), min_delay_(spec.minimum_delay()), diff --git a/src/soundsource.hpp b/src/soundsource.hpp index 6f7a472a9e1c..481f88aa3b5f 100644 --- a/src/soundsource.hpp +++ b/src/soundsource.hpp @@ -18,7 +18,6 @@ #include "generic_event.hpp" #include "map/location.hpp" -#include "savegame_config.hpp" class config; class display; @@ -74,7 +73,8 @@ class positional_source { void write_config(config& cfg) const; }; -class manager : public events::observer, public savegame::savegame_config { +class manager : public events::observer +{ typedef std::map positional_source_map; typedef positional_source_map::iterator positional_source_iterator; @@ -104,8 +104,6 @@ class manager : public events::observer, public savegame::savegame_config { * "sound_source", appended to existing content. */ void write_sourcespecs(config& cfg) const; - - config to_config() const; }; /** diff --git a/src/team.cpp b/src/team.cpp index db094951ba06..b48339ccb68b 100644 --- a/src/team.cpp +++ b/src/team.cpp @@ -276,7 +276,6 @@ void team::team_info::write(config& cfg) const } team::team() : - savegame_config(), gold_(0), villages_(), shroud_(), diff --git a/src/team.hpp b/src/team.hpp index c7d2e76572fd..6ef422f8a483 100644 --- a/src/team.hpp +++ b/src/team.hpp @@ -19,7 +19,6 @@ #include "utils/make_enum.hpp" #include "map/location.hpp" #include "recall_list_manager.hpp" -#include "savegame_config.hpp" #include "units/ptr.hpp" #include "util.hpp" #include "config.hpp" @@ -48,7 +47,7 @@ namespace wb { * This class stores all the data for a single 'side' (in game nomenclature). * E.g., there is only one leader unit per team. */ -class team : public savegame::savegame_config +class team { public: diff --git a/src/tod_manager.cpp b/src/tod_manager.cpp index 7582bee2f807..8a09002900de 100644 --- a/src/tod_manager.cpp +++ b/src/tod_manager.cpp @@ -37,7 +37,6 @@ static lg::log_domain log_engine("engine"); #define LOG_NG LOG_STREAM(info, log_engine) tod_manager::tod_manager(const config& scenario_cfg): - savegame_config(), currentTime_(0), times_(), areas_(), diff --git a/src/tod_manager.hpp b/src/tod_manager.hpp index eb3a6485869e..8fe7d145a77a 100644 --- a/src/tod_manager.hpp +++ b/src/tod_manager.hpp @@ -17,7 +17,6 @@ #include "map/location.hpp" #include "config.hpp" #include "time_of_day.hpp" -#include "savegame_config.hpp" #include @@ -31,7 +30,7 @@ namespace random_new } //time of day and turn functionality -class tod_manager : public savegame::savegame_config +class tod_manager { public: explicit tod_manager(const config& scenario_cfg = config()); From 7ee37b6f84d1ccbb13253b991a1719864c304145 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 03:19:26 -0400 Subject: [PATCH 175/240] Attempt to fix Travis build --- data/lua/wml-tags.lua | 4 ++-- src/gui/dialogs/addon/list.cpp | 1 + 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/data/lua/wml-tags.lua b/data/lua/wml-tags.lua index 7a79945c6320..32f53c5316bc 100644 --- a/data/lua/wml-tags.lua +++ b/data/lua/wml-tags.lua @@ -1017,8 +1017,8 @@ function wml_actions.deprecated_message(cfg) end function wml_actions.wml_message(cfg) - local logger = logger_aliases[cfg.logger] or '' - wesnoth.log(cfg.logger or 'warn', cfg.message. cfg.to_chat) + local logger = cfg.logger or '' + wesnoth.log(cfg.logger, cfg.message. cfg.to_chat) end local function parse_fog_cfg(cfg) diff --git a/src/gui/dialogs/addon/list.cpp b/src/gui/dialogs/addon/list.cpp index e27328ed18a5..269c2df3716b 100644 --- a/src/gui/dialogs/addon/list.cpp +++ b/src/gui/dialogs/addon/list.cpp @@ -52,6 +52,7 @@ #include "utils/functional.hpp" #include +#include namespace gui2 { From e1534f068659bf134888d470ebf44518da79e35f Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 03:21:51 -0400 Subject: [PATCH 176/240] Update XCode project --- projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj | 2 -- 1 file changed, 2 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 878044c3dfae..3ba884ad8a82 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -2119,7 +2119,6 @@ B5951A831013BB0800C10B66 /* multiplayer_error_codes.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = multiplayer_error_codes.hpp; sourceTree = ""; }; B5951A841013BB0800C10B66 /* resources.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = resources.cpp; sourceTree = ""; }; B5951A851013BB0800C10B66 /* resources.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = resources.hpp; sourceTree = ""; }; - B5951A871013BB0800C10B66 /* savegame_config.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = savegame_config.hpp; sourceTree = ""; }; B5951A931013BB3400C10B66 /* game_delete.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = game_delete.cpp; sourceTree = ""; }; B5951A941013BB3400C10B66 /* game_delete.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = game_delete.hpp; sourceTree = ""; }; B5951A971013BB5A00C10B66 /* callable_objects.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = callable_objects.cpp; sourceTree = ""; }; @@ -3033,7 +3032,6 @@ ECD39892194B830300CF2125 /* saved_game.hpp */, B52EE8C2121359A600CFBDAB /* savegame.cpp */, B52EE8C3121359A600CFBDAB /* savegame.hpp */, - B5951A871013BB0800C10B66 /* savegame_config.hpp */, B55999B50EC62181008DD061 /* scoped_resource.hpp */, B597EC060FC0832B00CE81F5 /* scripting */, 91B621A61B76A7CD00B00E0F /* sdl */, From 73739a1989f0e92d880904330f80c4fd04f1f589 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 10:08:14 -0400 Subject: [PATCH 177/240] Attempt to fix Travis build... again --- data/lua/wml-tags.lua | 4 ++-- src/whiteboard/manager.cpp | 2 +- src/whiteboard/utility.cpp | 6 ++++-- src/whiteboard/utility.hpp | 2 +- 4 files changed, 8 insertions(+), 6 deletions(-) diff --git a/data/lua/wml-tags.lua b/data/lua/wml-tags.lua index 32f53c5316bc..9f62a19c502a 100644 --- a/data/lua/wml-tags.lua +++ b/data/lua/wml-tags.lua @@ -308,7 +308,7 @@ function wml_actions.test_condition(cfg) if tag == "variable" then explanation = string.format("%s\n\tNote: The variable %s currently has the value %q.", explanation, this_cfg.name, tostring(wesnoth.get_variable(this_cfg.name))) end - wesnoth.wml_actions.wml_message{message = explanation, logger = logger} + wesnoth.log(logger, explanation, true) return true end end @@ -1018,7 +1018,7 @@ end function wml_actions.wml_message(cfg) local logger = cfg.logger or '' - wesnoth.log(cfg.logger, cfg.message. cfg.to_chat) + wesnoth.log(cfg.logger, cfg.message, cfg.to_chat) end local function parse_fog_cfg(cfg) diff --git a/src/whiteboard/manager.cpp b/src/whiteboard/manager.cpp index 7d312aaf7181..962560b9e585 100644 --- a/src/whiteboard/manager.cpp +++ b/src/whiteboard/manager.cpp @@ -480,7 +480,7 @@ namespace public: move_owners_finder(): move_owners_() { } - void operator()(action_ptr action) { + void operator()(action* action) { action->accept(*this); } diff --git a/src/whiteboard/utility.cpp b/src/whiteboard/utility.cpp index 30517e88d67a..5096ef0dd746 100644 --- a/src/whiteboard/utility.cpp +++ b/src/whiteboard/utility.cpp @@ -165,7 +165,7 @@ bool team_has_visible_plan(team &t) return !t.get_side_actions()->hidden(); } -void for_each_action(std::function function, team_filter team_filter) +void for_each_action(std::function function, team_filter team_filter) { bool end = false; for(size_t turn=0; !end; ++turn) { @@ -173,7 +173,9 @@ void for_each_action(std::function function, team_filter team_ for(team &side : *resources::teams) { side_actions &actions = *side.get_side_actions(); if(turn < actions.num_turns() && team_filter(side)) { - std::for_each(actions.turn_begin(turn), actions.turn_end(turn), function); + for(auto iter = actions.turn_begin(turn); iter != actions.turn_end(turn); ++iter) { + function(iter->get()); + } end = false; } } diff --git a/src/whiteboard/utility.hpp b/src/whiteboard/utility.hpp index 5c14eb39f180..ffa4ef24d415 100644 --- a/src/whiteboard/utility.hpp +++ b/src/whiteboard/utility.hpp @@ -126,7 +126,7 @@ bool team_has_visible_plan(team&); * @param function the function to execute. * @param team_filter select whether a team is visited (default to @ref team_has_visible_plan). */ -void for_each_action(std::function function, +void for_each_action(std::function function, team_filter team_filter = team_has_visible_plan); /** From b7b8b1e213d1a176ad685d5205538639a127d679 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Wed, 6 Apr 2016 01:24:00 +1100 Subject: [PATCH 178/240] tcustom_tod: cleaned up code and unused related preference keys --- data/gui/window/custom_tod.cfg | 796 ++++++++++---------- src/editor/controller/editor_controller.cpp | 1 - src/editor/editor_preferences.cpp | 45 -- src/editor/editor_preferences.hpp | 15 - src/gui/dialogs/editor/custom_tod.cpp | 179 ++--- src/gui/dialogs/editor/custom_tod.hpp | 14 +- 6 files changed, 484 insertions(+), 566 deletions(-) diff --git a/data/gui/window/custom_tod.cfg b/data/gui/window/custom_tod.cfg index 74ec70884130..9951809a6b55 100644 --- a/data/gui/window/custom_tod.cfg +++ b/data/gui/window/custom_tod.cfg @@ -4,398 +4,406 @@ ### [window] - id = "custom_tod" - description = "Custom ToD schedules dialog." - - [resolution] - definition = "default" - - automatic_placement = "true" - vertical_placement = "center" - horizontal_placement = "center" - - [tooltip] - id = "tooltip" - [/tooltip] - - [helptip] - id = "tooltip" - [/helptip] - - [linked_group] - id = "labels" - fixed_width = "true" - [/linked_group] - - [linked_group] - id = "tod_index" - fixed_width = "true" - [/linked_group] - - [grid] - [row] - grow_factor = 0 - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "title" - label = _ "Custom Time Schedule" - [/label] - [/column] - [/row] - [row] - grow_factor = 0 - [column] - horizontal_alignment = "left" - [grid] - [row] - grow_factor = 0 - [column] - horizontal_grow = "true" - [grid] - [row] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "Name:" - [/label] - [/column] - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [text_box] - id = "tod_name" - definition = "default" - [/text_box] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [image] - id = "current_tod_image" - definition = "default" - [/image] - [/column] - [/row] - [row] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "ID:" - [/label] - [/column] - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [text_box] - id = "tod_id" - definition = "default" - [/text_box] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [image] - id = "current_tod_mask" - definition = "default" - [/image] - [/column] - [/row] - [row] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "Metadata:" - [/label] - [/column] - [column] - horizontal_alignment = "left" - [grid] - [row] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [button] - id = "image_button" - definition = "default" - label = _ "Image" - [/button] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [button] - id = "mask_button" - definition = "default" - label = _ "Mask" - [/button] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [button] - id = "sound_button" - definition = "default" - label = _ "Sound" - [/button] - [/column] - [/row] - [/grid] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [label] - id = "current_sound" - definition = "default" - [/label] - [/column] - [/row] - [/grid] - [/column] - [/row] - [row] - [column] - [grid] - [row] - grow_factor = 0 - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "Lawful Bonus:" - [/label] - [/column] - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [slider] - id = "lawful_bonus" - definition = "default" - best_slider_length = 512 - minimum_value = -100 - maximum_value = 100 - step_size = 5 - [/slider] - [/column] - [/row] - [row] - [column] - grow_factor = 0 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "Red:" - [/label] - [/column] - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [slider] - id = "tod_red" - definition = "default" - best_slider_length = 512 - minimum_value = -255 - maximum_value = 255 - step_size = 1 - [/slider] - [/column] - [/row] - [row] - [column] - grow_factor = 0 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "Green:" - [/label] - [/column] - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [slider] - id = "tod_green" - definition = "default" - best_slider_length = 512 - minimum_value = -255 - maximum_value = 255 - step_size = 1 - [/slider] - [/column] - [/row] - [row] - [column] - grow_factor = 0 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - definition = "default" - linked_group = "labels" - label = _ "Blue:" - [/label] - [/column] - [column] - grow_factor = 1 - border = "all" - border_size = 5 - horizontal_alignment = "left" - [slider] - id = "tod_blue" - definition = "default" - best_slider_length = 512 - minimum_value = -255 - maximum_value = 255 - step_size = 1 - [/slider] - [/column] - [/row] - [/grid] - [/column] - [/row] - [/grid] - [/column] - [/row] - [row] - grow_factor = 1 - [column] - horizontal_grow = "true" - [grid] - [row] - grow_factor = 1 - [column] - horizontal_alignment = "left" - [grid] - [row] - grow_factor = 1 - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [button] - id = "previous_tod" - definition = "left_arrow" - linked_group = "tod_index" - label = _ "Previous" - [/button] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [label] - id = "tod_number" - definition = "default" - linked_group = "tod_index" - [/label] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "left" - [button] - id = "next_tod" - definition = "right_arrow" - linked_group = "tod_index" - label = _ "Next" - [/button] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [button] - id = "new" - definition = "add" - label = _ "New ToD" - [/button] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [button] - id = "delete" - definition = "delete" - label = _ "Delete ToD" - [/button] - [/column] - [/row] - [/grid] - [/column] - [column] - horizontal_alignment = "right" - [grid] - [row] - grow_factor = 1 - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [button] - id = "save" - definition = "default" - label = _ "OK" - [/button] - [/column] - [column] - border = "all" - border_size = 5 - horizontal_alignment = "right" - [button] - id = "cancel" - definition = "default" - label = _ "Cancel" - [/button] - [/column] - [/row] - [/grid] - [/column] - [/row] - [/grid] - [/column] - [/row] - [/grid] - [/resolution] + id = "custom_tod" + description = "Custom ToD schedules dialog." + + [resolution] + definition = "default" + + automatic_placement = "true" + vertical_placement = "center" + horizontal_placement = "center" + + [tooltip] + id = "tooltip" + [/tooltip] + + [helptip] + id = "tooltip" + [/helptip] + + [linked_group] + id = "labels" + fixed_width = "true" + [/linked_group] + + [linked_group] + id = "tod_index" + fixed_width = "true" + [/linked_group] + + [grid] + [row] + grow_factor = 0 + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "title" + label = _ "Custom Time Schedule" + [/label] + [/column] + [/row] + + [row] + grow_factor = 0 + [column] + horizontal_grow = "true" + [grid] + [row] + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "Name:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [text_box] + id = "tod_name" + definition = "default" + [/text_box] + [/column] + + [column] + border = "all" + border_size = 5 + horizontal_alignment = "right" + [image] + id = "current_tod_image" + definition = "default" + [/image] + [/column] + [/row] + + [row] + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "ID:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [text_box] + id = "tod_id" + definition = "default" + [/text_box] + [/column] + + [column] + border = "all" + border_size = 5 + horizontal_alignment = "right" + [image] + id = "current_tod_mask" + definition = "default" + [/image] + [/column] + [/row] + + [row] + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "Metadata:" + [/label] + [/column] + + [column] + horizontal_alignment = "left" + [grid] + [row] + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "image_button" + definition = "default" + label = _ "Image" + [/button] + [/column] + + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "mask_button" + definition = "default" + label = _ "Mask" + [/button] + [/column] + + [column] + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "sound_button" + definition = "default" + label = _ "Sound" + [/button] + [/column] + [/row] + [/grid] + [/column] + + [column] + border = "all" + border_size = 5 + horizontal_alignment = "right" + [label] + id = "current_sound" + definition = "default" + [/label] + [/column] + [/row] + [/grid] + [/column] + [/row] + [row] + [column] + [grid] + [row] + grow_factor = 0 + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "Lawful Bonus:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [slider] + id = "lawful_bonus" + definition = "default" + best_slider_length = 512 + minimum_value = -100 + maximum_value = 100 + step_size = 5 + [/slider] + [/column] + [/row] + + [row] + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "Red:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [slider] + id = "tod_red" + definition = "default" + best_slider_length = 512 + minimum_value = -255 + maximum_value = 255 + step_size = 1 + [/slider] + [/column] + [/row] + + [row] + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "Green:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [slider] + id = "tod_green" + definition = "default" + best_slider_length = 512 + minimum_value = -255 + maximum_value = 255 + step_size = 1 + [/slider] + [/column] + [/row] + + [row] + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + definition = "default" + linked_group = "labels" + label = _ "Blue:" + [/label] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [slider] + id = "tod_blue" + definition = "default" + best_slider_length = 512 + minimum_value = -255 + maximum_value = 255 + step_size = 1 + [/slider] + [/column] + [/row] + [/grid] + [/column] + [/row] + + [row] + grow_factor = 1 + [column] + horizontal_grow = "true" + [grid] + [row] + grow_factor = 1 + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "previous_tod" + definition = "left_arrow" + linked_group = "tod_index" + label = _ "Previous" + [/button] + [/column] + + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [label] + id = "tod_number" + definition = "default" + linked_group = "tod_index" + [/label] + [/column] + + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "next_tod" + definition = "right_arrow" + linked_group = "tod_index" + label = _ "Next" + [/button] + [/column] + + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "new" + definition = "add" + label = _ "New ToD" + [/button] + [/column] + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "left" + [button] + id = "delete" + definition = "delete" + label = _ "Delete ToD" + [/button] + [/column] + + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "right" + [button] + id = "ok" + definition = "default" + label = _ "OK" + [/button] + [/column] + + [column] + grow_factor = 0 + border = "all" + border_size = 5 + horizontal_alignment = "right" + [button] + id = "cancel" + definition = "default" + label = _ "Cancel" + [/button] + [/column] + [/row] + [/grid] + [/column] + [/row] + [/grid] + [/resolution] [/window] diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index 606501177a59..6a65b61841e4 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -86,7 +86,6 @@ editor_controller::editor_controller(const config &game_config, CVideo& video) init_music(game_config); context_manager_->get_map_context().set_starting_position_labels(gui()); cursor::set(cursor::NORMAL); - image::set_color_adjustment(preferences::editor::tod_r(), preferences::editor::tod_g(), preferences::editor::tod_b()); gui().create_buttons(); gui().redraw_everything(); diff --git a/src/editor/editor_preferences.cpp b/src/editor/editor_preferences.cpp index 5e53172422b9..33e638cf7be2 100644 --- a/src/editor/editor_preferences.cpp +++ b/src/editor/editor_preferences.cpp @@ -50,51 +50,6 @@ namespace editor { preferences::set("editor_draw_hex_coordinates", value); } - namespace { - void normalize_editor_rgb(int rval) - { - if (rval < -255) { - rval = -255; - } - else if (rval > 255) { - rval = 255; - } - } - } - - void set_tod_r(int value) - { - normalize_editor_rgb(value); - preferences::set("editor_r",std::to_string(value)); - } - - void set_tod_g(int value) - { - normalize_editor_rgb(value); - preferences::set("editor_g",std::to_string(value)); - } - - void set_tod_b(int value) - { - normalize_editor_rgb(value); - preferences::set("editor_b",std::to_string(value)); - } - - int tod_r() - { - return lexical_cast_in_range(preferences::get("editor_r"), 0, -255, 255); - } - - int tod_g() - { - return lexical_cast_in_range(preferences::get("editor_g"), 0, -255, 255); - } - - int tod_b() - { - return lexical_cast_in_range(preferences::get("editor_b"), 0, -255, 255); - } - namespace { size_t editor_mru_limit() { diff --git a/src/editor/editor_preferences.hpp b/src/editor/editor_preferences.hpp index b229aeaa97c9..ae4e97e15c1c 100644 --- a/src/editor/editor_preferences.hpp +++ b/src/editor/editor_preferences.hpp @@ -42,21 +42,6 @@ namespace editor { bool draw_hex_coordinates(); void set_draw_hex_coordinates(bool value); - - /** Set editor red tint level. */ - void set_tod_r(int value); - /** Set editor green tint level. */ - void set_tod_g(int value); - /** Set editor blue tint level. */ - void set_tod_b(int value); - - /** Get editor red tint level. */ - int tod_r(); - /** Get editor green tint level. */ - int tod_g(); - /** Get editor blue tint level. */ - int tod_b(); - /** Retrieves the list of recently opened files. */ std::vector recent_files(); /** Adds an entry to the recent files list. */ diff --git a/src/gui/dialogs/editor/custom_tod.cpp b/src/gui/dialogs/editor/custom_tod.cpp index 895b784a6229..e22ef7e1abb0 100644 --- a/src/gui/dialogs/editor/custom_tod.cpp +++ b/src/gui/dialogs/editor/custom_tod.cpp @@ -96,42 +96,32 @@ tcustom_tod::tcustom_tod(editor::editor_display* display, , current_tod_sound_(nullptr) , current_tod_number_(nullptr) , lawful_bonus_field_(register_integer("lawful_bonus", true)) - , tod_red_field_(register_integer("tod_red", - true, - &preferences::editor::tod_r, - &preferences::editor::set_tod_r)) - , tod_green_field_(register_integer("tod_green", - true, - &preferences::editor::tod_g, - &preferences::editor::set_tod_g)) - , tod_blue_field_(register_integer("tod_blue", - true, - &preferences::editor::tod_b, - &preferences::editor::set_tod_b)) + , tod_red_field_(nullptr) + , tod_green_field_(nullptr) + , tod_blue_field_(nullptr) , display_(display) { } void tcustom_tod::select_file(const std::string& filename, - const std::string& dir, - const std::string& vector_attrib, + const std::string& default_dir, + const std::string& attribute, twindow& window) { - std::string va = vector_attrib; std::string fn = filesystem::base_name(filename); std::string dn = filesystem::directory_name(fn); if(dn.empty()) { - dn = dir; + dn = default_dir; } int res = dialogs::show_file_chooser_dialog( display_->video(), dn, _("Choose File")); if(res == 0) { - if(va == "image") { + if(attribute == "image") { tods_[current_tod_].image = dn; - } else if(va == "mask") { + } else if(attribute == "mask") { tods_[current_tod_].image_mask = dn; - } else if(va == "sound") { + } else if(attribute == "sound") { tods_[current_tod_].sounds = dn; } } @@ -171,11 +161,6 @@ void tcustom_tod::do_delete_tod(twindow& window) update_selected_tod_info(window); } -const std::vector& tcustom_tod::do_save_schedule() const -{ - return tods_; -} - const time_of_day& tcustom_tod::get_selected_tod() const { assert(static_cast(current_tod_) < tods_.size()); @@ -184,15 +169,14 @@ const time_of_day& tcustom_tod::get_selected_tod() const void tcustom_tod::update_tod_display(twindow& window) { - image::set_color_adjustment(tod_red_field_->get_widget_value(window), - tod_green_field_->get_widget_value(window), - tod_blue_field_->get_widget_value(window)); + image::set_color_adjustment(tod_red_field_->get_value(), + tod_green_field_->get_value(), + tod_blue_field_->get_value()); if(!display_) { return; } - // Prevent a floating slice of window appearing alone over the // theme UI sidebar after redrawing tiles and before we have a // chance to redraw the rest of this window. @@ -209,6 +193,7 @@ void tcustom_tod::update_tod_display(twindow& window) // invalidate all tiles so they are redrawn with the new ToD tint next display_->invalidate_all(); + // redraw tiles display_->draw(false); @@ -221,11 +206,6 @@ void tcustom_tod::update_lawful_bonus(twindow& window) = lawful_bonus_field_->get_widget_value(window); } -void tcustom_tod::slider_update_callback(twindow& window) -{ - update_tod_display(window); -} - void tcustom_tod::update_selected_tod_info(twindow& window) { current_tod_name_->set_value(get_selected_tod().name); @@ -235,23 +215,31 @@ void tcustom_tod::update_selected_tod_info(twindow& window) current_tod_sound_->set_label(get_selected_tod().sounds); std::stringstream ss; - ss << (current_tod_ + 1); - ss << "/" << tods_.size(); + ss << (current_tod_ + 1) << "/" << tods_.size(); current_tod_number_->set_label(ss.str()); lawful_bonus_field_->set_widget_value(window, get_selected_tod().lawful_bonus); - tod_red_field_->set_widget_value(window, get_selected_tod().color.r); - tod_green_field_->set_widget_value(window, get_selected_tod().color.g); - tod_blue_field_->set_widget_value(window, get_selected_tod().color.b); + tod_red_field_->set_value(get_selected_tod().color.r); + tod_green_field_->set_value(get_selected_tod().color.g); + tod_blue_field_->set_value(get_selected_tod().color.b); update_tod_display(window); - window.invalidate_layout(); } void tcustom_tod::pre_show(twindow& window) { assert(!tods_.empty()); + + tod_red_field_ + = find_widget(&window, "tod_red", false, true); + + tod_green_field_ + = find_widget(&window, "tod_green", false, true); + + tod_blue_field_ + = find_widget(&window, "tod_blue", false, true); + current_tod_name_ = find_widget(&window, "tod_name", false, true); @@ -269,94 +257,75 @@ void tcustom_tod::pre_show(twindow& window) current_tod_number_ = find_widget(&window, "tod_number", false, true); - tbutton& image_button - = find_widget(&window, "image_button", false); - connect_signal_mouse_left_click(image_button, - std::bind(&tcustom_tod::select_file, - this, - get_selected_tod().image, - "data/core/images/misc", - "image", - std::ref(window))); - - tbutton& mask_button = find_widget(&window, "mask_button", false); - ; - connect_signal_mouse_left_click(mask_button, - std::bind(&tcustom_tod::select_file, - this, - get_selected_tod().image_mask, - "data/core/images", - "mask", - std::ref(window))); - - tbutton& sound_button - = find_widget(&window, "sound_button", false); - connect_signal_mouse_left_click(sound_button, - std::bind(&tcustom_tod::select_file, - this, - get_selected_tod().sounds, - "data/core/sounds/ambient", - "sound", - std::ref(window))); - - tbutton& next_tod_button = find_widget(&window, "next_tod", false); + connect_signal_mouse_left_click(find_widget(&window, "image_button", false), + std::bind(&tcustom_tod::select_file, + this, + get_selected_tod().image, + "data/core/images/misc", + "image", + std::ref(window))); + + connect_signal_mouse_left_click(find_widget(&window, "mask_button", false), + std::bind(&tcustom_tod::select_file, + this, + get_selected_tod().image_mask, + "data/core/images", + "mask", + std::ref(window))); + + connect_signal_mouse_left_click(find_widget(&window, "sound_button", false), + std::bind(&tcustom_tod::select_file, + this, + get_selected_tod().sounds, + "data/core/sounds/ambient", + "sound", + std::ref(window))); + connect_signal_mouse_left_click( - next_tod_button, + find_widget(&window, "next_tod", false), std::bind(&tcustom_tod::do_next_tod, this, std::ref(window))); - tbutton& prev_tod_button - = find_widget(&window, "previous_tod", false); connect_signal_mouse_left_click( - prev_tod_button, + find_widget(&window, "previous_tod", false), std::bind(&tcustom_tod::do_prev_tod, this, std::ref(window))); - tbutton& new_button = find_widget(&window, "new", false); connect_signal_mouse_left_click( - new_button, + find_widget(&window, "new", false), std::bind(&tcustom_tod::do_new_tod, this, std::ref(window))); - tbutton& delete_button = find_widget(&window, "delete", false); connect_signal_mouse_left_click( - delete_button, + find_widget(&window, "delete", false), std::bind(&tcustom_tod::do_delete_tod, this, std::ref(window))); - // FIXME: This doesn't work (it does nothing at all) - /* - tbutton& save_button = find_widget(&window, "save", false); - connect_signal_mouse_left_click( - save_button, std::bind(&tcustom_tod::do_save_schedule, this)); - */ - connect_signal_notify_modified( *(lawful_bonus_field_->widget()), std::bind(&tcustom_tod::update_lawful_bonus, - this, - std::ref(window))); + this, + std::ref(window))); connect_signal_notify_modified( - *(tod_red_field_->widget()), - std::bind(&tcustom_tod::slider_update_callback, - this, - std::ref(window))); + *tod_red_field_, + std::bind(&tcustom_tod::update_tod_display, + this, + std::ref(window))); connect_signal_notify_modified( - *(tod_green_field_->widget()), - std::bind(&tcustom_tod::slider_update_callback, - this, - std::ref(window))); + *tod_green_field_, + std::bind(&tcustom_tod::update_tod_display, + this, + std::ref(window))); connect_signal_notify_modified( - *(tod_blue_field_->widget()), - std::bind(&tcustom_tod::slider_update_callback, - this, - std::ref(window))); + *tod_blue_field_, + std::bind(&tcustom_tod::update_tod_display, + this, + std::ref(window))); for(size_t i = 0; i < tods_.size(); ++i) { - time_of_day& tod = tods_[i]; - const int r = tod_red_field_->get_widget_value(window); - const int g = tod_green_field_->get_widget_value(window); - const int b = tod_blue_field_->get_widget_value(window); + const int r = tod_red_field_->get_value(); + const int g = tod_green_field_->get_value(); + const int b = tod_blue_field_->get_value(); if(tod.color.r == r && tod.color.g == g && tod.color.b == b) { current_tod_ = i; update_selected_tod_info(window); @@ -370,6 +339,10 @@ void tcustom_tod::pre_show(twindow& window) void tcustom_tod::post_show(twindow& window) { update_tod_display(window); + + if(get_retval() == twindow::OK) { + // TODO: save ToD + } } } // namespace gui2 diff --git a/src/gui/dialogs/editor/custom_tod.hpp b/src/gui/dialogs/editor/custom_tod.hpp index cc186388c2fa..92dfdc7017fe 100644 --- a/src/gui/dialogs/editor/custom_tod.hpp +++ b/src/gui/dialogs/editor/custom_tod.hpp @@ -36,6 +36,7 @@ namespace gui2 class tlabel; class timage; +class tslider; class ttext_box; class tcustom_tod : public tdialog @@ -61,19 +62,16 @@ class tcustom_tod : public tdialog void do_new_tod(twindow& window); void do_delete_tod(twindow& window); - const std::vector& do_save_schedule() const; void select_file(const std::string& filename, - const std::string& dir, - const std::string& vector_attrib, + const std::string& default_dir, + const std::string& attribute, twindow& window); void update_tod_display(twindow& window); void update_lawful_bonus(twindow& window); - void slider_update_callback(twindow& window); - void set_selected_tod(time_of_day tod); const time_of_day& get_selected_tod() const; @@ -104,9 +102,9 @@ class tcustom_tod : public tdialog tlabel* current_tod_number_; tfield_integer* lawful_bonus_field_; - tfield_integer* tod_red_field_; - tfield_integer* tod_green_field_; - tfield_integer* tod_blue_field_; + tslider* tod_red_field_; + tslider* tod_green_field_; + tslider* tod_blue_field_; /** * The display to update when the ToD changes. From a33414a79f3bc3f59019d9917ac2bcf2587c2185 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Tue, 22 Mar 2016 08:22:56 -0400 Subject: [PATCH 179/240] Correct doc reference to nonexistent function is_keyboard_scroll_active no longer exists, scrolling_ seems to be the equivalent. --- src/controller_base.hpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/controller_base.hpp b/src/controller_base.hpp index 87df5cfe8a03..93dea82a36b8 100644 --- a/src/controller_base.hpp +++ b/src/controller_base.hpp @@ -102,7 +102,7 @@ class controller_base : public video2::draw_layering /** * Handle scrolling by keyboard, joystick and moving mouse near map edges - * @see is_keyboard_scroll_active + * @see scrolling_, which is set if the display is being scrolled * @return true when there was any scrolling, false otherwise */ bool handle_scroll(CKey& key, int mousex, int mousey, int mouse_flags, double joystickx, double joysticky); From fa756088735d67395fc7dbe04f89890172bcecf6 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Thu, 24 Mar 2016 22:46:05 -0400 Subject: [PATCH 180/240] Implement hotkey release handling. Hotkeys are now triggered by a key/button release as well as a press. This information is passed along as HOTKEY_EVENT_TYPE, which may be HOTKEY_EVENT_PRESS, HOTKEY_EVENT_RELEASE, or HOTKEY_EVENT_REPEAT (for a held key repeat). Currently this should preserve the previous functionality. Existing hotkeys respond to a press or repeat as they did before and ignore a release. --- src/controller_base.cpp | 5 +++-- src/hotkey/command_executor.cpp | 24 ++++++++++++++++++++---- src/hotkey/command_executor.hpp | 4 ++-- src/hotkey/hotkey_command.hpp | 2 ++ src/hotkey/hotkey_handler.cpp | 4 ++-- src/hotkey/hotkey_handler.hpp | 2 +- 6 files changed, 30 insertions(+), 11 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index ffe7ec5fb2f3..9dbd829cc0cd 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -61,13 +61,14 @@ void controller_base::handle_event(const SDL_Event& event) process_keydown_event(event); hotkey::key_event(event, get_hotkey_command_executor()); + process_keyup_event(event); } else { process_focus_keydown_event(event); - break; } - // intentionally fall-through + break; case SDL_KEYUP: process_keyup_event(event); + hotkey::key_event(event, get_hotkey_command_executor()); break; case SDL_JOYBUTTONDOWN: process_keydown_event(event); diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index 7d708ae6af6a..baf9ebf69a46 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -72,8 +72,11 @@ namespace hotkey { static void event_execute(const SDL_Event& event, command_executor* executor); -bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/) +bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/, HOTKEY_EVENT_TYPE type) { + if (type == HOTKEY_EVENT_RELEASE) + return false; // nothing responds to a release yet + switch(cmd.id) { case HOTKEY_CYCLE_UNITS: cycle_units(); @@ -460,6 +463,7 @@ void basic_handler::handle_event(const SDL_Event& event) switch (event.type) { case SDL_KEYDOWN: + case SDL_KEYUP: // If we're in a dialog we only want to handle items that are explicitly // handled by the executor. // If we're not in a dialog we can call the regular key event handler. @@ -470,6 +474,7 @@ void basic_handler::handle_event(const SDL_Event& event) } break; case SDL_JOYBUTTONDOWN: + case SDL_JOYBUTTONUP: if (!gui::in_dialog()) { jbutton_event(event,exec_); } else if (exec_ != nullptr) { @@ -477,6 +482,7 @@ void basic_handler::handle_event(const SDL_Event& event) } break; case SDL_MOUSEBUTTONDOWN: + case SDL_MOUSEBUTTONUP: if (!gui::in_dialog()) { mbutton_event(event,exec_); } else if (exec_ != nullptr) { @@ -515,18 +521,28 @@ static void event_execute( const SDL_Event& event, command_executor* executor) return; } - execute_command(hotkey::get_hotkey_command(hk->get_command()), executor); + HOTKEY_EVENT_TYPE type = HOTKEY_EVENT_PRESS; + if (event.type == SDL_KEYUP || event.type == SDL_JOYBUTTONUP || event.type == SDL_MOUSEBUTTONUP) + type = HOTKEY_EVENT_RELEASE; + else if (event.type == SDL_KEYDOWN && event.key.repeat > 0) + type = HOTKEY_EVENT_REPEAT; + + execute_command(hotkey::get_hotkey_command(hk->get_command()), executor, -1, type); executor->set_button_state(); } -void execute_command(const hotkey_command& command, command_executor* executor, int index) +void execute_command(const hotkey_command& command, command_executor* executor, int index, HOTKEY_EVENT_TYPE type) { if (executor != nullptr) { if (!executor->can_execute_command(command, index) - || executor->execute_command(command, index)) { + || executor->execute_command(command, index, type)) { return; } } + + if (type == HOTKEY_EVENT_RELEASE) + return; // none of the commands here respond to a key release + switch (command.id) { case HOTKEY_MINIMAP_DRAW_TERRAIN: diff --git a/src/hotkey/command_executor.hpp b/src/hotkey/command_executor.hpp index 87257a5f2d33..6b0b1a229d4e 100644 --- a/src/hotkey/command_executor.hpp +++ b/src/hotkey/command_executor.hpp @@ -132,7 +132,7 @@ class command_executor void execute_action(const std::vector& items_arg, int xloc, int yloc, bool context_menu, display& gui); virtual bool can_execute_command(const hotkey_command& command, int index=-1) const = 0; - virtual bool execute_command(const hotkey_command& command, int index=-1); + virtual bool execute_command(const hotkey_command& command, int index=-1, HOTKEY_EVENT_TYPE type = HOTKEY_EVENT_PRESS); }; class command_executor_default : public command_executor { @@ -162,7 +162,7 @@ void mbutton_event(const SDL_Event& event, command_executor* executor); //TODO -void execute_command(const hotkey_command& command, command_executor* executor, int index=-1); +void execute_command(const hotkey_command& command, command_executor* executor, int index=-1, HOTKEY_EVENT_TYPE type = HOTKEY_EVENT_PRESS); // Object which will ensure that basic keyboard events like escape // are handled properly for the duration of its lifetime. diff --git a/src/hotkey/hotkey_command.hpp b/src/hotkey/hotkey_command.hpp index 485a651eb746..4df7c857e2f1 100644 --- a/src/hotkey/hotkey_command.hpp +++ b/src/hotkey/hotkey_command.hpp @@ -35,6 +35,8 @@ enum scope { SCOPE_COUNT, }; +enum HOTKEY_EVENT_TYPE { HOTKEY_EVENT_PRESS, HOTKEY_EVENT_RELEASE, HOTKEY_EVENT_REPEAT }; + enum HOTKEY_COMMAND { HOTKEY_CYCLE_UNITS, HOTKEY_CYCLE_BACK_UNITS, HOTKEY_UNIT_HOLD_POSITION, diff --git a/src/hotkey/hotkey_handler.cpp b/src/hotkey/hotkey_handler.cpp index 573fc80d1738..71a0b381c2c1 100644 --- a/src/hotkey/hotkey_handler.cpp +++ b/src/hotkey/hotkey_handler.cpp @@ -218,7 +218,7 @@ void play_controller::hotkey_handler::toggle_accelerated_speed() } } -bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index) +bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index, hotkey::HOTKEY_EVENT_TYPE type) { hotkey::HOTKEY_COMMAND command = cmd.id; if(index >= 0) { @@ -245,7 +245,7 @@ bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_comma gamestate().get_wml_menu_items().fire_item(name, hex, gamestate().gamedata_, gamestate(), gamestate().board_.units_); /// @todo Shouldn't the function return at this point? } - return command_executor::execute_command(cmd, index); + return command_executor::execute_command(cmd, index, type); } bool play_controller::hotkey_handler::can_execute_command(const hotkey::hotkey_command& cmd, int index) const diff --git a/src/hotkey/hotkey_handler.hpp b/src/hotkey/hotkey_handler.hpp index 2f6ffb114ccc..93662594c8ea 100644 --- a/src/hotkey/hotkey_handler.hpp +++ b/src/hotkey/hotkey_handler.hpp @@ -125,7 +125,7 @@ class play_controller::hotkey_handler : public hotkey::command_executor_default virtual hotkey::ACTION_STATE get_action_state(hotkey::HOTKEY_COMMAND command, int index) const; /** Check if a command can be executed. */ virtual bool can_execute_command(const hotkey::hotkey_command& command, int index=-1) const; - virtual bool execute_command(const hotkey::hotkey_command& command, int index=-1); + virtual bool execute_command(const hotkey::hotkey_command& command, int index=-1, hotkey::HOTKEY_EVENT_TYPE type = hotkey::HOTKEY_EVENT_PRESS); void show_menu(const std::vector& items_arg, int xloc, int yloc, bool context_menu, display& disp); /** From 0a05828da38658a31d29be9d6196480a1cd95e96 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Thu, 24 Mar 2016 22:49:46 -0400 Subject: [PATCH 181/240] Implement map scrolling with hotkeys. This leverages the new hotkey release support to implement scrolling with hotkeys rather than keyboard polling. This allows users to rebind the scroll keys in the hotkey menu. Previously they were fixed to the arrow keys. --- src/controller_base.cpp | 52 +++++++++++++++++++-------------- src/controller_base.hpp | 6 +++- src/hotkey/command_executor.cpp | 42 ++++++++++++++++++++++++-- src/hotkey/command_executor.hpp | 1 + src/hotkey/hotkey_command.cpp | 4 +++ src/hotkey/hotkey_command.hpp | 3 ++ src/hotkey/hotkey_handler.cpp | 9 ++++++ src/hotkey/hotkey_handler.hpp | 1 + 8 files changed, 93 insertions(+), 25 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index 9dbd829cc0cd..b320a3a2187f 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -34,6 +34,8 @@ controller_base::controller_base( : game_config_(game_config) , key_() , scrolling_(false) + , scrollx_(0) + , scrolly_(0) , joystick_manager_() { } @@ -129,11 +131,10 @@ void controller_base::process_keyup_event(const SDL_Event& /*event*/) { //no action by default } -bool controller_base::handle_scroll(CKey& key, int mousex, int mousey, int mouse_flags, double x_axis, double y_axis) +bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags, double x_axis, double y_axis) { bool mouse_in_window = (SDL_GetAppState() & SDL_APPMOUSEFOCUS) != 0 || preferences::get("scroll_when_mouse_outside", true); - bool keyboard_focus = have_keyboard_focus(); int scroll_speed = preferences::scroll_speed(); int dx = 0, dy = 0; int scroll_threshold = (preferences::mouse_scroll_enabled()) @@ -143,26 +144,24 @@ bool controller_base::handle_scroll(CKey& key, int mousex, int mousey, int mouse scroll_threshold = 0; } } - if ((key[SDLK_UP] && keyboard_focus) || - (mousey < scroll_threshold && mouse_in_window)) - { - dy -= scroll_speed; - } - if ((key[SDLK_DOWN] && keyboard_focus) || - (mousey > get_display().h() - scroll_threshold && mouse_in_window)) - { - dy += scroll_speed; - } - if ((key[SDLK_LEFT] && keyboard_focus) || - (mousex < scroll_threshold && mouse_in_window)) - { - dx -= scroll_speed; - } - if ((key[SDLK_RIGHT] && keyboard_focus) || - (mousex > get_display().w() - scroll_threshold && mouse_in_window)) - { - dx += scroll_speed; + + // scroll with keyboard + dx += scrollx_ * scroll_speed; + dy += scrolly_ * scroll_speed; + + // scroll if mouse is placed near the edge of the screen + if (mouse_in_window) { + if (mousey < scroll_threshold) + dy -= scroll_speed; + if (mousey > get_display().h() - scroll_threshold) + dy += scroll_speed; + if (mousex < scroll_threshold) + dx -= scroll_speed; + if (mousex > get_display().w() - scroll_threshold) + dx += scroll_speed; } + + // scroll with middle-mouse if enabled if ((mouse_flags & SDL_BUTTON_MMASK) != 0 && preferences::middle_click_scrolls()) { const map_location original_loc = get_mouse_handler_base().get_scroll_start(); @@ -186,6 +185,7 @@ bool controller_base::handle_scroll(CKey& key, int mousex, int mousey, int mouse } } + // scroll with joystick dx += round_double( x_axis * scroll_speed); dy += round_double( y_axis * scroll_speed); @@ -239,7 +239,7 @@ void controller_base::play_slice(bool is_delay_enabled) mousey += values.second * 10; SDL_WarpMouse(mousex, mousey); */ - scrolling_ = handle_scroll(key, mousex, mousey, mouse_flags, joystickx, joysticky); + scrolling_ = handle_scroll(mousex, mousey, mouse_flags, joystickx, joysticky); map_location highlighted_hex = get_display().mouseover_hex(); @@ -342,3 +342,11 @@ const config& controller_base::get_theme(const config& game_config, std::string static config empty; return empty; } + +void controller_base::keyboard_scroll(int x, int y) +{ + if (have_keyboard_focus()) { + scrollx_ += x; + scrolly_ += y; + } +} diff --git a/src/controller_base.hpp b/src/controller_base.hpp index 93dea82a36b8..2329d9fc144e 100644 --- a/src/controller_base.hpp +++ b/src/controller_base.hpp @@ -64,6 +64,8 @@ class controller_base : public video2::draw_layering void play_slice(bool is_delay_enabled = true); static const config &get_theme(const config& game_config, std::string theme_name); + + void keyboard_scroll(int x, int y); protected: virtual bool is_browsing() const { return false; } @@ -105,7 +107,7 @@ class controller_base : public video2::draw_layering * @see scrolling_, which is set if the display is being scrolled * @return true when there was any scrolling, false otherwise */ - bool handle_scroll(CKey& key, int mousex, int mousey, int mouse_flags, double joystickx, double joysticky); + bool handle_scroll(int mousex, int mousey, int mouse_flags, double joystickx, double joysticky); /** * Process mouse- and keypress-events from SDL. @@ -141,6 +143,8 @@ class controller_base : public video2::draw_layering const config& game_config_; CKey key_; bool scrolling_; + int scrollx_; + int scrolly_; joystick_manager joystick_manager_; }; diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index baf9ebf69a46..d548de95abbe 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -74,9 +74,47 @@ static void event_execute(const SDL_Event& event, command_executor* executor); bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/, HOTKEY_EVENT_TYPE type) { - if (type == HOTKEY_EVENT_RELEASE) - return false; // nothing responds to a release yet + if (type == HOTKEY_EVENT_RELEASE) { + switch(cmd.id) { + // release a scroll key, un-apply scrolling in the given direction + case HOTKEY_SCROLL_UP: + keyboard_scroll(0, 1); + break; + case HOTKEY_SCROLL_DOWN: + keyboard_scroll(0, -1); + break; + case HOTKEY_SCROLL_LEFT: + keyboard_scroll(1, 0); + break; + case HOTKEY_SCROLL_RIGHT: + keyboard_scroll(-1, 0); + break; + default: + return false; // nothing else handles a hotkey release + } + + return true; + } + + // special handling for scroll keys, which do not handle repeat + if (type == HOTKEY_EVENT_PRESS) { + switch(cmd.id) { + case HOTKEY_SCROLL_UP: + keyboard_scroll(0, -1); + return true; + case HOTKEY_SCROLL_DOWN: + keyboard_scroll(0, 1); + return true; + case HOTKEY_SCROLL_LEFT: + keyboard_scroll(-1, 0); + return true; + case HOTKEY_SCROLL_RIGHT: + keyboard_scroll(1, 0); + return true; + } + } + // everything following responds to a press or repeat, but not release switch(cmd.id) { case HOTKEY_CYCLE_UNITS: cycle_units(); diff --git a/src/hotkey/command_executor.hpp b/src/hotkey/command_executor.hpp index 6b0b1a229d4e..4718f554994f 100644 --- a/src/hotkey/command_executor.hpp +++ b/src/hotkey/command_executor.hpp @@ -108,6 +108,7 @@ class command_executor virtual void left_mouse_click() {} virtual void right_mouse_click() {} virtual void toggle_accelerated_speed() {} + virtual void keyboard_scroll(int /*x*/, int /*y*/) {} virtual void lua_console(); virtual void zoom_in() {} virtual void zoom_out() {} diff --git a/src/hotkey/hotkey_command.cpp b/src/hotkey/hotkey_command.cpp index 6d1a4f23b93b..0d53957698d6 100644 --- a/src/hotkey/hotkey_command.cpp +++ b/src/hotkey/hotkey_command.cpp @@ -35,6 +35,10 @@ namespace { hotkey::hk_scopes scope_main(1 << hotkey::SCOPE_MAIN_MENU); // this contains all static hotkeys hotkey::hotkey_command_temp hotkey_list_[] = { + { hotkey::HOTKEY_SCROLL_UP, "scroll-up", N_("Scroll Up"), false, scope_game | scope_editor, "" }, + { hotkey::HOTKEY_SCROLL_DOWN, "scroll-down", N_("Scroll Down"), false, scope_game | scope_editor, "" }, + { hotkey::HOTKEY_SCROLL_LEFT, "scroll-left", N_("Scroll Left"), false, scope_game | scope_editor, "" }, + { hotkey::HOTKEY_SCROLL_RIGHT, "scroll-right", N_("Scroll Right"), false, scope_game | scope_editor, "" }, { hotkey::HOTKEY_CANCEL, N_("cancel"), N_("Cancel"), false, scope_game | scope_editor | scope_main, "" }, { hotkey::HOTKEY_SELECT_HEX, "selecthex", N_("Select Hex"), false, scope_game, "" }, diff --git a/src/hotkey/hotkey_command.hpp b/src/hotkey/hotkey_command.hpp index 4df7c857e2f1..f68f75e74fd7 100644 --- a/src/hotkey/hotkey_command.hpp +++ b/src/hotkey/hotkey_command.hpp @@ -67,6 +67,9 @@ enum HOTKEY_COMMAND { HOTKEY_SELECT_HEX, HOTKEY_DESELECT_HEX, HOTKEY_MOVE_ACTION, HOTKEY_SELECT_AND_ACTION, + // Camera movement + HOTKEY_SCROLL_UP, HOTKEY_SCROLL_DOWN, HOTKEY_SCROLL_LEFT, HOTKEY_SCROLL_RIGHT, + // Dialog control HOTKEY_CANCEL, HOTKEY_OKAY, diff --git a/src/hotkey/hotkey_handler.cpp b/src/hotkey/hotkey_handler.cpp index 71a0b381c2c1..3607a1bfc998 100644 --- a/src/hotkey/hotkey_handler.cpp +++ b/src/hotkey/hotkey_handler.cpp @@ -218,6 +218,11 @@ void play_controller::hotkey_handler::toggle_accelerated_speed() } } +void play_controller::hotkey_handler::keyboard_scroll(int x, int y) +{ + play_controller_.keyboard_scroll(x, y); +} + bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index, hotkey::HOTKEY_EVENT_TYPE type) { hotkey::HOTKEY_COMMAND command = cmd.id; @@ -302,6 +307,10 @@ bool play_controller::hotkey_handler::can_execute_command(const hotkey::hotkey_c case hotkey::HOTKEY_SAVE_REPLAY: case hotkey::HOTKEY_LABEL_SETTINGS: case hotkey::LUA_CONSOLE: + case hotkey::HOTKEY_SCROLL_UP: + case hotkey::HOTKEY_SCROLL_DOWN: + case hotkey::HOTKEY_SCROLL_LEFT: + case hotkey::HOTKEY_SCROLL_RIGHT: return true; // Commands that have some preconditions: diff --git a/src/hotkey/hotkey_handler.hpp b/src/hotkey/hotkey_handler.hpp index 93662594c8ea..e2e24a12d3a6 100644 --- a/src/hotkey/hotkey_handler.hpp +++ b/src/hotkey/hotkey_handler.hpp @@ -117,6 +117,7 @@ class play_controller::hotkey_handler : public hotkey::command_executor_default virtual void toggle_grid(); virtual void search(); virtual void toggle_accelerated_speed(); + virtual void keyboard_scroll(int x, int y); virtual void replay_skip_animation() override { return play_controller_.toggle_skipping_replay(); } From f4d2b24a3f9346a02991728c8ba6a6f52a3d8eb0 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Fri, 25 Mar 2016 22:42:56 -0400 Subject: [PATCH 182/240] Add braces to single-line ifs. Code review feedback. --- src/controller_base.cpp | 12 ++++++++---- src/hotkey/command_executor.cpp | 3 ++- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index b320a3a2187f..a3f1b93bf3de 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -151,14 +151,18 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags, dou // scroll if mouse is placed near the edge of the screen if (mouse_in_window) { - if (mousey < scroll_threshold) + if (mousey < scroll_threshold) { dy -= scroll_speed; - if (mousey > get_display().h() - scroll_threshold) + } + if (mousey > get_display().h() - scroll_threshold) { dy += scroll_speed; - if (mousex < scroll_threshold) + } + if (mousex < scroll_threshold) { dx -= scroll_speed; - if (mousex > get_display().w() - scroll_threshold) + } + if (mousex > get_display().w() - scroll_threshold) { dx += scroll_speed; + } } // scroll with middle-mouse if enabled diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index d548de95abbe..cd3bbb795898 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -578,8 +578,9 @@ void execute_command(const hotkey_command& command, command_executor* executor, } } - if (type == HOTKEY_EVENT_RELEASE) + if (type == HOTKEY_EVENT_RELEASE) { return; // none of the commands here respond to a key release + } switch (command.id) { From ae37341ab3b1a58840f4b80b05c2e4a1eb3c1a66 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Sat, 26 Mar 2016 22:53:45 -0400 Subject: [PATCH 183/240] Remove specialized hotkey repeat handling. Don't handle repeat events specially when triggering hotkeys. Replace the HOTKEY_EVENT_TYPE enum with a bool indicating whether the event was a press or a release. Scrolling handles repeats by clamping the scroll between -1 and 1 so repeat events don't accelerate the scroll speed. --- src/controller_base.cpp | 5 ++-- src/hotkey/command_executor.cpp | 53 +++++++++++++-------------------- src/hotkey/command_executor.hpp | 4 +-- src/hotkey/hotkey_command.hpp | 2 -- src/hotkey/hotkey_handler.cpp | 4 +-- src/hotkey/hotkey_handler.hpp | 2 +- 6 files changed, 28 insertions(+), 42 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index a3f1b93bf3de..b583570abf90 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -350,7 +350,8 @@ const config& controller_base::get_theme(const config& game_config, std::string void controller_base::keyboard_scroll(int x, int y) { if (have_keyboard_focus()) { - scrollx_ += x; - scrolly_ += y; + // clamp between -1 and 1 so key repeats don't accelerate scrolling + scrollx_ = std::min(1, std::max(-1, scrollx_ + x)); + scrolly_ = std::min(1, std::max(-1, scrolly_ + y)); } } diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index cd3bbb795898..a6379feeb5cb 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -72,9 +72,10 @@ namespace hotkey { static void event_execute(const SDL_Event& event, command_executor* executor); -bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/, HOTKEY_EVENT_TYPE type) +bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/, bool press) { - if (type == HOTKEY_EVENT_RELEASE) { + // hotkey release handling + if (!press) { switch(cmd.id) { // release a scroll key, un-apply scrolling in the given direction case HOTKEY_SCROLL_UP: @@ -96,30 +97,20 @@ bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/ return true; } - // special handling for scroll keys, which do not handle repeat - if (type == HOTKEY_EVENT_PRESS) { - switch(cmd.id) { - case HOTKEY_SCROLL_UP: - keyboard_scroll(0, -1); - return true; - case HOTKEY_SCROLL_DOWN: - keyboard_scroll(0, 1); - return true; - case HOTKEY_SCROLL_LEFT: - keyboard_scroll(-1, 0); - return true; - case HOTKEY_SCROLL_RIGHT: - keyboard_scroll(1, 0); - return true; - } - } - - // everything following responds to a press or repeat, but not release + // hotkey press handling switch(cmd.id) { - case HOTKEY_CYCLE_UNITS: - cycle_units(); + case HOTKEY_SCROLL_UP: + keyboard_scroll(0, -1); + break; + case HOTKEY_SCROLL_DOWN: + keyboard_scroll(0, 1); + break; + case HOTKEY_SCROLL_LEFT: + keyboard_scroll(-1, 0); + break; + case HOTKEY_SCROLL_RIGHT: + keyboard_scroll(1, 0); break; - case HOTKEY_CYCLE_BACK_UNITS: cycle_back_units(); break; case HOTKEY_ENDTURN: @@ -559,26 +550,22 @@ static void event_execute( const SDL_Event& event, command_executor* executor) return; } - HOTKEY_EVENT_TYPE type = HOTKEY_EVENT_PRESS; - if (event.type == SDL_KEYUP || event.type == SDL_JOYBUTTONUP || event.type == SDL_MOUSEBUTTONUP) - type = HOTKEY_EVENT_RELEASE; - else if (event.type == SDL_KEYDOWN && event.key.repeat > 0) - type = HOTKEY_EVENT_REPEAT; + bool press = event.type == SDL_KEYDOWN || event.type == SDL_JOYBUTTONDOWN || event.type == SDL_MOUSEBUTTONDOWN; - execute_command(hotkey::get_hotkey_command(hk->get_command()), executor, -1, type); + execute_command(hotkey::get_hotkey_command(hk->get_command()), executor, -1, press); executor->set_button_state(); } -void execute_command(const hotkey_command& command, command_executor* executor, int index, HOTKEY_EVENT_TYPE type) +void execute_command(const hotkey_command& command, command_executor* executor, int index, bool press) { if (executor != nullptr) { if (!executor->can_execute_command(command, index) - || executor->execute_command(command, index, type)) { + || executor->execute_command(command, index, press)) { return; } } - if (type == HOTKEY_EVENT_RELEASE) { + if (!press) { return; // none of the commands here respond to a key release } diff --git a/src/hotkey/command_executor.hpp b/src/hotkey/command_executor.hpp index 4718f554994f..52764786bb3e 100644 --- a/src/hotkey/command_executor.hpp +++ b/src/hotkey/command_executor.hpp @@ -133,7 +133,7 @@ class command_executor void execute_action(const std::vector& items_arg, int xloc, int yloc, bool context_menu, display& gui); virtual bool can_execute_command(const hotkey_command& command, int index=-1) const = 0; - virtual bool execute_command(const hotkey_command& command, int index=-1, HOTKEY_EVENT_TYPE type = HOTKEY_EVENT_PRESS); + virtual bool execute_command(const hotkey_command& command, int index=-1, bool press=true); }; class command_executor_default : public command_executor { @@ -163,7 +163,7 @@ void mbutton_event(const SDL_Event& event, command_executor* executor); //TODO -void execute_command(const hotkey_command& command, command_executor* executor, int index=-1, HOTKEY_EVENT_TYPE type = HOTKEY_EVENT_PRESS); +void execute_command(const hotkey_command& command, command_executor* executor, int index=-1, bool press=true); // Object which will ensure that basic keyboard events like escape // are handled properly for the duration of its lifetime. diff --git a/src/hotkey/hotkey_command.hpp b/src/hotkey/hotkey_command.hpp index f68f75e74fd7..d90134702618 100644 --- a/src/hotkey/hotkey_command.hpp +++ b/src/hotkey/hotkey_command.hpp @@ -35,8 +35,6 @@ enum scope { SCOPE_COUNT, }; -enum HOTKEY_EVENT_TYPE { HOTKEY_EVENT_PRESS, HOTKEY_EVENT_RELEASE, HOTKEY_EVENT_REPEAT }; - enum HOTKEY_COMMAND { HOTKEY_CYCLE_UNITS, HOTKEY_CYCLE_BACK_UNITS, HOTKEY_UNIT_HOLD_POSITION, diff --git a/src/hotkey/hotkey_handler.cpp b/src/hotkey/hotkey_handler.cpp index 3607a1bfc998..e0b56706805e 100644 --- a/src/hotkey/hotkey_handler.cpp +++ b/src/hotkey/hotkey_handler.cpp @@ -223,7 +223,7 @@ void play_controller::hotkey_handler::keyboard_scroll(int x, int y) play_controller_.keyboard_scroll(x, y); } -bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index, hotkey::HOTKEY_EVENT_TYPE type) +bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index, bool press) { hotkey::HOTKEY_COMMAND command = cmd.id; if(index >= 0) { @@ -250,7 +250,7 @@ bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_comma gamestate().get_wml_menu_items().fire_item(name, hex, gamestate().gamedata_, gamestate(), gamestate().board_.units_); /// @todo Shouldn't the function return at this point? } - return command_executor::execute_command(cmd, index, type); + return command_executor::execute_command(cmd, index, press); } bool play_controller::hotkey_handler::can_execute_command(const hotkey::hotkey_command& cmd, int index) const diff --git a/src/hotkey/hotkey_handler.hpp b/src/hotkey/hotkey_handler.hpp index e2e24a12d3a6..ccf5f19c2047 100644 --- a/src/hotkey/hotkey_handler.hpp +++ b/src/hotkey/hotkey_handler.hpp @@ -126,7 +126,7 @@ class play_controller::hotkey_handler : public hotkey::command_executor_default virtual hotkey::ACTION_STATE get_action_state(hotkey::HOTKEY_COMMAND command, int index) const; /** Check if a command can be executed. */ virtual bool can_execute_command(const hotkey::hotkey_command& command, int index=-1) const; - virtual bool execute_command(const hotkey::hotkey_command& command, int index=-1, hotkey::HOTKEY_EVENT_TYPE type = hotkey::HOTKEY_EVENT_PRESS); + virtual bool execute_command(const hotkey::hotkey_command& command, int index=-1, bool press=true); void show_menu(const std::vector& items_arg, int xloc, int yloc, bool context_menu, display& disp); /** From 419bf799acfe65ef23585d623246b632ebd17592 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Sun, 27 Mar 2016 22:06:53 -0400 Subject: [PATCH 184/240] Handle scrolling hotkeys in editor. --- src/editor/controller/editor_controller.cpp | 19 +++++++++++++++++-- src/editor/controller/editor_controller.hpp | 5 ++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index 6a65b61841e4..0ed396649263 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -286,6 +286,10 @@ bool editor_controller::can_execute_command(const hotkey::hotkey_command& cmd, i case HOTKEY_PREFERENCES: case HOTKEY_HELP: case HOTKEY_QUIT_GAME: + case HOTKEY_SCROLL_UP: + case HOTKEY_SCROLL_DOWN: + case HOTKEY_SCROLL_LEFT: + case HOTKEY_SCROLL_RIGHT: return true; //general hotkeys we can always do case hotkey::HOTKEY_UNIT_LIST: @@ -584,12 +588,18 @@ hotkey::ACTION_STATE editor_controller::get_action_state(hotkey::HOTKEY_COMMAND } } -bool editor_controller::execute_command(const hotkey::hotkey_command& cmd, int index) +bool editor_controller::execute_command(const hotkey::hotkey_command& cmd, int index, bool press) { const int zoom_amount = 4; hotkey::HOTKEY_COMMAND command = cmd.id; SCOPE_ED; using namespace hotkey; + + // nothing here handles release; fall through to base implementation + if (!press) { + return hotkey::command_executor::execute_command(cmd, index, press); + } + switch (command) { case HOTKEY_NULL: switch (active_menu_) { @@ -972,7 +982,7 @@ bool editor_controller::execute_command(const hotkey::hotkey_command& cmd, int i gui().invalidate_all(); return true; default: - return hotkey::command_executor::execute_command(cmd, index); + return hotkey::command_executor::execute_command(cmd, index, press); } } @@ -1356,4 +1366,9 @@ hotkey::command_executor * editor_controller::get_hotkey_command_executor() { return this; } +void editor_controller::keyboard_scroll(int x, int y) +{ + controller_base::keyboard_scroll(x, y); +} + } //end namespace editor diff --git a/src/editor/controller/editor_controller.hpp b/src/editor/controller/editor_controller.hpp index ab4cce2a4a7c..743c508c634f 100644 --- a/src/editor/controller/editor_controller.hpp +++ b/src/editor/controller/editor_controller.hpp @@ -107,7 +107,7 @@ class editor_controller : public controller_base, hotkey::ACTION_STATE get_action_state(hotkey::HOTKEY_COMMAND command, int index) const; /** command_executor override */ - bool execute_command(const hotkey::hotkey_command& command, int index = -1); + bool execute_command(const hotkey::hotkey_command& command, int index = -1, bool press=true); /** controller_base override */ void show_menu(const std::vector& items_arg, int xloc, int yloc, bool context_menu, display& disp); @@ -118,6 +118,9 @@ class editor_controller : public controller_base, /** Show the preferences dialog */ void preferences(); + /** Handle hotkeys to scroll map */ + void keyboard_scroll(int /*x*/, int /*y*/); + /** Grid toggle */ void toggle_grid(); From a58e595705248cb67e4a703d4cab8f72bf821fe4 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Sun, 27 Mar 2016 22:41:47 -0400 Subject: [PATCH 185/240] Add default hotkeys for map scrolling --- data/core/hotkeys.cfg | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/data/core/hotkeys.cfg b/data/core/hotkeys.cfg index a9cc925b2fba..f3a5622ade6f 100644 --- a/data/core/hotkeys.cfg +++ b/data/core/hotkeys.cfg @@ -13,6 +13,23 @@ #endif #enddef +[hotkey] + command=scroll-up + key=UP +[/hotkey] +[hotkey] + command=scroll-down + key=DOWN +[/hotkey] +[hotkey] + command=scroll-left + key=LEFT +[/hotkey] +[hotkey] + command=scroll-right + key=RIGHT +[/hotkey] + [hotkey] button=1 command="selectmoveaction" From 4e3d6163360f6ec532436e96e81d37b2c3c200cf Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Mon, 28 Mar 2016 21:57:58 -0400 Subject: [PATCH 186/240] Rename controller_base::keyboard_scroll. Rename to controller_base::apply_keyboard_scroll to avoid confusion with hotkey_handler::keyboard_scroll. keyboard_scroll handles the hotkey press and invokes apply_keyboard_scroll on the controller. --- src/controller_base.cpp | 2 +- src/controller_base.hpp | 2 +- src/editor/controller/editor_controller.cpp | 2 +- src/hotkey/hotkey_handler.cpp | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index b583570abf90..2573f7defda7 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -347,7 +347,7 @@ const config& controller_base::get_theme(const config& game_config, std::string return empty; } -void controller_base::keyboard_scroll(int x, int y) +void controller_base::apply_keyboard_scroll(int x, int y) { if (have_keyboard_focus()) { // clamp between -1 and 1 so key repeats don't accelerate scrolling diff --git a/src/controller_base.hpp b/src/controller_base.hpp index 2329d9fc144e..afe4540bc45b 100644 --- a/src/controller_base.hpp +++ b/src/controller_base.hpp @@ -65,7 +65,7 @@ class controller_base : public video2::draw_layering static const config &get_theme(const config& game_config, std::string theme_name); - void keyboard_scroll(int x, int y); + void apply_keyboard_scroll(int x, int y); protected: virtual bool is_browsing() const { return false; } diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index 0ed396649263..e7d37902c2ea 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -1368,7 +1368,7 @@ hotkey::command_executor * editor_controller::get_hotkey_command_executor() { void editor_controller::keyboard_scroll(int x, int y) { - controller_base::keyboard_scroll(x, y); + controller_base::apply_keyboard_scroll(x, y); } } //end namespace editor diff --git a/src/hotkey/hotkey_handler.cpp b/src/hotkey/hotkey_handler.cpp index e0b56706805e..294885a6421f 100644 --- a/src/hotkey/hotkey_handler.cpp +++ b/src/hotkey/hotkey_handler.cpp @@ -220,7 +220,7 @@ void play_controller::hotkey_handler::toggle_accelerated_speed() void play_controller::hotkey_handler::keyboard_scroll(int x, int y) { - play_controller_.keyboard_scroll(x, y); + play_controller_.apply_keyboard_scroll(x, y); } bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index, bool press) From 355b8ce1b81a84ad0d1a11aac3830f87b1f8381a Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Tue, 29 Mar 2016 23:01:14 -0400 Subject: [PATCH 187/240] Restore cycle_units/cycle_back_units hotkeys. These were accidentally removed while implementing scroll hotkeys. --- src/hotkey/command_executor.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index a6379feeb5cb..1ba01d6cb391 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -111,6 +111,10 @@ bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/ case HOTKEY_SCROLL_RIGHT: keyboard_scroll(1, 0); break; + case HOTKEY_CYCLE_UNITS: + cycle_units(); + break; + case HOTKEY_CYCLE_BACK_UNITS: cycle_back_units(); break; case HOTKEY_ENDTURN: From 94e390c067a3535e0a7294e3de3335f16fa2b9f9 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Wed, 30 Mar 2016 21:57:31 -0400 Subject: [PATCH 188/240] Gracefully handle multiple scrolling hotkeys. Track whether each scroll direction is enabled separately. This avoids odd behavior when holding multiple hotkeys for the same scroll direction. For example, holding two hotkeys for right and releasing both will no longer cause the map to begin scrolling left. --- src/controller_base.cpp | 37 +++++++++++++++------ src/controller_base.hpp | 10 ++++-- src/editor/controller/editor_controller.cpp | 19 +++++++++-- src/editor/controller/editor_controller.hpp | 5 ++- src/hotkey/command_executor.cpp | 16 ++++----- src/hotkey/command_executor.hpp | 5 ++- src/hotkey/hotkey_handler.cpp | 19 +++++++++-- src/hotkey/hotkey_handler.hpp | 5 ++- 8 files changed, 88 insertions(+), 28 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index 2573f7defda7..aad2865b65b0 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -34,8 +34,10 @@ controller_base::controller_base( : game_config_(game_config) , key_() , scrolling_(false) - , scrollx_(0) - , scrolly_(0) + , scroll_up_(false) + , scroll_down_(false) + , scroll_left_(false) + , scroll_right_(false) , joystick_manager_() { } @@ -145,9 +147,11 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags, dou } } - // scroll with keyboard - dx += scrollx_ * scroll_speed; - dy += scrolly_ * scroll_speed; + // apply keyboard scrolling + dy -= scroll_up_ * scroll_speed; + dy += scroll_down_ * scroll_speed; + dx -= scroll_left_ * scroll_speed; + dx += scroll_right_ * scroll_speed; // scroll if mouse is placed near the edge of the screen if (mouse_in_window) { @@ -347,11 +351,22 @@ const config& controller_base::get_theme(const config& game_config, std::string return empty; } -void controller_base::apply_keyboard_scroll(int x, int y) +void controller_base::set_scroll_up(bool on) { - if (have_keyboard_focus()) { - // clamp between -1 and 1 so key repeats don't accelerate scrolling - scrollx_ = std::min(1, std::max(-1, scrollx_ + x)); - scrolly_ = std::min(1, std::max(-1, scrolly_ + y)); - } + scroll_up_ = on; +} + +void controller_base::set_scroll_down(bool on) +{ + scroll_down_ = on; +} + +void controller_base::set_scroll_left(bool on) +{ + scroll_left_ = on; +} + +void controller_base::set_scroll_right(bool on) +{ + scroll_right_ = on; } diff --git a/src/controller_base.hpp b/src/controller_base.hpp index afe4540bc45b..8512661ec688 100644 --- a/src/controller_base.hpp +++ b/src/controller_base.hpp @@ -66,6 +66,10 @@ class controller_base : public video2::draw_layering static const config &get_theme(const config& game_config, std::string theme_name); void apply_keyboard_scroll(int x, int y); + void set_scroll_up(bool on); + void set_scroll_down(bool on); + void set_scroll_left(bool on); + void set_scroll_right(bool on); protected: virtual bool is_browsing() const { return false; } @@ -143,8 +147,10 @@ class controller_base : public video2::draw_layering const config& game_config_; CKey key_; bool scrolling_; - int scrollx_; - int scrolly_; + bool scroll_up_; + bool scroll_down_; + bool scroll_left_; + bool scroll_right_; joystick_manager joystick_manager_; }; diff --git a/src/editor/controller/editor_controller.cpp b/src/editor/controller/editor_controller.cpp index e7d37902c2ea..02210ba648e0 100644 --- a/src/editor/controller/editor_controller.cpp +++ b/src/editor/controller/editor_controller.cpp @@ -1366,9 +1366,24 @@ hotkey::command_executor * editor_controller::get_hotkey_command_executor() { return this; } -void editor_controller::keyboard_scroll(int x, int y) +void editor_controller::scroll_up(bool on) { - controller_base::apply_keyboard_scroll(x, y); + controller_base::set_scroll_up(on); +} + +void editor_controller::scroll_down(bool on) +{ + controller_base::set_scroll_down(on); +} + +void editor_controller::scroll_left(bool on) +{ + controller_base::set_scroll_left(on); +} + +void editor_controller::scroll_right(bool on) +{ + controller_base::set_scroll_right(on); } } //end namespace editor diff --git a/src/editor/controller/editor_controller.hpp b/src/editor/controller/editor_controller.hpp index 743c508c634f..88411d2b5188 100644 --- a/src/editor/controller/editor_controller.hpp +++ b/src/editor/controller/editor_controller.hpp @@ -119,7 +119,10 @@ class editor_controller : public controller_base, void preferences(); /** Handle hotkeys to scroll map */ - void keyboard_scroll(int /*x*/, int /*y*/); + void scroll_up(bool on); + void scroll_down(bool on); + void scroll_left(bool on); + void scroll_right(bool on); /** Grid toggle */ void toggle_grid(); diff --git a/src/hotkey/command_executor.cpp b/src/hotkey/command_executor.cpp index 1ba01d6cb391..982937f56dc9 100644 --- a/src/hotkey/command_executor.cpp +++ b/src/hotkey/command_executor.cpp @@ -79,16 +79,16 @@ bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/ switch(cmd.id) { // release a scroll key, un-apply scrolling in the given direction case HOTKEY_SCROLL_UP: - keyboard_scroll(0, 1); + scroll_up(false); break; case HOTKEY_SCROLL_DOWN: - keyboard_scroll(0, -1); + scroll_down(false); break; case HOTKEY_SCROLL_LEFT: - keyboard_scroll(1, 0); + scroll_left(false); break; case HOTKEY_SCROLL_RIGHT: - keyboard_scroll(-1, 0); + scroll_right(false); break; default: return false; // nothing else handles a hotkey release @@ -100,16 +100,16 @@ bool command_executor::execute_command(const hotkey_command& cmd, int /*index*/ // hotkey press handling switch(cmd.id) { case HOTKEY_SCROLL_UP: - keyboard_scroll(0, -1); + scroll_up(true); break; case HOTKEY_SCROLL_DOWN: - keyboard_scroll(0, 1); + scroll_down(true); break; case HOTKEY_SCROLL_LEFT: - keyboard_scroll(-1, 0); + scroll_left(true); break; case HOTKEY_SCROLL_RIGHT: - keyboard_scroll(1, 0); + scroll_right(true); break; case HOTKEY_CYCLE_UNITS: cycle_units(); diff --git a/src/hotkey/command_executor.hpp b/src/hotkey/command_executor.hpp index 52764786bb3e..8582e8ef635d 100644 --- a/src/hotkey/command_executor.hpp +++ b/src/hotkey/command_executor.hpp @@ -108,7 +108,10 @@ class command_executor virtual void left_mouse_click() {} virtual void right_mouse_click() {} virtual void toggle_accelerated_speed() {} - virtual void keyboard_scroll(int /*x*/, int /*y*/) {} + virtual void scroll_up(bool /*on*/) {} + virtual void scroll_down(bool /*on*/) {} + virtual void scroll_left(bool /*on*/) {} + virtual void scroll_right(bool /*on*/) {} virtual void lua_console(); virtual void zoom_in() {} virtual void zoom_out() {} diff --git a/src/hotkey/hotkey_handler.cpp b/src/hotkey/hotkey_handler.cpp index 294885a6421f..689887aa1b34 100644 --- a/src/hotkey/hotkey_handler.cpp +++ b/src/hotkey/hotkey_handler.cpp @@ -218,9 +218,24 @@ void play_controller::hotkey_handler::toggle_accelerated_speed() } } -void play_controller::hotkey_handler::keyboard_scroll(int x, int y) +void play_controller::hotkey_handler::scroll_up(bool on) { - play_controller_.apply_keyboard_scroll(x, y); + play_controller_.set_scroll_up(on); +} + +void play_controller::hotkey_handler::scroll_down(bool on) +{ + play_controller_.set_scroll_down(on); +} + +void play_controller::hotkey_handler::scroll_left(bool on) +{ + play_controller_.set_scroll_left(on); +} + +void play_controller::hotkey_handler::scroll_right(bool on) +{ + play_controller_.set_scroll_right(on); } bool play_controller::hotkey_handler::execute_command(const hotkey::hotkey_command& cmd, int index, bool press) diff --git a/src/hotkey/hotkey_handler.hpp b/src/hotkey/hotkey_handler.hpp index ccf5f19c2047..f24d8b8bf863 100644 --- a/src/hotkey/hotkey_handler.hpp +++ b/src/hotkey/hotkey_handler.hpp @@ -117,7 +117,10 @@ class play_controller::hotkey_handler : public hotkey::command_executor_default virtual void toggle_grid(); virtual void search(); virtual void toggle_accelerated_speed(); - virtual void keyboard_scroll(int x, int y); + virtual void scroll_up(bool on); + virtual void scroll_down(bool on); + virtual void scroll_left(bool on); + virtual void scroll_right(bool on); virtual void replay_skip_animation() override { return play_controller_.toggle_skipping_replay(); } From e066075a04f0330effef37c5629754c4271d4640 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Fri, 1 Apr 2016 07:58:39 -0400 Subject: [PATCH 189/240] Cleanup: Replace spaces with tabs --- src/controller_base.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/controller_base.cpp b/src/controller_base.cpp index aad2865b65b0..1a9e03d04e5b 100644 --- a/src/controller_base.cpp +++ b/src/controller_base.cpp @@ -157,16 +157,16 @@ bool controller_base::handle_scroll(int mousex, int mousey, int mouse_flags, dou if (mouse_in_window) { if (mousey < scroll_threshold) { dy -= scroll_speed; - } + } if (mousey > get_display().h() - scroll_threshold) { dy += scroll_speed; - } + } if (mousex < scroll_threshold) { dx -= scroll_speed; - } + } if (mousex > get_display().w() - scroll_threshold) { dx += scroll_speed; - } + } } // scroll with middle-mouse if enabled From 4af12203d8e829da24b1f2f23b23dfa7ec17636a Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 21:21:33 -0400 Subject: [PATCH 190/240] [on_undo] and [on_redo] now get a snapshot of the event context This means they can access auto-stored variables. However, using [unstore_unit] for $unit or $second_unit is not recommended. Also, $unit.x and $unit.y may not be the same as they were during the original event. (The same with $second_unit) --- changelog | 5 + src/actions/undo_action.cpp | 172 ++++++++++++++++++++++++++-- src/actions/undo_action.hpp | 56 ++++----- src/game_events/action_wml.cpp | 12 +- src/game_events/entity_location.cpp | 15 +++ src/game_events/entity_location.hpp | 1 + src/synced_context.cpp | 22 +++- src/synced_context.hpp | 24 ++-- 8 files changed, 237 insertions(+), 70 deletions(-) diff --git a/changelog b/changelog index f8247708a772..0b7f312a9d17 100644 --- a/changelog +++ b/changelog @@ -16,6 +16,11 @@ Version 1.13.4+dev: * New ~SCALE_INTO_SHARP(w,h) IPF which preserves aspect ratio, using nearest neighbor scaling. * Support delayed_variable_substitution= in [on_undo], [on_redo] + Note that this means $unit.x and $unit.y may not reflect the unit's + true location, so using [unstore_unit] on $unit may have unexpected effects. + This applies to $second_unit too. The $x1, $y1, $x2, $y2 variables work fine + though, so in most cases they can be used instead. Anything else in $unit + or $second_unit is also fine. * formula= in SUF can now reference $other_unit via the formula variable "other" * formula= now supported in location, side, and weapon filters * Weapon filters now support number, parry, accuracy, and movement_used diff --git a/src/actions/undo_action.cpp b/src/actions/undo_action.cpp index eac5b74b7233..292563b04ae9 100644 --- a/src/actions/undo_action.cpp +++ b/src/actions/undo_action.cpp @@ -2,40 +2,188 @@ #include "scripting/game_lua_kernel.hpp" #include "resources.hpp" #include "variable.hpp" // vconfig -#include "game_events/pump.hpp" //game_events::queued_event +#include "game_data.hpp" +#include "units/unit.hpp" #include +#include +#include namespace actions { + +undo_event::undo_event(const config& cmds, const game_events::queued_event& ctx) + : commands(cmds) + , data(ctx.data) + , loc1(ctx.loc1) + , loc2(ctx.loc2) + , filter_loc1(ctx.loc1.filter_x(), ctx.loc1.filter_y()) + , filter_loc2(ctx.loc2.filter_x(), ctx.loc2.filter_y()) + , uid1(), uid2() +{ + unit_const_ptr u1 = ctx.loc1.get_unit(), u2 = ctx.loc2.get_unit(); + if(u1) { + id1 = u1->id(); + uid1 = u1->underlying_id(); + } + if(u2) { + id2 = u2->id(); + uid2 = u2->underlying_id(); + } +} + +undo_event::undo_event(const config& first, const config& second, const config& weapons, const config& cmds) + : commands(cmds) + , data(weapons) + , loc1(first["x"], first["y"]) + , loc2(second["x"], second["y"]) + , filter_loc1(first["filter_x"], first["filter_y"]) + , filter_loc2(second["filter_x"], second["filter_y"]) + , uid1(first["underlying_id"]) + , uid2(second["underlying_id"]) + , id1(first["id"]) + , id2(second["id"]) +{ +} + +undo_action::undo_action() + : undo_action_base() + , replay_data() + , unit_id_diff(synced_context::get_unit_id_diff()) +{ + auto& undo = synced_context::get_undo_commands(); + auto& redo = synced_context::get_redo_commands(); + auto command_transformer = [](const std::pair& p) { + return undo_event(p.first, p.second); + }; + std::transform(undo.begin(), undo.end(), std::back_inserter(umc_commands_undo), command_transformer); + std::transform(redo.begin(), redo.end(), std::back_inserter(umc_commands_redo), command_transformer); + undo.clear(); + redo.clear(); +} + +undo_action::undo_action(const config& cfg) + : undo_action_base() + , replay_data(cfg.child_or_empty("replay_data")) + , unit_id_diff(cfg["unit_id_diff"]) +{ + read_event_vector(umc_commands_undo, cfg, "undo_actions"); + read_event_vector(umc_commands_redo, cfg, "redo_actions"); +} + +namespace { + unit_ptr get_unit(size_t uid, const std::string& id) { + assert(resources::units); + auto iter = resources::units->find(uid); + if(!iter.valid() || iter->id() != id) { + return nullptr; + } + return iter.get_shared_ptr(); + } + void execute_event(const undo_event& e, std::string tag) { + assert(resources::lua_kernel); + assert(resources::gamedata); + + config::attribute_value& x1 = resources::gamedata->get_variable("x1"); + config::attribute_value& y1 = resources::gamedata->get_variable("y1"); + config::attribute_value& x2 = resources::gamedata->get_variable("x2"); + config::attribute_value& y2 = resources::gamedata->get_variable("y2"); + int oldx1 = x1, oldy1 = y1, oldx2 = x2, oldy2 = y2; + x1 = e.filter_loc1.x + 1; y1 = e.filter_loc1.y + 1; + x2 = e.filter_loc2.x + 1; y2 = e.filter_loc2.y + 1; + + int realx1, realy1, realx2, realy2; + boost::scoped_ptr u1, u2; + if(unit_ptr who = get_unit(e.uid1, e.id1)) { + realx1 = who->get_location().x; + realy1 = who->get_location().y; + who->set_location(e.loc1); + u1.reset(new scoped_xy_unit("unit", realx1, realy1, *resources::units)); + } + if(unit_ptr who = get_unit(e.uid2, e.id2)) { + realx2 = who->get_location().x; + realy2 = who->get_location().y; + who->set_location(e.loc2); + u2.reset(new scoped_xy_unit("unit", realx2, realy2, *resources::units)); + } + + scoped_weapon_info w1("weapon", e.data.child("first")); + scoped_weapon_info w2("second_weapon", e.data.child("second")); + + game_events::queued_event q(tag, map_location(x1, y1), map_location(x2, y2), e.data); + resources::lua_kernel->run_wml_action("command", vconfig(e.commands), q); + + if(u1) { + unit_ptr who = get_unit(e.uid1, e.id1); + who->set_location(map_location(realx1, realy1)); + } + if(u2) { + unit_ptr who = get_unit(e.uid2, e.id2); + who->set_location(map_location(realx2, realy2)); + } + + x1 = oldx1; y1 = oldy1; + x2 = oldx2; y2 = oldy2; + } +} + void undo_action::execute_undo_umc_wml() { - assert(resources::lua_kernel); - for(const config& c : umc_commands_undo) + for(const undo_event& e : umc_commands_undo) { - resources::lua_kernel->run_wml_action("command", vconfig(c), game_events::queued_event("undo", map_location(), map_location(), config())); + execute_event(e, "undo"); } } void undo_action::execute_redo_umc_wml() { assert(resources::lua_kernel); - for(const config& c : umc_commands_redo) + assert(resources::gamedata); + for(const undo_event& e : umc_commands_redo) { - resources::lua_kernel->run_wml_action("command", vconfig(c), game_events::queued_event("redo", map_location(), map_location(), config())); + execute_event(e, "redo"); } } -void undo_action::read_tconfig_vector(tconfig_vector& vec, const config& cfg, const std::string& tag) +void undo_action::write(config & cfg) const { - config::const_child_itors r = cfg.child_range(tag); - vec.insert(vec.end(), r.first, r.second); + cfg.add_child("replay_data", replay_data); + cfg["unit_id_diff"] = unit_id_diff; + write_event_vector(umc_commands_undo, cfg, "undo_actions"); + write_event_vector(umc_commands_redo, cfg, "redo_actions"); + undo_action_base::write(cfg); } -void undo_action::write_tconfig_vector(const tconfig_vector& vec, config& cfg, const std::string& tag) + +void undo_action::read_event_vector(event_vector& vec, const config& cfg, const std::string& tag) +{ + for(auto c : cfg.child_range(tag)) { + vec.emplace_back(c.child("filter"), c.child("filter_second"), c.child("filter_weapons"), c.child("commands")); + } +} + +void undo_action::write_event_vector(const event_vector& vec, config& cfg, const std::string& tag) { - for(const config& c : vec) + for(const auto& evt : vec) { - cfg.add_child(tag, c); + config& entry = cfg.add_child(tag); + config& first = entry.add_child("filter"); + config& second = entry.add_child("filter_second"); + entry.add_child("filter_weapons", evt.data); + entry.add_child("command", evt.commands); + // First location + first["filter_x"] = evt.filter_loc1.x; + first["filter_y"] = evt.filter_loc1.y; + first["underlying_id"] = evt.uid1; + first["id"] = evt.id1; + first["x"] = evt.loc1.x; + first["y"] = evt.loc1.y; + // Second location + second["filter_x"] = evt.filter_loc2.x; + second["filter_y"] = evt.filter_loc2.y; + second["underlying_id"] = evt.uid2; + second["id"] = evt.id2; + second["x"] = evt.loc2.x; + second["y"] = evt.loc2.y; } } diff --git a/src/actions/undo_action.hpp b/src/actions/undo_action.hpp index 8917bd21b8b3..3021a66ed723 100644 --- a/src/actions/undo_action.hpp +++ b/src/actions/undo_action.hpp @@ -4,14 +4,23 @@ #include "map/location.hpp" #include "units/ptr.hpp" #include "synced_context.hpp" +#include "game_events/pump.hpp" // for queued_event +#include "config.hpp" #include -#include #include + namespace actions { class undo_list; -} -namespace actions { + + struct undo_event { + config commands, data; + map_location loc1, loc2, filter_loc1, filter_loc2; + size_t uid1, uid2; + std::string id1, id2; + undo_event(const config& cmds, const game_events::queued_event& ctx); + undo_event(const config& first, const config& second, const config& weapons, const config& cmds); + }; /// Records information to be able to undo an action. /// Each type of action gets its own derived type. @@ -40,38 +49,13 @@ namespace actions { /// Default constructor. /// It is assumed that undo actions are contructed after the action is performed /// so that the unit id diff does not change after this contructor. - undo_action() - : undo_action_base() - , replay_data() - , unit_id_diff(synced_context::get_unit_id_diff()) - , umc_commands_undo() - , umc_commands_redo() - { - umc_commands_undo.swap(synced_context::get_undo_commands()); - umc_commands_redo.swap(synced_context::get_redo_commands()); - } - undo_action(const config& cfg) - : undo_action_base() - , replay_data(cfg.child_or_empty("replay_data")) - , unit_id_diff(cfg["unit_id_diff"]) - , umc_commands_undo() - , umc_commands_redo() - { - read_tconfig_vector(umc_commands_undo, cfg, "undo_actions"); - read_tconfig_vector(umc_commands_redo, cfg, "redo_actions"); - } + undo_action(); + undo_action(const config& cfg); // Virtual destructor to support derived classes. virtual ~undo_action() {} /// Writes this into the provided config. - virtual void write(config & cfg) const - { - cfg.add_child("replay_data", replay_data); - cfg["unit_id_diff"] = unit_id_diff; - write_tconfig_vector(umc_commands_undo, cfg, "undo_actions"); - write_tconfig_vector(umc_commands_redo, cfg, "redo_actions"); - undo_action_base::write(cfg); - } + virtual void write(config & cfg) const; /// Undoes this action. /// @return true on success; false on an error. @@ -87,14 +71,14 @@ namespace actions { /// TODO: does it really make sense to allow undoing if the unit id counter has changed? int unit_id_diff; /// actions wml (specified by wml) that should be executed when undoing this command. - typedef boost::ptr_vector tconfig_vector; - tconfig_vector umc_commands_undo; - tconfig_vector umc_commands_redo; + typedef std::vector event_vector; + event_vector umc_commands_undo; + event_vector umc_commands_redo; void execute_undo_umc_wml(); void execute_redo_umc_wml(); - static void read_tconfig_vector(tconfig_vector& vec, const config& cfg, const std::string& tag); - static void write_tconfig_vector(const tconfig_vector& vec, config& cfg, const std::string& tag); + static void read_event_vector(event_vector& vec, const config& cfg, const std::string& tag); + static void write_event_vector(const event_vector& vec, config& cfg, const std::string& tag); }; /// entry for player actions that do not need any special code to be performed when undoing such as right-click menu items. diff --git a/src/game_events/action_wml.cpp b/src/game_events/action_wml.cpp index 54eeb1153cb9..94bde22c213c 100644 --- a/src/game_events/action_wml.cpp +++ b/src/game_events/action_wml.cpp @@ -1180,21 +1180,21 @@ WML_HANDLER_FUNCTION(volume,, cfg) } -WML_HANDLER_FUNCTION(on_undo,, cfg) +WML_HANDLER_FUNCTION(on_undo, event_info, cfg) { if(cfg["delayed_variable_substitution"].to_bool(false)) { - synced_context::add_undo_commands(cfg.get_config()); + synced_context::add_undo_commands(cfg.get_config(), event_info); } else { - synced_context::add_undo_commands(cfg.get_parsed_config()); + synced_context::add_undo_commands(cfg.get_parsed_config(), event_info); } } -WML_HANDLER_FUNCTION(on_redo,, cfg) +WML_HANDLER_FUNCTION(on_redo, event_info, cfg) { if(cfg["delayed_variable_substitution"].to_bool(false)) { - synced_context::add_redo_commands(cfg.get_config()); + synced_context::add_redo_commands(cfg.get_config(), event_info); } else { - synced_context::add_redo_commands(cfg.get_parsed_config()); + synced_context::add_redo_commands(cfg.get_parsed_config(), event_info); } } diff --git a/src/game_events/entity_location.cpp b/src/game_events/entity_location.cpp index 75f6eed4526c..0a029d63229c 100644 --- a/src/game_events/entity_location.cpp +++ b/src/game_events/entity_location.cpp @@ -104,5 +104,20 @@ bool entity_location::matches_unit_filter(const unit_map::const_iterator & un_it matches_unit(un_it); } +unit_const_ptr entity_location::get_unit() const +{ + if(resources::units == nullptr) { + return nullptr; + } + if(id_ == 0) { + auto un_it = resources::units->find(*this); + if(un_it.valid()) { + return un_it.get_shared_ptr(); + } + return nullptr; + } + return resources::units->find(id_).get_shared_ptr(); +} + } // end namespace game_events diff --git a/src/game_events/entity_location.hpp b/src/game_events/entity_location.hpp index dd6bc6dc3c45..d8d07c5665e1 100644 --- a/src/game_events/entity_location.hpp +++ b/src/game_events/entity_location.hpp @@ -41,6 +41,7 @@ namespace game_events bool matches_unit(const unit_map::const_iterator & un_it) const; bool matches_unit_filter(const unit_map::const_iterator & un_it, const vconfig & filter) const; + unit_const_ptr get_unit() const; static const entity_location null_entity; diff --git a/src/synced_context.cpp b/src/synced_context.cpp index 0640d399d7ed..5b8a1e341a9c 100644 --- a/src/synced_context.cpp +++ b/src/synced_context.cpp @@ -53,8 +53,8 @@ static lg::log_domain log_replay("replay"); synced_context::synced_state synced_context::state_ = synced_context::UNSYNCED; int synced_context::last_unit_id_ = 0; -synced_context::tconfig_vector synced_context::undo_commands_ = synced_context::tconfig_vector(); -synced_context::tconfig_vector synced_context::redo_commands_ = synced_context::tconfig_vector(); +synced_context::event_list synced_context::undo_commands_; +synced_context::event_list synced_context::redo_commands_; bool synced_context::is_simultaneously_ = false; bool synced_context::run(const std::string& commandname, const config& data, bool use_undo, bool show, synced_command::error_handler_function error_handler) @@ -383,14 +383,24 @@ config synced_context::ask_server_choice(const server_choice& sch) } } -void synced_context::add_undo_commands(const config& commands) +void synced_context::add_undo_commands(const config& commands, const game_events::queued_event& ctx) { - undo_commands_.insert(undo_commands_.begin(), new config(commands)); + undo_commands_.emplace_front(commands, ctx); } -void synced_context::add_redo_commands(const config& commands) +void synced_context::add_redo_commands(const config& commands, const game_events::queued_event& ctx) { - redo_commands_.insert(redo_commands_.begin(), new config(commands)); + redo_commands_.emplace_front(commands, ctx); +} + +void synced_context::reset_undo_commands() +{ + undo_commands_.clear(); +} + +void synced_context::reset_redo_commands() +{ + redo_commands_.clear(); } set_scontext_synced_base::set_scontext_synced_base() diff --git a/src/synced_context.hpp b/src/synced_context.hpp index 5d23922d3208..977c39c89bdd 100644 --- a/src/synced_context.hpp +++ b/src/synced_context.hpp @@ -24,10 +24,14 @@ #include "mouse_handler_base.hpp" #include #include -#include +#include class config; +namespace game_events { + struct queued_event; +} + //only static methods. class synced_context { @@ -147,13 +151,13 @@ class synced_context */ static config ask_server_choice(const server_choice&); - typedef boost::ptr_vector tconfig_vector; - static tconfig_vector& get_undo_commands() { return undo_commands_; } - static tconfig_vector& get_redo_commands() { return redo_commands_; } - static void add_undo_commands(const config& commands); - static void add_redo_commands(const config& commands); - static void reset_undo_commands() { undo_commands_ = tconfig_vector(); } - static void reset_redo_commands() { redo_commands_ = tconfig_vector(); } + typedef std::deque> event_list; + static event_list& get_undo_commands() { return undo_commands_; } + static event_list& get_redo_commands() { return redo_commands_; } + static void add_undo_commands(const config& commands, const game_events::queued_event& ctx); + static void add_redo_commands(const config& commands, const game_events::queued_event& ctx); + static void reset_undo_commands(); + static void reset_redo_commands(); private: /* weather we are in a synced move, in a user_choice, or none of them @@ -175,11 +179,11 @@ class synced_context /** Actions wml to be executed when the current actio is undone. */ - static tconfig_vector undo_commands_; + static event_list undo_commands_; /** Actions wml to be executed when the current actio is redone. */ - static tconfig_vector redo_commands_; + static event_list redo_commands_; }; From 8cbd358baf57b93166b70f339948ffc4b88ae097 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 22:09:13 -0400 Subject: [PATCH 191/240] tloadscreen: Minor rearrangement of elements --- data/gui/window/loadscreen.cfg | 30 +++++++++++++++--------------- 1 file changed, 15 insertions(+), 15 deletions(-) diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg index 0da663c1151b..bfc28156f090 100644 --- a/data/gui/window/loadscreen.cfg +++ b/data/gui/window/loadscreen.cfg @@ -45,7 +45,7 @@ [column] [spacer] - height = "((screen_height - if(screen_height < 800, 400, 0)) / 4)" + height = "((screen_height - if(screen_height < 800, 200, 0)) / 3.5)" [/spacer] [/column] @@ -75,7 +75,7 @@ {_GUI_PADDING} [row] - grow_factor = 1 + grow_factor = 2 [column] grow_factor = 1 @@ -100,22 +100,20 @@ grow_factor = 1 border = "all" border_size = 5 - horizontal_grow = "true" + horizontal_alignment = "center" vertical_alignment = "center" - [label] - text_alignment = "center" - definition = "default_large" - id = "status" - label = _ "Loading..." - [/label] + [image] + definition = "decoration" + label = "misc/loadscreen_decor.png" + [/image] [/column] [/row] [row] - grow_factor = 0 + grow_factor = 1 [column] grow_factor = 1 @@ -142,13 +140,15 @@ grow_factor = 1 border = "all" border_size = 5 - horizontal_alignment = "center" + horizontal_grow = "true" vertical_alignment = "center" - [image] - definition = "decoration" - label = "misc/loadscreen_decor.png" - [/image] + [label] + text_alignment = "center" + definition = "default_large" + id = "status" + label = _ "Loading..." + [/label] [/column] From 1afa45a53e16115811986bcc51d33043259f8d90 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 22:56:58 -0400 Subject: [PATCH 192/240] Fix crash if Lua initialization routines put up a dialog during the loading screen --- src/events.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/src/events.cpp b/src/events.cpp index 1e422d473a38..0917720f3a38 100644 --- a/src/events.cpp +++ b/src/events.cpp @@ -34,6 +34,7 @@ #include #include #include +#include #define ERR_GEN LOG_STREAM(err, lg::general) @@ -332,9 +333,14 @@ static bool remove_on_resize(const SDL_Event &a) { return false; } - +// TODO: I'm uncertain if this is always safe to call at static init; maybe set in main() instead? +static const boost::thread::id main_thread = boost::this_thread::get_id(); void pump() { + if(boost::this_thread::get_id() != main_thread) { + // Can only call this on the main thread! + return; + } SDL_PumpEvents(); peek_for_resize(); pump_info info; From 1e5e071734e551fb81d0bc068535b828ad5a3172 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 5 Apr 2016 22:57:47 -0400 Subject: [PATCH 193/240] BOOST_STATIC_ASSERT -> static_assert --- src/display.cpp | 2 +- src/gui/auxiliary/field.hpp | 8 +++----- src/gui/auxiliary/formula.hpp | 4 +--- src/gui/core/timer.cpp | 4 +--- src/serialization/unicode.hpp | 1 - src/units/types.cpp | 3 +-- src/utils/reference_counter.hpp | 3 +-- 7 files changed, 8 insertions(+), 17 deletions(-) diff --git a/src/display.cpp b/src/display.cpp index 8196908faadc..79d8a52a1c7a 100644 --- a/src/display.cpp +++ b/src/display.cpp @@ -1300,7 +1300,7 @@ inline display::drawing_buffer_key::drawing_buffer_key(const map_location &loc, SHIFT_Y = BITS_FOR_X_PARITY + SHIFT_X_PARITY, SHIFT_LAYER_GROUP = BITS_FOR_Y + SHIFT_Y }; - BOOST_STATIC_ASSERT(SHIFT_LAYER_GROUP + BITS_FOR_LAYER_GROUP == sizeof(key_) * 8); + static_assert(SHIFT_LAYER_GROUP + BITS_FOR_LAYER_GROUP == sizeof(key_) * 8, "Bit field too small"); // the parity of x must be more significant than the layer but less significant than y. // Thus basically every row is split in two: First the row containing all the odd x diff --git a/src/gui/auxiliary/field.hpp b/src/gui/auxiliary/field.hpp index 20ef5e5385fd..e7acae114e1a 100644 --- a/src/gui/auxiliary/field.hpp +++ b/src/gui/auxiliary/field.hpp @@ -31,8 +31,6 @@ #include "gui/widgets/window.hpp" #include "wml_exception.hpp" -#include - namespace gui2 { @@ -289,7 +287,7 @@ class tfield : public tfield_ , callback_load_value_(callback_load_value) , callback_save_value_(callback_save_value) { - BOOST_STATIC_ASSERT((!boost::is_same::value)); + static_assert((!boost::is_same::value), "Second template argument cannot be tcontrol"); } /** @@ -313,7 +311,7 @@ class tfield : public tfield_ , callback_load_value_(std::function()) , callback_save_value_(std::function()) { - BOOST_STATIC_ASSERT((!boost::is_same::value)); + static_assert((!boost::is_same::value), "Second template argument cannot be tcontrol"); } /** @@ -340,7 +338,7 @@ class tfield : public tfield_ , callback_load_value_(std::function()) , callback_save_value_(std::function()) { - BOOST_STATIC_ASSERT((boost::is_same::value)); + static_assert((boost::is_same::value), "Second template argument must be tcontrol"); } /** Inherited from tfield_. */ diff --git a/src/gui/auxiliary/formula.hpp b/src/gui/auxiliary/formula.hpp index 9d7a4ef43240..cbe4b9ed47cf 100644 --- a/src/gui/auxiliary/formula.hpp +++ b/src/gui/auxiliary/formula.hpp @@ -24,8 +24,6 @@ #include "util.hpp" #include "tstring.hpp" -#include - #include namespace gui2 @@ -235,7 +233,7 @@ tformula::execute(const game_logic::map_formula_callable& /*variables*/ { // Every type needs its own execute function avoid instantiation of the // default execute. - BOOST_STATIC_ASSERT(sizeof(T) == 0); + static_assert(sizeof(T) == 0, "tformula: Missing execute specialization"); return T(); } diff --git a/src/gui/core/timer.cpp b/src/gui/core/timer.cpp index 97f325e43212..ab31805cf59b 100644 --- a/src/gui/core/timer.cpp +++ b/src/gui/core/timer.cpp @@ -17,8 +17,6 @@ #include "events.hpp" #include "gui/core/log.hpp" -#include - #include #include @@ -115,7 +113,7 @@ size_t add_timer(const Uint32 interval, const std::function& callback, const bool repeat) { - BOOST_STATIC_ASSERT(sizeof(size_t) == sizeof(void*)); + static_assert(sizeof(size_t) == sizeof(void*), "Pointer and size_t are not the same size"); DBG_GUI_E << "Adding timer.\n"; diff --git a/src/serialization/unicode.hpp b/src/serialization/unicode.hpp index c02b75a55b94..cb024d7e8b7a 100644 --- a/src/serialization/unicode.hpp +++ b/src/serialization/unicode.hpp @@ -21,7 +21,6 @@ #include "ucs4_convert_impl.hpp" #include "unicode_cast.hpp" -#include #include #include diff --git a/src/units/types.cpp b/src/units/types.cpp index 8582df2df7ff..36fb6064f6bf 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -34,7 +34,6 @@ #include "gui/auxiliary/formula.hpp" #include "gui/dialogs/loadscreen.hpp" -#include #include static lg::log_domain log_config("config"); @@ -830,7 +829,7 @@ MAKE_ENUM (ALIGNMENT_FEMALE_VARIATION, std::string unit_type::alignment_description(ALIGNMENT align, unit_race::GENDER gender) { - BOOST_STATIC_ASSERT(ALIGNMENT_FEMALE_VARIATION::count == ALIGNMENT::count); + static_assert(ALIGNMENT_FEMALE_VARIATION::count == ALIGNMENT::count, "ALIGNMENT_FEMALE_VARIATION and ALIGNMENT do not have the same number of values"); assert(align.valid()); std::string str = std::string(); if (gender == unit_race::FEMALE) { diff --git a/src/utils/reference_counter.hpp b/src/utils/reference_counter.hpp index 70f21c11d05f..995e638384f4 100644 --- a/src/utils/reference_counter.hpp +++ b/src/utils/reference_counter.hpp @@ -21,7 +21,6 @@ #include -#include namespace n_ref_counter { @@ -32,7 +31,7 @@ namespace n_ref_counter { So any negative count disables reference counting. **/ template class t_ref_counter { - BOOST_STATIC_ASSERT( std::numeric_limits::is_signed); + static_assert(std::numeric_limits::is_signed, "Reference counter must be a signed integer"); T_integral count_; From 7525646cd0cb244a1d435b1e20d3c3fd99112e40 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Wed, 6 Apr 2016 23:12:08 +1100 Subject: [PATCH 194/240] tunit_preview_pane: redesigned Minimal style This restores the title and image and replaces the icons with labels. --- data/gui/widget/unit_preview_pane.cfg | 91 ++++++++++++++++++--------- 1 file changed, 61 insertions(+), 30 deletions(-) diff --git a/data/gui/widget/unit_preview_pane.cfg b/data/gui/widget/unit_preview_pane.cfg index 2dc6bbe7cc45..1d638319c4f9 100644 --- a/data/gui/widget/unit_preview_pane.cfg +++ b/data/gui/widget/unit_preview_pane.cfg @@ -132,6 +132,24 @@ #define _GUI_UNIT_PREVIEW_PANE_MINIMAL [grid] + [row] + grow_factor = 0 + + [column] + border = "bottom" + border_size = 5 + horizontal_alignment = "center" + vertical_alignment = "center" + + [image] + id = "type_image" + definition = "default" + [/image] + + [/column] + + [/row] + [row] grow_factor = 0 @@ -153,51 +171,64 @@ [row] grow_factor = 0 - [column] + border = "bottom" + border_size = 5 + vertical_grow = "true" horizontal_grow = "true" - [grid] + [label] + id = "type_name" + wrap = "true" + [/label] - [row] - grow_factor = 1 + [/column] - [column] - border = "right,bottom" - border_size = 5 - horizontal_alignment = "left" + [/row] + + [row] + grow_factor = 0 - [label] - id = "type_level" - [/label] + [column] + border = "right,bottom" + border_size = 5 + horizontal_alignment = "left" - [/column] + [label] + id = "type_level" + [/label] - [column] - border = "right,bottom" - border_size = 5 - horizontal_alignment = "left" + [/column] - [image] - id = "type_race" - [/image] + [/row] - [/column] + [row] + grow_factor = 0 - [column] - border = "bottom" - border_size = 5 - horizontal_alignment = "left" + [column] + border = "right,bottom" + border_size = 5 + horizontal_alignment = "left" - [image] - id = "type_alignment" - [/image] + [label] + id = "type_race" + [/label] - [/column] + [/column] - [/row] + [/row] - [/grid] + [row] + grow_factor = 0 + + [column] + border = "right,bottom" + border_size = 5 + horizontal_alignment = "left" + + [label] + id = "type_alignment" + [/label] [/column] From 396af2d0d8cb7acc0d3b7196e8e2c4d88081dc77 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 6 Apr 2016 13:00:14 -0400 Subject: [PATCH 195/240] Fix MSVC 2013 compile error --- src/synced_context.hpp | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/src/synced_context.hpp b/src/synced_context.hpp index 977c39c89bdd..e3c9cf56e2c3 100644 --- a/src/synced_context.hpp +++ b/src/synced_context.hpp @@ -20,6 +20,7 @@ #include "replay.hpp" #include "random_new.hpp" #include "random_new_synced.hpp" +#include "game_events/pump.hpp" // for queued_event #include "generic_event.hpp" #include "mouse_handler_base.hpp" #include @@ -28,10 +29,6 @@ class config; -namespace game_events { - struct queued_event; -} - //only static methods. class synced_context { From 21965b40e5bf1cff56d776d6342563b2b49d3b6f Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 6 Apr 2016 13:31:38 -0400 Subject: [PATCH 196/240] Font scaling minimum to 80% and adjust vertical centering formula [ci skip] --- data/gui/macros/_initial.cfg | 2 +- data/gui/window/preferences/03_display.cfg | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/data/gui/macros/_initial.cfg b/data/gui/macros/_initial.cfg index 5f93746827f4..c2d38d1feeb2 100644 --- a/data/gui/macros/_initial.cfg +++ b/data/gui/macros/_initial.cfg @@ -29,7 +29,7 @@ # If the text is too high it returns the top side. # Rounding happens to the bottom side. #define GUI__TEXT_VERTICALLY_CENTRED - "(if(text_height < height, (height - text_height - 2) / 2, 0))" + "(if(text_height < height, (height - text_height + 2) / 2, 0))" #enddef #define GUI__CENTERED_TEXT FONT_SIZE FONT_STYLE FONT_COLOR diff --git a/data/gui/window/preferences/03_display.cfg b/data/gui/window/preferences/03_display.cfg index efe34cfac20d..d838993ccd67 100644 --- a/data/gui/window/preferences/03_display.cfg +++ b/data/gui/window/preferences/03_display.cfg @@ -253,7 +253,7 @@ [slider] id = "scaling_slider" definition = "minimal" - minimum_value,maximum_value=100,200 + minimum_value,maximum_value=80,200 step_size=5 tooltip= _ "Set the scaling factor of fonts" [/slider] From c9ecd5a15da849760ec7037a6808f3643bcce531 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Thu, 7 Apr 2016 01:00:56 +0200 Subject: [PATCH 197/240] disable c++14 build Travis fails to build with c++14 because the default installed compiler (or rather the default libstdc++ from gcc 4.8) doesn't support it, i tried to fix it by changing the the install script to install gcc5 but somhow that failed too. Since noone in our active dev team can fix this, we disable this for now. But i'd be useful if this was reenabled and fixed at some point. --- .travis.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.travis.yml b/.travis.yml index e9c76bbd7e44..7c82a2392d45 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ compiler: env: - BUILD="-O0" - BUILD="-O2" - - BUILD="C++14 -O2" - BUILD="translations" matrix: From 3b4b858a40d251cb4a3662d894843af7b947dfff Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 6 Apr 2016 19:46:49 -0400 Subject: [PATCH 198/240] DW S10: Fix invalid [object] IDs --- .../Dead_Water/scenarios/10_The_Flaming_Sword.cfg | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/data/campaigns/Dead_Water/scenarios/10_The_Flaming_Sword.cfg b/data/campaigns/Dead_Water/scenarios/10_The_Flaming_Sword.cfg index 382203f6c391..16b855207bf0 100644 --- a/data/campaigns/Dead_Water/scenarios/10_The_Flaming_Sword.cfg +++ b/data/campaigns/Dead_Water/scenarios/10_The_Flaming_Sword.cfg @@ -233,7 +233,7 @@ # This is where the lich starts, so he will pick up this # object immediately: - {FLAMING_SWORD 37 3 flaming-sword1} + {FLAMING_SWORD 37 3 flaming_sword1} [recall] id=Caladon @@ -667,7 +667,7 @@ # (because he will be near the top of the screen). [/delay] - {FLAMING_SWORD $x1 $y1 flaming-sword2} + {FLAMING_SWORD $x1 $y1 flaming_sword2} [object] id=drop_staff silent=yes @@ -978,7 +978,7 @@ equals=yes [/variable] [then] - {FLAMING_SWORD $sword_x $sword_y flaming-sword3} + {FLAMING_SWORD $sword_x $sword_y flaming_sword3} {CLEAR_VARIABLE get_sword} {CLEAR_VARIABLE sword_x} {CLEAR_VARIABLE sword_y} @@ -1021,7 +1021,7 @@ equals=yes [/variable] [then] - {FLAMING_SWORD $sword_x $sword_y flaming-sword3} + {FLAMING_SWORD $sword_x $sword_y flaming_sword3} {CLEAR_VARIABLE get_sword} {CLEAR_VARIABLE sword_x} {CLEAR_VARIABLE sword_y} From 7aa0f77837cc1de41c5a6656fc0cf389b1535b08 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 7 Apr 2016 12:51:13 +1100 Subject: [PATCH 199/240] Proper full alignment icon set by LordBob --- .../alignment_chaotic_30-pressed.png | Bin 0 -> 1347 bytes .../alignment_chaotic_30-pressed@2x.png | Bin 0 -> 1766 bytes .../icons/alignments/alignment_chaotic_30.png | Bin 401 -> 1329 bytes .../alignments/alignment_chaotic_30@2x.png | Bin 0 -> 1673 bytes .../alignments/alignment_lawful_30-pressed.png | Bin 0 -> 1512 bytes .../alignment_lawful_30-pressed@2x.png | Bin 0 -> 1936 bytes .../icons/alignments/alignment_lawful_30.png | Bin 672 -> 1474 bytes .../alignments/alignment_lawful_30@2x.png | Bin 0 -> 1820 bytes .../alignment_liminal_30-pressed.png | Bin 0 -> 1343 bytes .../alignment_liminal_30-pressed@2x.png | Bin 0 -> 1548 bytes .../icons/alignments/alignment_liminal_30.png | Bin 316 -> 1294 bytes .../alignments/alignment_liminal_30@2x.png | Bin 0 -> 1536 bytes .../alignment_neutral_30-pressed.png | Bin 0 -> 1592 bytes .../alignment_neutral_30-pressed@2x.png | Bin 0 -> 2169 bytes .../icons/alignments/alignment_neutral_30.png | Bin 570 -> 1551 bytes .../alignments/alignment_neutral_30@2x.png | Bin 0 -> 1986 bytes 16 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/icons/alignments/alignment_chaotic_30-pressed.png create mode 100644 images/icons/alignments/alignment_chaotic_30-pressed@2x.png create mode 100644 images/icons/alignments/alignment_chaotic_30@2x.png create mode 100644 images/icons/alignments/alignment_lawful_30-pressed.png create mode 100644 images/icons/alignments/alignment_lawful_30-pressed@2x.png create mode 100644 images/icons/alignments/alignment_lawful_30@2x.png create mode 100644 images/icons/alignments/alignment_liminal_30-pressed.png create mode 100644 images/icons/alignments/alignment_liminal_30-pressed@2x.png create mode 100644 images/icons/alignments/alignment_liminal_30@2x.png create mode 100644 images/icons/alignments/alignment_neutral_30-pressed.png create mode 100644 images/icons/alignments/alignment_neutral_30-pressed@2x.png create mode 100644 images/icons/alignments/alignment_neutral_30@2x.png diff --git a/images/icons/alignments/alignment_chaotic_30-pressed.png b/images/icons/alignments/alignment_chaotic_30-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..12280c6612b15029e4ed816059782fa3b97b4400 GIT binary patch literal 1347 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|X-o3pW@ zxwECEk&&5&p`nF=g|V}-rJIw1k&%m~lO@ayYKL?fq0y6ST@{2R_ z3lyA#%@j0z6O%LZKmwYe2!i<6CABECEH%ZgC_h&L9Ku$aSX^M@$jF&pwsF_LUElizXW`iJH}4PD{^7Xv;DtumSUko&@i=Hv>7 zvsb6{FIgrOcYI&4(G9!Vj8fUhj5lumv&{9f~{@`Sj1(X`GJu7E<-lYInwq#j_p4rDso_C}43zvghwy-yUvL%}ej} zo6cFce*Sw=vG9HN$5VFtSIqc_PLs3EgzvtbOPSqKzA1z+YaWh@8+GvaGD${-0ho@}b z$k_C4f?9DAV?WpadKJB{8xnnS$reA#I#005%>8Y$a@DizcP)4pJ#qWaDf8ia`H_{8 zb92;VnAl@P7PYtj%dxVxuKD{qxKsP%{gcxfm>DLYKV0*EE#o0jvF7RO=d#Wzp$P!z C6WuHT literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_chaotic_30-pressed@2x.png b/images/icons/alignments/alignment_chaotic_30-pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..6cdc5d361c130357cd7de7755eed6ec4f08d7310 GIT binary patch literal 1766 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 delta 374 zcmV-+0g3*x3XublB!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra3KJADF{=#dt^fc59!W$&R7l6|mQQNJP!NYDLOh1xD(8@1Kv6fk7ve&D z0@u3IOLWsNynz>R<)4LQ5y76Ii&9r#7aiddl9qWBXbbs42!A~C&2Pw?nfGe7N|k3lr;x5rfEzFYf^V1r7z6JP_o^y5V3;v|P_S*M;sHh)<7WqqJ+^7$@GlzhBGA#N zI;9(q662x)KW_w@89HKi-zp9CCQxKBj(m*I0)@sATllMs+GAhBq`fD-(-?2$-7*+A zGqF?y#8O;S86XWU*ar@Vb~*rk->jFO10)8P)?;zyF*4VtWAVRSje_ceSm{sb6S^fQ UuK?6O(*OVf07*qoM6N<$g1XI_g#Z8m diff --git a/images/icons/alignments/alignment_chaotic_30@2x.png b/images/icons/alignments/alignment_chaotic_30@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..92e1837c7347e0e4ced5e6191922f1d514a155a8 GIT binary patch literal 1673 zcmbVNX;2eq7!G0;aX7?k3sdT{KtY6Tc5|;pOtJ}wgd?FP6%S&vgp?#3H!CDm<*=>N z8LNXhR_t)vI#w%KbR3~nt8F<(2P=YzXsJbvh^aCZTD8~>66+7gAKiI(zw3RT_xxtd z(o*7myo0xd0FkZ98AaV4(N z**A9JG{Q62kfEm3ieywvn3x)u4%23`&}f=0&SueQ^Kc5-fa?ur5%@>T84xh&L|`UY z!BSYHc&;I#ki=DmDH+M->m@tRSLFMt6uLMNB!rA5PltDI)1%jC@$YgTGHLY!>l=y#cyj0toVYlFr z61NhYNG)BDoKQEI&fTjGxfE${&{Wbu7e!;l2<;{lZl)435lEjfbp{I%2@63mp+xBBco|mC63S&_u0+n^@?luU6>#JNIZwu7b0h*jiwnE4 ziDoOMF>7(RT?1`*1}lCg7L}5?h9bxef-t%}AT5`m2x~530i-G(5UJ2;4QAKIQdfbV z#f#yjAs^StNx}q7XBaiS!~;HykI7h=OoAaScjTB*AQp=`JPDt}1!u6j|C2R{b_Q~_ z#|!P^-lBWZHGSUv^y2yT!OirYA?eGJQ&C>eV9Yv|h>0_7{iBtw$ZWBHTfs3wD!9ka z2!D5ns2D6SPnR6uQND25!K4%n8w#H7OzCkv?Y+=5aO39I3ltQe+SAu^eZO<+{$^@2 zTKmn#Db-!w)1#4%vzEOeT>%e6)Yi5wCl>POTr0}!8H8jP{UaB@b_7~s&s47s+bPV~7L?m^}dHZf% z?#;~n;ACjrfvX1|&)v+us*hOPTsP4%Iq_R?NS@sQH>@dq-_vjQyyaPWduy&Rw}<&l zKM5+Bzk7+(yZFh9{#wzay^9<>eUzxOe*XD+b=DK7OqK1j567*3pB7at?6uqusy`dj zFy88{VvVY-yK?p2QS7jRw2{)qCH$Un@7Rlr?4H?{XrtGCJbBw^8`IN&e*LFTCw~v} zZFs0DiR$z$nkf9Z{<^M}SCUUgQ0VfY4mJ#R7yk48T1S5TfZrPLsVfib6{`lnGDcR9 zwzvCsKk_K%JN_D%gy|>ABTuY(XPKp)k);716J%>uZ^`;~zqV~-oPRieBq!bf@S^^Z zIkCR+wd?l%emCcTHSUglep)J=l_5*6geD^H2_y*B%<>@6smS!{Xl@t8Lq99!EwF zI=@)aTsOGVxLV2_dK|f|BQ)&oL7zkUpT~M#(Tp*+Tzah9ZVSB^m{~RyQc+#G^Z1vR zfJ+07#<>pzE(J6mZCEXF42G*mD|uS7Z)~(8;fRI*C-cYFNuRE|dlO5l((9{JeNH2A z?;E$Y^1qvg->U1x?dm(j$qv1+JEeC)Z;?GM`?dF8kg1m2S;ZcV2Q^;@X7yJ?uAf7q LECo9z$u9jD{zrw3 literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_lawful_30-pressed.png b/images/icons/alignments/alignment_lawful_30-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..27dcd15e28245e0e93e3c856e5e7ce610fac8752 GIT binary patch literal 1512 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|X-o3pW@ zxwECEk&&5&p`nF=g|V}-rJIw1k&%m~lO@ayYKL?fq0y6ST@{2R_ z3lyA#%@j0z6O%LZKmwYe2!i<6CABECEH%ZgC_h&L9Ku$aSX^M@K9LJJ=JF#*zYW_xJ4yE|<0L50)r)v}Cg zZv36oZg0fH-xXJr)1L0?WsxnxCg}9BX}kX8Q+n6?9u@bvwEJ^@S$6J>P#n|eU$=H1 zw?6(zF!vpMSC#)qT~iiI)f3KUCoU{HE&a_$OJ%v|$J9sMOKm2|cb`(Y5}19!LUL#7 zT4q~8#XbFddF7nv@!VZFtMA+A0^>jb-`?CfC;5E%k9Vu&(%e-U93@okW0*yL2UiEa z`kTVQY56RwBq%^~b+0DFp`*8NPd&TeNJsRhi)oRutGGkF!=ioV;<2+IhVZ@ZJl*nr zOU%jn=gW=TZ?V0(b@Ix?i-kv7`Zd4)c=atrgKHu0W$mLajmHc7YBw*}xNKF)W4T^_ z?KSb~PbcnMJ=1RI%TOIXiJ)Z9-(Q>;Pb<-QvSIHHKgWiw?L7zFr!8E@>$1pk=g&3s zn(}j^=Bn;ZyLnlwcXjaUxZRF>mNdM6>NlgGhjZ@n%ynv$lD<{GSgY8WbV`?TD@)~z zi5xStLv|JaU3bulFEN}l%UXO!(SnUHUM&yj*xDPz8_{#3pl7eJ*^~>%&%CpL5#7MZ5OUsF Ue?_L2FR1MGboFyt=akR{01YoKCIA2c literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_lawful_30-pressed@2x.png b/images/icons/alignments/alignment_lawful_30-pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5e3240b875153024dd54299debfcea469af96c84 GIT binary patch literal 1936 zcmbVNdsIw$9KVTDO6z%O(LK{5)Xdy@+?lyGG>;~wA)}H~y3O30sb=oDb8DuK#aTsp zQ(6|~piZHNv`cyAv3W&I3N1^NmR2c5BzuRl`-kI?z31Nh`~AN6`}us|=Vk@Z^>=o3 zbp!ywIbgO_L9IU4XQ&+#P0|?h0^Fyslcm=KG>q;A*?;vifYVe!EJi$+-^RB?zxD(kmJ zorE+sN$L>>!)P?pjchtj#4{j)Kw#xyvAie^FGH%1L`_~ggZlu36f-CZjh@utI?&39 z#^TAOkVbj>IRvdKPE7$QE2uamr3O=OeG_5E%+(Jh~_IE@K`*lA5-clma>=wkxK=9kx0aW#XJs|){j;FpR6$`XBgJ@ z_)ohGh^QX4Zof1?b@(zqn2wqmf*OwMNOe9nbEgBOq7YMKbELQKd+58#Jj9o}3bXr%F5M6;~H2%Iw0;*df77 z{>MdEkk%UR&AlIbYR4*%_h@Rms*itYC=a^r<_Ik}1}7~bj5ZC~k@qLGb2&+o+4Q2O z``y5u2OG}(tXwQP?=)7rXI)~2M@+}Dk~oKD?|VXRyKSCbNdI}V{M`?MZ?dz089F5I z0JfcNzC0ywywgN2XpWz1Q&@GbuTZ>#w7 z8Jv{4gCs9bktK2?HkMbN^{H9+cB0`VbFIDek_HQX@lTJP>_xqO=R&KSQO|V6=Bi)J z`9ZG-O(;VBy%nGI}gmS)Q`Hka*6Im<>>6N$G6j4TyGyMzGe&ql>kPuYUin_Ee0`)w&9vF(u_kM&Q-^Zf&utIq+G#+E9DXHSZ;5=Js8}cg!hv z#Co>)e0`Sv2*}yo9-W(eBX66_%{v!l<2*zNT4-s1GmO?GC_s?3MI z8`Zk!37uD9&CF_M>muhz=uwk;gUQs|8aV$%N$F(Fw$MWh>FexDW?o_kN=^!VYi+`2 zcx8|i4NnjIGTEn7`QBBMlAWH;6*~J%IgZa_f&3vGc1J|_wpnuaymnoZ>0h^XmwQjf zAMKgrLMLAW7J+r!Qx|TNcyV%%xE9_|F2cID*n5uK7?cxqcYJ{%qKhp3YsGU_cJ9

    WlG_RX^XBLn>AN=wBtKm7yx2nTuq literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_lawful_30.png b/images/icons/alignments/alignment_lawful_30.png index d423ef62caeee3448b304114c5c5aa17244fef81..2fc66fb686c9036578272e2b959a9563bd070f20 100644 GIT binary patch literal 1474 zcmbVMeM}Q)7{58^v?7y_IbaFi&amlXdmsIvJ*d#@wNlp>q(qy|kR8{PR@z>@JJt_{ zDX4%!AsTTBY(gD@C5Q-F3@p81T5gJRZEg5bkp*zfnt{Bjw~mBOe-qlt20m{in|@387N;HNw zd3k~I(oD>*OSHRyMW2hs^&CS9ELX&`?pOyDI9Y+^ovaVk+f?9s3q`xUQNf02f#%~S z8P4?q<1lip2b{|=?pn+Pf|Tnpy-q`7NGx(vqt@wk3Kfy5P(lk>$N$M1EII>6+v7j& z5)+9%7~MW=e(~^Zd>F4dGn_aa?rl^x0K70|B6UT9?{93+vJN4uuXJ&*;&^;d*pPc= zMbqmWl^M!$DAbv7J^Wi+mE>yGvK)DmCGqLquEvy+Kki0`A66XtsQs{Um>t|4Db;rRuKN8sHy(EN)D+rXA89SRKinzP6Pau6d_-Pkl@Lnu^nx z8>KSp_V{;O`B3GZi#hJ@u5fF|{Uwz(Eys?RUOrq86Yte}Zihc5O7@bEut$VG{qk^l zY~|UPq9P;%xWDM`XKNdQNcG06i>V$0b;I+QEvSxF8V*j>|l_C2~-@RM!0x6?y+TE#| zr!O_--Ek&F+FIk!{i3%_tk<?;%OURo delta 648 zcmV;30(bqw3!nv%B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra3LFX=DS*opy#N3LElET{R7l6wmOpD0Q541Rot;&dSg8;RNVKvLM8r-+ z19lcR`ZcU9g*EC2u=1Q;FvHB; zcX;=md(RPR5kS9bZqyR=ZX58Xz(b}nJkcHhi=7Bi^@+_Bbbsl3g|S0qP3 z9N?ib<{Jyb7=L4c=fK)gejBo>weG=ql74sIFT%w+Pm*SY5S{_2Td~}Sa5>G*7wa5V z!a9dB#)lB@w*&U>g%5!`5vKpYufybFnGC?1G43l3!gvR8b%w0RZ5o&7ZgB}f(W4if z^B23_PVGv$+)KCDxhW!_X9o>11yr- zW#zv%PO>JIrpSBTR3vu0as0ChDdSTe5s?p#fK_$W>ByV9p!=f(=|<5=MBcUO<6D_A zX`M1#YY8DdX)BX)ZtTk>&6c)v2!TnKVVxTQ=T@Q7=hG~IWsJ#}%xa9a1K>()Q&5&d zYwaW8t$%TzG&PKqj7gefrsH(aIrkLUoR|Lxe-_DNF;I^69#9cE8{m>4*F|JqL{d@t z6sdj`k$qM5B~XgK-CBteXrSr+sv2C$`c&~;B@I}O*{fr3=dBsf85%2huJhK6TdcP; ib3aiJ-k1L^egl8EZvuO|ByRu!002ovPDHLkU;%>0cP&f+ diff --git a/images/icons/alignments/alignment_lawful_30@2x.png b/images/icons/alignments/alignment_lawful_30@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..200611de6e861d93437bc7a1528b831aa6dbfc55 GIT binary patch literal 1820 zcmbVNX;2eq7>=MIS`U;FrAlJ}1vSZT?nDA6*+c>cAx5EyM@ZJNVzObgm;e?S?I?#< zs}&ePQ3_Q>At97svR%;XE zFT(`FF&0rp;*p9a0u8FCsqH#6i{40}39>+oQLTxCadHf-LkvPn*XgqqGNKhyBG?K* zVU)nJNKg_6FG~tlX_DeJd@Us~fb4G(5CnP{SCcLJ4F;3IBBTuQ3W&X3Os9~CRPZ<< z<%3g^iZHSS#b7d<#-wTh5F~RrG?2ySaKHs*1^_bX0C97uAWOjJ2pC-Q@I@i4VcK;9 zB_tcRMVy3`SR6MB=ybE$OfxfSD5j%>d_LdK!C+7c4XP>8fU7N3gUM@z0fJ2$3^C#e zY9QMg)iG!SE~F5ieh5KtR46_Y8%)EAB2q@TsEu@x2GI3-dt5`>CR_>s>&7RwO{zpA zOjp7tGy&5P^;qXM0w!|zc|&$Z!W+R-3?Yi5-T93BYr03K7qJh*CF99BQh>=4^SA&T z9Kp&BCR}aMz$11M!tOAZ^I5Dwg28GW#Z)M|VWb1XVo@A5#iB;CWEqF-t59nYgI(Zf zFVKg0As9n8!de-I>d8YH79gMSfD3RTDF8{u5Ca&A9OCmtA`y!t=Cat7VXXH5WQ|TZ zL$|lbf7)e4MD(D2`?2|n!^iP~4aCe~#BiLQdf@~ybHQ>*q_VWxR@NEZz{#uWuSvDg zsq{IM(qdiZ`cgI*40{{qbwK(u?E86%u2v@V_La*z+p0q0!hm~aK5?&$ zvUCC0cj_8U4N-TmBGdKf3IkHRLciN->pJbcrI3EDu(Y|Ws{VXAsa2StKHcYMe(JlL zYTn}`p=VtpJ*kUIt*q9g`R)DnZ2-^rk5s3XoVK(G&79{U6zxgXua7G&3T$oFwHv)r zmHYj$s54jPckVv96j$vTpw8@f+O+NKbr%lq=n1{O|6Tnu=oAZqEvNtN`6E2DwP;Dy_@}KqcxtX zK=#DH+Mn$#4E4Le`pgEbcy#R@^H+wMTivhkA3W4?>$2l>ZwFa*4R--V3|a7sPH157bU65zDufFz>&sI|p4Ei~jOtHY}8jN#~Grw1ty26P~@&ayozO z>yLTc_II}?x2bQ>`S)us42*p-uJb`1l~k^}d@!TnmhFeF#rH;+vs(Q`5sv%E*;EH2 zs>XNE;Ejn~-4dwF56&%_k7)cBJ5?sR_#N{uE)74ttH`Ilva(~nf0-wn+T%OdRoLvs z6j=67`>|zPyGLVnji<`A9TulxqWFHNmh1`rT!)lCQlZyzeO7I2@s;uHH14X^ zqdJOC&3QO8DLN&ymmaQa@qp-u^6r$(%dN<&w2~?+Zl1g}H|nSC70Y8YJPT^yJZj!s zwESqZhcbJ2S-*aV&#GzYxv(5cR@~WyY8vLI&gUHf^7v<)(Z4Sw6?(sXN zyGUVw##~!am+h!)pB9SFLxKJkQG@Cu6T zRcWTO=4Ghz_Va=l`Z8(61Dl{j_d4IXZ%x&kYL9klPQ#5smqm?S$9-XEU+$(-)2bT- aM>&z!Hij&i-;7MP|F7iIP^e72cJn{WNX}3I literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_liminal_30-pressed.png b/images/icons/alignments/alignment_liminal_30-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..b0d528ced596d1b2bae01e0b4aeb508f137e3853 GIT binary patch literal 1343 zcmbVMZA{!`9Iq^c1xBWcOnlpFS#&1c_2qiyTDal0y@Shkj2stUH0VlOxB_jDwzoSj zBs%cR;xb)~&c)3EF-(Utr&(m`HY9Ta#4NfP9od^%hAyDaxQ(zE^(k=Z2eJ<~ZJ+1) z_y7C--@CoCqAWN2k!%Qpa)af37_4jTXGJD>7h?mxV0qZ`*IHG2qm>X08S+VbgA4~% zp-B$Qg4EtNDwjaevZxZNwQ56~7*SW9g016Bsxg3uppw#LOb}aS3vQ5`6wQnL{`m<6 zRwOS{;|^h=7$--S@{}Q0r79v~szszFq;vyZl4JmZDq8}aR9iKZNqUhvUIy%KF^a%* zDprdZnRlu-R0(ssA;WH`%OPSo4pWp9C*2f<7s3RF6DS65%7K%Nn_`F}c;P~THA8A- z!hB%C7C3p4sAa_%6ip-&&VFxxdtNIEpLAkDzbrf4WJOVKsh zW)vFqxaCEFr}H7Gu~2A{STh$A1yY74g&2xEF;rFUxaPD?D=h!(#**4*q&+61VcFE< zh6w7>Sda#T+}+!dtq8nfHX8~kiqOjIVqBFqE695h@Wm-962r0q&V?6oG))kc2gf~_ z$Hlqm0E-a>PqTEIV<~JAjj=wTj}4G+fb_dPWWW=k{FsYmJw=!sPh*3cX$hJrr|l}h z?gG|#Pb|Y3vS8^(MAuu>9Z(t7E!~XjF_^2O;PoLvR5V-gv|XV2czM}Sw#rh#&{cRY z!;G?o2PDh8d<5sCc>+sE&eI+c5J|B`q#IelO8+NoC~yX~+v7j&k`{p;w6}}R4-Sjt zBWqx03@{v1mp&YTp!?Jy?~5cSrmK&&vG~e2J*!7DD$hvEsPeBedU|`t){#9wg{98O z9%$$C=<_)%p+`^ta{27Ju9?EWU+$W`TG4d7b@r1DqaUBm=T6_RZQGyIAszbiPS=*9 zGj;TZJpS&s&THRI*FJUQUH$c`KaP+5Iru>GKx4piCq8vtyL@Hc5H#HQgJb5!tu^*9E$FY{2iPs0{{Yt3;er4F literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_liminal_30-pressed@2x.png b/images/icons/alignments/alignment_liminal_30-pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..3eb9cf44e71e22297f46d4cc8cd19e011293dce5 GIT binary patch literal 1548 zcmbVMdvMcq9B(%rV>lE&c`LC)ow_!UrfCz_ac$GGZnS%}o`Vx4r0Ev6G$qMcH>N=0 zhC_!Oj_p9s<18o+L~(3P7%&+(Hx7>XPH-|r$0?#taflC`zm69DgX0f#-{klDem>vl zFSYsZS*a6OO-=$|>aX(>7$zz9BE=*6l?q1UR2HAOkb|58Q_K}| zjIVNW4+jv5CA_ytDRRxGSW(b1Q5{`K2m&-9n;8l+Y$>Ne3%O!GVAlM!|BwdaeP+!I z1{dNA+PD%vyGr6bRcB8b z*4%cg$dwP-M2Uk8I=z-fP!u8v9f}(W0?mLh1jS$k2%$xB%0N(<5sEz;U`_J*sY2Qj zvjtXWO^KoeDHyJ(sL)mDb)r-Zqa;a2IWSBMG_-PMKw(1KfSeX*pgEb9_@Kgz0VvAI zEELNXvj%v2I|L!g$gxC$l))h;2%|a#7KCVABigc3$o=caUA1LzWsrjlIaw^1 zSWpjtS{w{=cW*;cMc@sUC-I;tOc^b*92|6~mY&cM<3_)ojUw?Gd@r+1nk zEbd$%E&%R~1TM$UU&E(VsszeOTfCtQ*EY>?A3+|f`JqF7DWS~OnJOhd>t4Q!w%I== zw>N}s`HR(ij9bocI?&PTo#Job*uCS)^jGQxEN#yD)%87%8+Q-aM)vRW$e6YxAtNRm zRAS5C$Uww8>yNL%qigDMa`5`udiUte zvpPqEZcuLdEqB>IRa&~E_h4=4I)Pl+?`|yY+_yS2JVZ|D;G5=UUan}ApGxfNo^$HV zEwSpGWyQhQcb+(&`#2N63ZEqFgwBtVp{5&r+3@^6sxJ>e)yw33uWrS)bwg81Q+HW& zKO-9PwGT57p4*z+R&cRnn=&&a=QXeQ)wxH{Wt!Bm*izuyx+HsG-Inf@tZ|>0pT?R- zcUe}I=J5TKd*3R5`J*Qc)hAC5e=)gr!+5RJ-qEmqPm}w*bx%)YZ)Lb^mKdLZF(y#FZCT6e6;lR<*GVWZ^sTzh}6jKNn7QVH!9UDQ;sH7PnX(ynWdf`HPqOocMtT> mT|RKmrXIf_CjRDW>Lk_S&5l&@morzR|7WM&P4BWU2>%12Z##nk literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_liminal_30.png b/images/icons/alignments/alignment_liminal_30.png index 752639cf858dab6b2f0ce6d32513903bee185853..025446c73fad4eea465abfa8529697c8378fcf30 100644 GIT binary patch literal 1294 zcmbVMZD<>19KVpQFN2Ddx^+Xg+jZckN$w@dC3hxGlU%QjENM+M7hiB*a!;D0y}Rsk zUD7(R%sH~PY;+%H6)9OjbRyGjh{cJ5Vrsg9$U4+bWF727VPMDbOYK^pYn$qavJW12 z_dL)4{=eV<{Z4jAIvTd@*n%KPL#UIB!gZ(d)YZWE^TfpxT(;}&alJ=P={Z3Ih+k9_ z01e4PFNgv`96VeB9t1I`rC3~#hxfBdRkjI+jx8@|AR0kDzI;YV_5mGDfL=-QVt-!! z7DFY`iyd@^iEt(e(o*M;26~1fvE)!+k`XaqE9%L!kU$2yfac|XCClc$*a|NT_l6k9 z&=nQE&x@@(6%Ti#K~)2&(`L6O36ex<+D1B@G)-DiiXbVRfH!R=9judPDHpnSVbGc; zrr0RQui1hpFP7Hz42$ErT+WuW+f=O=CmDt@I4H^rHLTe|MHli`CEHSE;6OI1Nf}*I z71Ur966%2N#h|CFA;_6%8W40YdVwFA1-s;*|!Y6cDV(CFTOj?r1)rs3ZvE&LJG_OPz};M1pW6D8B3*zk-iGGTtnT&he*iZfTG z)HD1iHFLpj9lz9?Cuhb!I3t|6du6jI-E6=sH`A2tNFBWUJTJ~?d-#U5!9Qt{q@U;BL=~q1HR`aH2#CPG;H}5Z=4;X)_PC7(R7l6|S8Wf3AP5H6{}z8a_eFMGsbuuRZLu{f z5dt280A89PX6B=Nlf!7%{5Hd0N)hvydtu}+Wx1KvVHxIuaevqP(ld;R#Q|C&Ld0@< zDm-n*TA>HIW;5GqpB!1xXLdixhgx^GDXSWPQj+a3TQxXYDuC( zMQ%=Bu~mhw64+cTAR8pCucQE0Qj%?}1aVY^Z-9bxeo?A|sh+WJvVozYf|;3~p^2%P znW2t?k%6I+z5x)K=^C0?nVMM{nJYkn6417ylr*a#7dNO~K%T8qMoCG5mA-y?dAVM> zv0i>ry1t>Mr6tG=BO_g)3fZ zE`@j@x4_pIZg5^PG@yV%reBd*pl_&Wpr4xy@)uZjaY;}r!Wmdq7l%|9r0NHy7U!21 zB?IFlO&O*c7&4a6BsFpIWGChrManjC7v#}NCnq;&V?%Ri zOG_goGYdmQ3j+&dXJbn@Cj%oR7fUBgm>Jmgx*0ec85o&6x|x`o8ydQrT9~+5xS6>c z7@Ig*m>ZZH!t{FP6_+IDC8xsd%>>#D)oY1Yua$FAYGO%#QAmD%4lD%(WaO9R7iZ)b zC^!e3DQNg6CTHe>1T;Yr1o5v+YEfocYKmJ?ey##Igsn2MxWL@N+{M+v#ns8h$N=VZ z7fTCAM@JJgCvy{1C8*vMazafX=oo!a@<2*1Fd<+X1To=>AIO1cpVT~Ho+$!mjz6_0 z7#SFt^gLZ0Ln>~)nZ4JG#ZaJOa;f}*=^KQlR%*cq1{7`^ej zmv*h->Rw}Swx(SPlRV7|)eUsEANT#X`{zlYqUF7YSze0+g{7Hv4nR;a%RO5QLxrS= zcNU*Dz4-0fu`MxGwWUir66S8KJka??MW=_e+qy9Ju8qWmPYr^T9$k-%T+r;y5^L4^ z=1kw&&#!m?%zaQ>Bd_A|{m-v`*PFuy)}L4FPCVYVw>7;w`bFETcON}>ZmhAk|6Y{5 zWli?o>D&9`9QNy}wry?w!zjIo`+><(y||BC`_H8u$gn(Kb?e?`=J)Ll?6s9Ab$tT9 zG48#4Lsmjef`nJX;t#l~3RNS;xbMRi4v7xUw=& zzw|d{<(3s)T`Q*@6I$=p{VHiy*@{yOo0O7bbiRQfIQ>I-R+%UHGQ2UK%)AOm@oCO+{~N zd|ma<8pWFwylZ}UIf>6Jzf1=);T3K0RYMqINJaK literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_neutral_30-pressed.png b/images/icons/alignments/alignment_neutral_30-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..f420db1c1a095a5849866f0dc8bad9a1f916cae2 GIT binary patch literal 1592 zcmbVMeNfY87?0?6Ou$1O-bBT$=m{rnlk_uz3T;Cbwid49=<3`EO=xRrQj)M1Hr>Q2 z&UxS_=-f>dJUtINHa|8_J&r@ckIkW;o5DOlK?jP%IYdG2mLhfg!}E{jlDzNx~#bh#{&nNZCr3~wk!6=FbIS@o5Xh^scnkW1cnu`xH;1p+PU0&YB z&|r{}$Y+Xqtyu8%SqL7l$@H9<=Ef2wq)g@~yfRn{$vmE5T%+0?Z=wEmPKlS2 zStyPvX6-^f3gSaxA$Kn~6jT(v!LnGFP!ysNXY9ouismzLtyuUXC0!(@*BcFTSZzR2 z1W{>VSOaO~203cfLkNPSdNjoGBCHyP^g5kRZB!@)WV%wLFlvmdbV#nyYt)bu4q-EB zjwfh46|(CR?2choFU4X8mLhnD&0(0rPzPi?8J^*sj2AR4R)Gm7!tSDjg2Z5fp2dq( ztm^}cG_s5b9L+H1dVvQDJucTF1|5ncP$+U7)d&G8RC={SDIUX;|0ioQ!5LYwJ^s@! zA(7C7!R_SHEW5QZerehmxjY%ee;W4G9Vu?fdT$NN5NgI z)OJu_RoS_O+a@YcYH@6Pr=sc3<>sgHCr;);pEqp@XzS*_%SV2xq zjspqi+vW=$qISNotLRit-`TXps>-D1J}?ShvUS48Q~Qqwj(c%R9RE`@cX65V>ZK;h zUW-N2Q6 zo!K!iY}Tc(YqMsT9{#(1_M@hl?j@qk_cyM7(nqOJZJIUy-ul$nb-+pe$V2Ih#}x+_ z?#^7Gi;FSr7^cSE+JEM+)%HWfLr1UDe@q>mKGf6K;<)no*8K*1SN*|e(RYnA2V4iO z%b!9s*jU@DmD3(JR&5^~k4)NMf$VOxozDM$&d$#2hF0s!H03(-`11Mo9pI7z|N&{Vc literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_neutral_30-pressed@2x.png b/images/icons/alignments/alignment_neutral_30-pressed@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5372251ff1dc3403c9c1b2f23d50665f625191e6 GIT binary patch literal 2169 zcmbVOX;c&E8V-w~LC`9wC}<3zB4l46xkSi9FtUem33AnhWPkw4#3ab7vJ_hcEkzVc z6}JXZ7Aq=(C{lqI3!(_P0D`hF0|arp`ZCK#Qr$nXmEzgH(}11puRq!9W1PkqUzWE+7;~@4pW~ z2%QiKkFVmpyHQ1;6fM-~prfR62n~@rM#+VuFhGR}1cD_p8gioYE)pRT(~y27cdWad z34};?#wY-v7!RH(CQL*TBOP}j9HOWYffP^)5mC}`nUWesLw?|;LVJxEgG78#QH9Zv zAD!a6dm)&h0zi<^1e6Gi!y(9IG>%9jlX12PJQjz?V4<6g!V#$?G8J!!_;ev5YYK4? zmCIs(vIU)J$PkrEPQ_p%BO}p~1T?4!#^5LviiQJ^M?o4WWwcBsj6%tj7K;olKq*p4 zvBC}o%^p&WxlV=+>xCaw?KN);FQuNz;~ zR`R0d0EP=F!3c#2sz;E;A{ffuKO530Lf%k46%wc@!f+NSijV>_6^BJbLSN8giI~b@ zu$cs$9g{-AG0SHx~f(L@(iyhz<0;)h|2q;G|eaMJy z?n047rV&_c3iL5v7NC$E0K{wsC`Ek8Fjeve5A5)EEN3jsnZd$i7b9m;?CEqmk<73o zl8~RU;{PXW7|0onrak_rT^2=94{Elbn;$xS9v?sk&5QyXj?iY-6BtZ4pTnZ_qT2fc zXfk7*ahVIVU|YfW2MjJt?VWz=j6Z7dsM%|OqFI98`dZThd#$g`;)84~SEZ0!zuxw1 zcTsoWv8ROIt7q>ZuU^kdZ)~54o%nMhj@-WP;&@BQ+}T5;p{cnCxuG|_2LcOkIeYHq z?S6OF+g)m?Q)C`==Q%Cx%9Yrxl8{%^V@5w8+&))y^UY>kHv!IU=<>fyjGm2mG?f~~ z%})Hw@R?pgg29#0TQi7V->s-Yy)rl*3X~HbaL~D?%a8dW9^{{ZRaP_R+{JN@9crY5 z`td5A_6Ad~c(v$Q`WEH2q*>#u=&Wd4a&7s{Pru?X+<3-Ey{Ufg;C6z4%rs|RT~h7d zQ>ExK-8xfv;=5?D(Dr^!_EPmZox-lW-ujq(n{~tqZt18kJud#)6Z&gI8mIjxeOKwm z9>6cRJx{{Uj^3QiO}fxO{f)U%<0iPEDtYb6Q;#ga*5>Ey5(e5~!64K|(SWlpkDkrIWO{P19*o^L@=%FQF=;<$E3qHp3BC z)S~pQ-VXkc9lnilRaZA9?AUpex8627gVo$Jzd~R|57x?a;8%3~ep#y&Hr;9G#|~Vv zn{Hj|c>S!)_@&9%d0JU#+8#gRE@s0{bEVVZ)G+I>+*q*r_H%leN5jf`_zPPT_(X4P z(}vpO(SWS(nsfiBr7jfOZ+>M-D0o1%$Ni_*{5{B{ob$a29?|Xej)qysOVw@(f>{5Hep`;dK`D?^a?g93 zn{j2IdegwTIO)Fil_0oYaZ6`ox^vH@$S7dhaP|)J#i5~2%4osXtXd0H%Mz2!!-E}o z!C2=((#aFE*Ce|~{P$#lfu^Zef;~7@66G2dZ@o9iDJx`!^I(=`&%yHrl}D-5%Zv>h zrTv)_EgRVQj;!r-)8pzhBV5zjnfG~BalDbirwbFWBHwN3N;!iW7NyPC5!-8y7l*Hk z6-U(@{^-Ik&-hI}GYs)P+QEsGiI;98~e|b_al9eGrDU}lrP^E+ZN1JmZJ}e zu!R9r75h@={EY<)53PK0PETRSx=}^LuGV_XmAPEqmvv(sb2D*yDNk@ErIz(_1HMh_ z>wf;jFyH=PP+mz5YeWuQ{mHJ|Z!25kU)-rb)ZKROh!Ol*Tcx;v8FwaSb&;0~}`$RtZCp_%|(SgCGC^ literal 0 HcmV?d00001 diff --git a/images/icons/alignments/alignment_neutral_30.png b/images/icons/alignments/alignment_neutral_30.png index 1a09ed7de928919673474e986daa3bcef304f6e3..553b42fa75b21e23ceb96ba472676581c3d1c784 100644 GIT binary patch literal 1551 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|X-o3pW@ zxwECEk&&5&p`nF=g|V}-rJIw1k&%m~lO@ayY>O)SYT3dzsUfu(?ejQo=P;*9(P z1?ONh1r6WCw{ApUhpEy^rQO>ryA&s6}2uvI1&7nnG?7&{s{J6gIJ8Nht* zVrk*%=xAc*WNu=r1l5~DPN?Yv9itCQ9!SXrCIn1_ASOKV13B>QlbQ$2GeyA6kzx1Y zIs*fft*47)NX4x^Vb)$OjskO~#6BvqHO*uf2o6lrAW?OS@-}1jVB-W2OYipeZR=z z=2hbT`s=yx%V|Dbl%(Op;aF4re~#$3{kxsN&5m|t>)x~U!~|VE#Ro4h#uZl-$-S3P z3l9spbUDG{Pm_Q6gY*wv{yI+49g|xYF7YXQ$isCYM|6d`f!dsMK?eJt^KPtiw{3S< zXYnmd|JRe9Z8v}Oh0>Y{%#}Cd&R=RYfAscoce~Do_Q7g54RtLYoqA_Q7p2AY|KZhrrZn4nfb-G@w6=NaZ zvwEq5BCokc(b7*I23?pK zr7LCN`QyZ)*hkZ!ngwaMzD)aet8&fHiz`JsB@hROGrbvZQNt^Uh?wDg2Y zf%rrYgB$FfHhZ}0r>$dASdyHpQKUG3p>alt{Nkl1N4Ead$>weQ=Ii_RrStUb+r{e5 zn?IOc_Of5V{P*Zf!>b#1&4};Wdf|EDW1r*m&Rd=Yxo;x{D>`6SvGrzP#Uc>4CT!XS?oVa}mjz>?w6RQ7M|erhBz7zL>3Bv3Eht z?ajWuPX8C2?mc5?tG7_@3zOzSMbExWjU6iYuda^S&&0zpt&W>@=DF?7pd#AS)z4*} HQ$iB}#IQVl delta 545 zcmV++0^a?P47vo6B!32COGiWi{{a60|De66lK=n!32;bRa{vGf6951U69E94oEQKA z00(qQO+^Ra3kDJ?BpTpmvj6}A$4Nv%R7l6wmc2^@K@i1fqY?3gpvFeA(jtwGl?0Ud zfnu)+Vz2+j75*s-HfotdkXXb!IDk>=E_GjTL>wg(9w|7y=G{-IP&ExIN z?v6-;0KB-|R6@~067jggCEla-r;h(M0DfZ|y$0p-BA3H}f2<$S1&jf+zyvT*rw_iF zP+_h`q@a{i)>@y4ENI9pk-SoB2)IV1oKosaM2gjF^*o(UW0m4iDK!;mt5QIVes@?V zJj!MV+8a?L1%J!~m4L_t@B};pFV=d+;9HXlj|N0vfg-R7tO85GE^r$VA5AKJVkJBP zCV~C{W)K($_ATtGQ`_5}49r=H_JV>na%6!Wi!&eS@UO?z68#LbzG;3hfZ>P+MhqTc z>!Z7^_)*+;d!#D8t9bKpKE_s(|g`Z}G3-EI+H zzT>!#r-5gn*OAw6cr!`P@e#1@$XNr9l3pNLU>nFp#AggX+lc$R2UrF=>)<+p71z?# zd`oLQ8125+9lo#AzOR+<>o#BOZlD851t%1znXKL*5MvP`Dq>6B!a*z-5i2`UaQBC&KX%T{eBbxZ`#kUc z%noJ3s=$EI0531EK>2D(60t7#Jft^>H~(3el~~@wrOCJo)8ls7ig*ci*aifUo8T-Y z34wLajU5Pq@G+q3WIS0B&(~rmD(umrI!qPsSi9!Xict=<0kcqRLNDYx8roJRSJ{3ShZ|PY{?890nXFquIuH2*4M-d}8kr(?H;b z3Z5eXUpkenPy%AiiU2HX3`I+aAb`!LLQEE$4MhVCI>eySiJMJh%01iEP>yaT0(A9JlakG`rnSwZ~8~YZeXS@pv8%27^LqP;5>!4m&7jTf_{51hHwY zs0BwcGvHx_H(Sc(Ei{Nqr(NZV^%eW8D}~`X~1yIX22|fSj7gGDqt;Y z_6W$H0=_Z!L?^RiCg4Se`RHpr;Lte|DP1BJNf`8*$R#|kP$*=wMI0szoW|<@ zpRCacXK0@G_@8!}5fMG;*}iIi;_zyG5Hm3|R$@3xYHtz~>+?u15vm<`2GZKh^PxHG zSJlUTuf6_{VXxu^-mKuQBI)dmIq$O8&JlEy408qQqX8k<*`EUXFxI@lPwa!u7f+r# zzqh%d!!78Wm`c$$EDAy^!b$DUDd(xpzt;R-`25Db@s1+}SI1WT`!C1BZY^1!QFWNT z^lpCPWi%v&Jf>3Nhq1d1=I!*c3Kpe6i|6deS+6Zuw)W>7@9&|N@yUlgKzHztZK-Br~N`~cSceV`GiMsb3x&)(ZZ&k%! z+I!Y`uu1=?`uN`lx})^yuF3GRSmvyl$`GmQEv||Q@bNueD`#u|9ByYxvnfu zcWP%z!vhzaMDuoSH#W4XyHdis-u!`QT!i1`o{U#C?;P3Pn0tTyiR1mziBG0}@M{YQ zMx-nC!Cd3EiLK(@jcu(>7pp#A%sdt_Xx;EZ&*8sr(^@PQ$~P~=E)sTier9wc1$U7y z7GmFI?0vYR#CH{Az>zoqnl~e~c79MzM%p{W;z{~jsv_t0m5)}uF;#(gVi#T|S; z98-~+*N9}FZ0i%+q7qK~pKGb<{p`fQjwmA))=tJ}QR72%!w<1tkI`=)U8mVB-<@{d zfDHTcKVc4loG+^blt)~1Q;l2rQfX7H_`@Fub%C&MrJ^SKAIpJ-y2cP6)oDyv5- zE7yGakyJHGuSzT`4Q`Ar5Eo901FzMdD+JS0_FcHrk^i@!>(Lq_I*Vom07mg_vNI5@v_wL%I(`5n}R?8qC~=I z@u}9Rc4<-#?%H?LP{R}V zou5kWmu^nJicv?&^`)QgOOZDCW-|5{;Me2_a=LHYEsKWz$FGXZze?4u-FEP!w&%W? p_bzYMw2#!u2B$u#8Ju_$amK6S;i$u}Qi( literal 0 HcmV?d00001 From fd8dfd585349b0c488529723cbba2aa9bc20baa7 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Wed, 6 Apr 2016 22:41:48 -0400 Subject: [PATCH 200/240] Changelog: hotkey release and scroll key binding. --- changelog | 2 ++ players_changelog | 2 ++ 2 files changed, 4 insertions(+) diff --git a/changelog b/changelog index f8247708a772..fe73a91440f5 100644 --- a/changelog +++ b/changelog @@ -270,6 +270,8 @@ Version 1.13.4+dev: * Miscellaneous and bug fixes: * Resolve translated logo images not being used (bug #24357) * Ported the "hexometer" tool from Bash to Python 3 + * Recognize hotkey release events + * Allow changing keybindings for scrolling the map. Version 1.13.4: * Language and i18n: diff --git a/players_changelog b/players_changelog index aa08524aedb4..2633a73a0b44 100644 --- a/players_changelog +++ b/players_changelog @@ -5,6 +5,8 @@ changelog: https://github.com/wesnoth/wesnoth/blob/master/changelog Version 1.13.4+dev: * Language and i18n: * Updated translations: + * Miscellaneous and bug fixes: + * Allow changing keybindings for scrolling the map. Version 1.13.4: * Language and i18n: From 5aecbdbe83344b6e79b62374a79374f54c724710 Mon Sep 17 00:00:00 2001 From: Ryan Roden-Corrent Date: Wed, 6 Apr 2016 22:45:30 -0400 Subject: [PATCH 201/240] Add self (rcorre) to contributors --- data/core/about.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/core/about.cfg b/data/core/about.cfg index 600794a3fa93..f69a6a92a8ed 100644 --- a/data/core/about.cfg +++ b/data/core/about.cfg @@ -1357,6 +1357,10 @@ [entry] name = "Ryan Henszey" [/entry] + [entry] + name = "Ryan Roden-Corrent (rcorre)" + comment = "Hotkey release and scroll key rebinding" + [/entry] [entry] name = "Sachith Seneviratne (sachith500)" email = "sachith500@gmail.com" From 0e7f855be3c7f78399f2c3738d0cf05bd0bffdb9 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Thu, 7 Apr 2016 19:45:28 +1100 Subject: [PATCH 202/240] Improved scrollbar graphics --- images/buttons/scrollbars/scrollmid-active.png | Bin 232 -> 222 bytes images/buttons/scrollbars/scrollmid-pressed.png | Bin 231 -> 223 bytes images/buttons/scrollbars/scrollmid.png | Bin 235 -> 227 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/images/buttons/scrollbars/scrollmid-active.png b/images/buttons/scrollbars/scrollmid-active.png index 0920f4505b1f99454f4ecb10432fbc65e17d8436..893c7b59a1a543192b3bf29ef851e2dd58a5348b 100644 GIT binary patch delta 188 zcmaFCc#m;{Ry_lQDMPe+lt={w0|RG)M`SSr1Gg{;GcwGYBLNg-FY)wsWq-iJ&Y{DW z)3yPmF5A<^F+}2W>4ZR`1_ch6^4TosFM96EdHy2fi{P>eMvFJ_y%z4=E7d2g!PUVO zbbk%klv`UnuCIH~EqzR(IyX1F`^3i9cjpbbqi67%)_wMPFy)*1<*It+3)l3x&o65h nH&L2rd|t**qc?-|^)JSzPm-1WyV*|w?Pc(E^>bP0l+XkKdbC9_ delta 198 zcmcb|_=0hQR{ehlAY8C_`D6wL2F?PH$YKTtZeb8+WSBKa0w~B{;_2(k{(xDYM?t5S#UQ+J8|%iQ#hgJFsAjmIBIKdmuxtfe_0CX0tQc4KbLh*2~7aIH%{^Z diff --git a/images/buttons/scrollbars/scrollmid-pressed.png b/images/buttons/scrollbars/scrollmid-pressed.png index a62272bf0a7c14429408d2eab3408b5939f6606a..1b891113040e7d585537d38dd7d3e1ddc7b1d0c2 100644 GIT binary patch delta 189 zcmaFPc%N~CRy_lQDMPe+lt={w0|RG)M`SSr1Gg{;GcwGYBLNg-FY)wsWq-iJ&Y{CB z^Ty>nP$a9(gME-rr&$NclW;MFz`rze~!PywM(|?f0`GY*^|~?dqfpA!zT2pos*JFi<lwdP?(c2jk1&x~D*0vk8KA`sp00i_>zopr06t4ej~Ee1R;_Zc3#cxvaWmN>GCZ2p=f_{C60sP15A%FV|YXS)a< zPT9wuQ~#pc!+9l3@~O`=Hreet&$EAO-|vmZ*B3I|y*F8z@RIZ7^l4tp8H>5Yw{HG? xPWOi1(&v*o4;`Alw4vaKV61U$>4Nx&))m*KmNb~Vc>*24;OXk;vd$@?2>>3@PYM74 diff --git a/images/buttons/scrollbars/scrollmid.png b/images/buttons/scrollbars/scrollmid.png index d1f7bedfdc65c2f2f66557093fd6357c20ffa4c3..0fd38fb2983e46788706a28aee7e85d77c6042f0 100644 GIT binary patch delta 193 zcmaFO_?U5mRy_lQDMPe+lt={w0|RG)M`SSr1Gg{;GcwGYBLNg-FY)wsWq-iJ&Y{DV zYVao*C{*C-;us=vxpab~P=f*wvpJtax&4Fx@=vZVKhkU=a#T)Xir!>}Ak*7?n$CI? zPOS~TymQYxt~H|Pnp-34#2Vkd4PLmNXThO^j<31kNVFL~p@qmd+TjM9(`d{C9+vaIdLsHJ`Gzo#?JB>Xbh2Hbp zC@|%u%**Hh!1!>c?SsvSzaMxhkno7JaSez1xy02@5BygB(qDCS! Date: Thu, 7 Apr 2016 23:05:10 +1000 Subject: [PATCH 203/240] Add self to en_GB translators. --- data/core/about.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/core/about.cfg b/data/core/about.cfg index 600794a3fa93..b3e917a6cb19 100644 --- a/data/core/about.cfg +++ b/data/core/about.cfg @@ -1862,7 +1862,6 @@ [/entry] [entry] name = "Steven Panek (Espreon)" - comment = "Current maintainer" email = "Majora700_AT_gmail_DOT_com" wikiuser = "Espreon" [/entry] @@ -1870,6 +1869,9 @@ name = "Thomas Hockings (Deusite)" wikiuser = "Deusite" [/entry] + [entry] + name = "Wedge009" + [/entry] [/about] [about] From 2d0721185fa5722859dc24007731054fb3f35885 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 8 Apr 2016 04:22:57 +1100 Subject: [PATCH 204/240] Assigned some initial variable values to silence some warnings --- src/actions/undo_action.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/actions/undo_action.cpp b/src/actions/undo_action.cpp index 292563b04ae9..89642a0d29ff 100644 --- a/src/actions/undo_action.cpp +++ b/src/actions/undo_action.cpp @@ -92,7 +92,7 @@ namespace { x1 = e.filter_loc1.x + 1; y1 = e.filter_loc1.y + 1; x2 = e.filter_loc2.x + 1; y2 = e.filter_loc2.y + 1; - int realx1, realy1, realx2, realy2; + int realx1 = 0, realy1 = 0, realx2 = 0, realy2 = 0; boost::scoped_ptr u1, u2; if(unit_ptr who = get_unit(e.uid1, e.id1)) { realx1 = who->get_location().x; From 2b6442abc21dadf0655112c8288f6088bedb1626 Mon Sep 17 00:00:00 2001 From: gfgtdf Date: Fri, 8 Apr 2016 00:56:47 +0200 Subject: [PATCH 205/240] attempt to fix whitboard crash during ai turn. https://gna.org/bugs/?22527 --- src/ai/actions.cpp | 2 ++ src/whiteboard/manager.cpp | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/src/ai/actions.cpp b/src/ai/actions.cpp index 55fd2a42b459..1c4acb66b50c 100644 --- a/src/ai/actions.cpp +++ b/src/ai/actions.cpp @@ -52,6 +52,7 @@ #include "team.hpp" #include "units/unit.hpp" #include "units/ptr.hpp" +#include "whiteboard/manager.hpp" namespace ai { @@ -286,6 +287,7 @@ void attack_result::do_execute() //FIXME: find a way to 'ask' the ai which advancement should be chosen from synced_commands.cpp . if(!synced_context::is_synced()) //RAII block for set_scontext_synced { + wb::real_map rm; //we don't use synced_context::run_in_synced_context because that wouldn't allow us to pass advancements_ resources::recorder->add_synced_command("attack", replay_helper::get_attack(attacker_loc_, defender_loc_, attacker_weapon, defender_weapon, a_->type_id(), d_->type_id(), a_->level(), d_->level(), resources::tod_manager->turn(), diff --git a/src/whiteboard/manager.cpp b/src/whiteboard/manager.cpp index 962560b9e585..ef21f946bb92 100644 --- a/src/whiteboard/manager.cpp +++ b/src/whiteboard/manager.cpp @@ -513,7 +513,7 @@ namespace void manager::pre_draw() { - if (can_modify_game_state() && has_actions()) { + if (can_modify_game_state() && has_actions() && unit_map_lock_.unique()) { move_owners_finder move_finder; for_each_action(std::ref(move_finder)); units_owning_moves_ = move_finder.get_units_owning_moves(); From dfefb83ffd208c4b7a19eb173499c93e184d311f Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 8 Apr 2016 16:15:45 +1100 Subject: [PATCH 206/240] tcampaign_dialog: fix campaign names not being centered --- data/gui/window/campaign_dialog.cfg | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/data/gui/window/campaign_dialog.cfg b/data/gui/window/campaign_dialog.cfg index e9f706e77be3..96e8a3667236 100644 --- a/data/gui/window/campaign_dialog.cfg +++ b/data/gui/window/campaign_dialog.cfg @@ -26,12 +26,6 @@ fixed_width = "true" [/linked_group] - [linked_group] - id = "tree_name" - fixed_width = "true" - fixed_height = "true" - [/linked_group] - [tooltip] id = "tooltip" [/tooltip] @@ -373,7 +367,7 @@ [label] id = "name" definition = "default" - linked_group = "tree_name" + linked_group = "name" [/label] [/column] From 547bf2f1df2585968996fd38fb26d3539dde1f48 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 8 Apr 2016 16:21:01 +1100 Subject: [PATCH 207/240] Slight improvement to loadscreen decor --- images/misc/loadscreen_decor.png | Bin 662 -> 630 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/misc/loadscreen_decor.png b/images/misc/loadscreen_decor.png index 0ef7a14239679b0d9b65be42ae181b717ba44f34..2ed96051d069eaa3ae89352d0945f33d84fb0c6c 100644 GIT binary patch delta 558 zcmV+}0@3}J1@;7xDlq{7Bmg+mWyEa&000SaNLh0L01FcU01FcV0GgZ_00007bV*G` z2jBz<1r!Ta6Z1QfTP%OtNklGy z060+a5JWh$OZf%Ami>9FkH3`juPf(lwY{z!$4c8)Uu%7|&L7>sJTZ>Z*Bzbt*gKbd zUvF%D*Twe@;O&h6dj-gTB`^ZvJp_>ofjUO&uZV8MJeh_w1%)cuTzM?~DK zpRKa_c&)70ey#4&sJm~}^{&|)@4ZaJy)(|e=Z%ajcJ|X7!`^Ys?SEDMJgTzR{EXbs zx=pK}x{p`xb-fQV5E%#n|NNmYcmN0@f(Hz^ngWijtVME6@#l?wtq1w^%tL;$uCY}& zc{3rvfijWmqeq4_g{}574}b#)5ub$xz)P9P-n#c{55Ol6A|DxG%rJl~#WxbdhKnhH wW+pMk;ycm9e^dc5n2E?d0C*~h2p+KFH!**ei9*4LK>z>%07*qoM6N<$f)tzztpET3 delta 591 zcmV-V0?OV6t&2(jCcGksY6_rZ*l1x3W z9mg=L)Nqc3$e%C4L3}bH5CJsJ^L(4<`KBiT7!8kQy$KO0Tyz1{!y_W5V)2wxdeb`q zbVnZ9G9wWH#==900Pr3Jqv3HhME2Uk*<5u2FBl$E`9`0g^GJUwHO~!Z>!vb9TD9S< zzUl&AEj&_6Z}U9A&u@Xy3y(ZRvapD({fF8|Y60*cghyq>kbg~gd9dcPS6j~moGd)b z5O}io?l~1l06=&M5dh)wIpHBhcx9LM1%6$pw_7>?W!?T-*=DcpwK5--wyj#V8m;X| zr!Noe$LRBpPJe$K?aQOjx3^EdTCpDMqy4q_d`GtJ9p~QT3v zg!yQQwCZNx^7pf;~fA4EI+&lYubi0xLii34} z`*3tWw)Ve@I!m#v)juQ0vux9 Date: Sat, 9 Apr 2016 01:03:40 +1100 Subject: [PATCH 208/240] GUI2: converted horizontal scrollbars to new style --- data/gui/macros/horizontal_scrollbar.cfg | 4 +- .../widget/horizontal_scrollbar_default.cfg | 54 ++++++------------ .../scrollbars/scrollhorizontal-active.png | Bin 233 -> 235 bytes .../scrollbars/scrollhorizontal-pressed.png | Bin 249 -> 243 bytes .../buttons/scrollbars/scrollhorizontal.png | Bin 222 -> 236 bytes .../buttons/scrollbars/scrollleft-active.png | Bin 97 -> 156 bytes .../buttons/scrollbars/scrollleft-pressed.png | Bin 97 -> 156 bytes images/buttons/scrollbars/scrollleft.png | Bin 101 -> 160 bytes .../buttons/scrollbars/scrollright-active.png | Bin 114 -> 189 bytes .../scrollbars/scrollright-pressed.png | Bin 114 -> 189 bytes images/buttons/scrollbars/scrollright.png | Bin 108 -> 173 bytes 11 files changed, 21 insertions(+), 37 deletions(-) diff --git a/data/gui/macros/horizontal_scrollbar.cfg b/data/gui/macros/horizontal_scrollbar.cfg index 4f0d2d70ae77..08019cb2d01d 100644 --- a/data/gui/macros/horizontal_scrollbar.cfg +++ b/data/gui/macros/horizontal_scrollbar.cfg @@ -13,7 +13,7 @@ horizontal_grow = "true" # note we want a special button definition for this later. [repeating_button] id = "_half_page_up" - definition = "left_arrow" + definition = "scrollbar_left_arrow" [/repeating_button] [/column] @@ -34,7 +34,7 @@ horizontal_grow = "true" # note we want a special button definition for this later. [repeating_button] id = "_half_page_down" - definition = "right_arrow" + definition = "scrollbar_right_arrow" [/repeating_button] [/column] diff --git a/data/gui/widget/horizontal_scrollbar_default.cfg b/data/gui/widget/horizontal_scrollbar_default.cfg index 4a9c720daf80..594123b47cda 100644 --- a/data/gui/widget/horizontal_scrollbar_default.cfg +++ b/data/gui/widget/horizontal_scrollbar_default.cfg @@ -3,43 +3,27 @@ ### Definition of a horizontal scrollbar. ### -#define _GUI_STATE GROOVE_LEFT GROOVE_RIGHT POSITIONER_LEFT POSITIONER_RIGHT IMAGE_SUFFIX IPF +#define _GUI_STATE POSITIONER_LEFT IMAGE_SUFFIX IPF [draw] # # Groove # - [image] - # 4 pixels wide + [rectangle] x = 0 y = 0 - name = "buttons/scrollbars/scrollgroove-left.png{IPF}" - [/image] - - [image] - x = {GROOVE_LEFT} - y = 0 - w = "(if(width - {GROOVE_LEFT} - {GROOVE_RIGHT} < 0 - , 0, width - {GROOVE_LEFT} - {GROOVE_RIGHT}))" - h = 0 - resize_mode = "stretch" - name = "buttons/scrollbars/scrollgroove-horizontal.png{IPF}" - [/image] - - [image] - # 5 pixels wide - x = "(width - {GROOVE_RIGHT})" - y = 0 - name = "buttons/scrollbars/scrollgroove-right.png{IPF}" - [/image] + w = "(width)" + h = "(height)" + fill_color = "4, 4, 4, 255" + [/rectangle] # # Positioner # [image] - # 5 pixels wide + # 5 pixels high x = "(positioner_offset)" y = 0 name = "buttons/scrollbars/scrollleft{IMAGE_SUFFIX}{IPF}" @@ -49,15 +33,15 @@ x = "(positioner_offset + {POSITIONER_LEFT})" y = 0 w = "( -if(positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT} < 0 - , 0, positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT}))" +if(positioner_length - {POSITIONER_LEFT} < 0 + , 0, positioner_length - {POSITIONER_LEFT}))" resize_mode = "stretch" name = "buttons/scrollbars/scrollhorizontal{IMAGE_SUFFIX}{IPF}" [/image] [image] - # 5 pixels wide - x = "(positioner_offset + positioner_length - {POSITIONER_RIGHT})" + # 5 pixels high + x = "(positioner_offset + positioner_length)" y = 0 name = "buttons/scrollbars/scrollright{IMAGE_SUFFIX}{IPF}" [/image] @@ -65,7 +49,7 @@ if(positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT} < 0 [/draw] #enddef -#define _GUI_RESOLUTION RESOLUTION WIDTH HEIGHT POSITIONER_LENGHT GROOVE_LEFT GROOVE_RIGHT POSITIONER_LEFT POSITIONER_RIGHT IPF +#define _GUI_RESOLUTION RESOLUTION WIDTH HEIGHT POSITIONER_LENGHT POSITIONER_LEFT IPF [resolution] {RESOLUTION} @@ -74,7 +58,7 @@ if(positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT} < 0 min_height = {HEIGHT} default_width = {WIDTH} - default_height = {HEIGHT} + default_height = 15 max_width = 0 max_height = {HEIGHT} @@ -85,19 +69,19 @@ if(positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT} < 0 right_offset = 0 [state_enabled] - {_GUI_STATE ({GROOVE_LEFT}) ({GROOVE_RIGHT}) ({POSITIONER_LEFT}) ({POSITIONER_RIGHT}) ".png" ({IPF}) } + {_GUI_STATE ({POSITIONER_LEFT}) ".png" ({IPF}) } [/state_enabled] [state_disabled] - {_GUI_STATE ({GROOVE_LEFT}) ({GROOVE_RIGHT}) ({POSITIONER_LEFT}) ({POSITIONER_RIGHT}) ".png~GS()" ({IPF}) } + {_GUI_STATE ({POSITIONER_LEFT}) ".png~GS()" ({IPF}) } [/state_disabled] [state_pressed] - {_GUI_STATE ({GROOVE_LEFT}) ({GROOVE_RIGHT}) ({POSITIONER_LEFT}) ({POSITIONER_RIGHT}) "-pressed.png" ({IPF}) } + {_GUI_STATE ({POSITIONER_LEFT}) "-pressed.png" ({IPF}) } [/state_pressed] [state_focused] - {_GUI_STATE ({GROOVE_LEFT}) ({GROOVE_RIGHT}) ({POSITIONER_LEFT}) ({POSITIONER_RIGHT}) "-active.png" ({IPF}) } + {_GUI_STATE ({POSITIONER_LEFT}) "-active.png" ({IPF}) } [/state_focused] [/resolution] #enddef @@ -109,7 +93,7 @@ if(positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT} < 0 # Note a scrollbar is normally sized by the item that "masters" it # that's why the default height is rather low. - {_GUI_RESOLUTION () 20 25 11 4 5 5 5 ()} + {_GUI_RESOLUTION () 20 25 11 2 ()} [/horizontal_scrollbar_definition] @@ -120,7 +104,7 @@ if(positioner_length - {POSITIONER_LEFT} - {POSITIONER_RIGHT} < 0 # Note a scrollbar is normally sized by the item that "masters" it # that's why the default height is rather low. - {_GUI_RESOLUTION () 20 25 11 4 5 5 5 "~O(65%)"} + {_GUI_RESOLUTION () 20 25 11 5 "~O(65%)"} [/horizontal_scrollbar_definition] diff --git a/images/buttons/scrollbars/scrollhorizontal-active.png b/images/buttons/scrollbars/scrollhorizontal-active.png index 3dc98f743c18b9b0186fd6a9cc295a58520c83fb..ca5aefec180800db9c994f258e35ae2b73fc18cd 100644 GIT binary patch delta 220 zcmaFK_?mHocs)M{8v_G_2IJLzK#DEN+ua37$1-%(x$yP@S)2tPk;M!Q+`=Ht$S`Y; z1W=H@#M9T6{Q(OHucgR0rLQxALKU7ajv*44YbO{A9ai9B`JT4o&M)!I;HRSh{zoem zYYJ@K;JmIua*4IB(D}n2C7dGW0Tp{9R$hn-HIb6>D=&T+d;Y}7uF01dzq`WG8utI} zn&MaCryLZIE2=K2l&N6wt>nu1&+zGG-=ki&e2s0!XTLnv7B|@VHcs~;^Q5B&H#RtA RmjNBY;OXk;vd$@?2>{LJP^SO@ delta 218 zcmV<0044wH0qFsd7k?QD1^@s6{f;y^00026Nkl zbY;-@0F51`Jb-5WeeV3~J6~{8NMC+SrNCmElf>`Z6^BFu}U;!s-s(N6KIi_@%07*qoM6N<$g3f?sR{#J2 diff --git a/images/buttons/scrollbars/scrollhorizontal-pressed.png b/images/buttons/scrollbars/scrollhorizontal-pressed.png index bfdeeba4764c86d64ebd45f01db1520c03fe531b..2c2e5cca75557dfcacd418caae70409be540f160 100644 GIT binary patch delta 228 zcmey#_?dBncs)M{8v_G_2IJLzK#DEN+ua37TQMZFu)MwvWN{XFL>4nJa0`PlBg3pY z5H=O_6IB+yq4x6t}U;DLJgiSjv*44OD8z;9X8-#VLy3%pThnZ!dg%D|Nb|P zxFyHKsH&+R{pJSqv45gzb5hyX{C@B^a{A`=u|9?~{7OaA8zq^)yKNQnG+U(FEOO%0 zYK5Z-ayHW?egtj{G7cBM6l>L@H)~?t`Dbk*+!5P6wZhAlmDj$WbGdtx7oS1g?0-C` Z_#;CsxIY-}6$Cnl!PC{xWt~$(697)oPX_=1 delta 234 zcmV%t7k?QD1^@s6{f;y^0002MNklQ7vBx7MrKSohHGk2*`b3yeW z2N!atB;aKoibw%LvBtE*wL5nF^+>t|m!*!OIbX49anLxq=pg6kph#71nqNgg>egJs k>5NVgAH4_v{`MQ5&Rzi%5g~ zEnLFDV)}8nh@W7us**Uf+)y5$;zYZDaHhRHJJS+h3Mqu52|-~{aTwZ!3geskp4sY{zyYlj v3m$i=9XRxH{y~e%kO}Xa3OGL{3%4)|X__AUSN`-JP!EHrtDnm{r-UW|BuOBs diff --git a/images/buttons/scrollbars/scrollleft-pressed.png b/images/buttons/scrollbars/scrollleft-pressed.png index e50d2ebd2d19ef5230cf0be60e25a92a1b21fb73..50f0ede923d3642bde393b858d352a6b7dc336e1 100644 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-f!3HGHX~_KoQfx`y?k+&ujv;1icAgcG#aZAH zSP6kMl literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8G(24#Lo_BP|M>skp4sY{zyYlj v39_wf2M&Fne{g4F$b@%I1)QIfggTe~DWM4f{#hR* diff --git a/images/buttons/scrollbars/scrollleft.png b/images/buttons/scrollbars/scrollleft.png index 1b06489af3e5bf05b02e7cf73cb57070ddf74911..4b6a097d3d6dfe80332ea500e4876864325d66ed 100644 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-f!3HGHX~_KoQfx`y?k)_B3@Qv3ms5}A0!26r zJR*x37`TN&n2}-D90{Nxdx@v7EBgZ$4qkCH4cEPaKp|aE7sn8e>&XcT4=*HLDE)u_ z%z-1Hx*EIZH+D7x!Na@U8qJN3$9QDh^507^Xcw_ ACjbBd literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8bUa-gLp07O|M>skp4lo*!E1u! yaZ%rf*2nhEo%Ujmj5`Azqqq*Kp6K@#U}F%8)jORY@$xHBAA_f>pUXO@geCw4Rvlgd diff --git a/images/buttons/scrollbars/scrollright-active.png b/images/buttons/scrollbars/scrollright-active.png index 3da73626448ea1e3f23dc91a8c9c85fb7572e387..48b4f658c4212d2e5d5dffb76aa561a5fe061fa3 100644 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-f!3HGHX~_KoQfx`y?k+&ujv;1icAgcG#aZAH zSMQ~Zd3m}xhHzX@PTA1+>->k0Tg`-< zlU10RnGc7mwXK(z0D&123mPnry^jw#_W%EjAp3m|lK=lXN&3Gx00W}}?!V~)Cf67l YF3u2gK6`niB+yg_Pgg&ebxsLQ00zG`tpET3 literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8EInNuLp07O|M>skp4lqxfYylx zkAKMrZ+QHnzJ!yl?a)!@2!m?AudKq=nnG6!k1Cxw^l|=<4&^8T2Cs!Ks~8S?I|B`2 N@O1TaS?83{1OSqZCTjoy diff --git a/images/buttons/scrollbars/scrollright-pressed.png b/images/buttons/scrollbars/scrollright-pressed.png index dbd5e343db35d52ef38bb209320e9de84fdc8b9a..9c919791470ce9beda088c6b4aced498053bbaea 100644 GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-f!3HGHX~_KoQfx`y?k+&ujv;1icAgcG#aZAH zSp5QyDy6{an^LB{Ts5Pmnff literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8EInNuLp07O|M>skp4lqxfYylw z*{|}!1$X=ZzYyZ#5kAMCc<@~E74bE9eI_m_6%lh3oA>{StIWkF2F^b|Nj2x4&H)W! N@O1TaS?83{1ORXCCbj?o diff --git a/images/buttons/scrollbars/scrollright.png b/images/buttons/scrollbars/scrollright.png index 9c71a84f527567b50b19f182f70a7fc0564e1028..1f275c151826e143e55db077d079bbbea470a207 100644 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^OhC-f!3HGHX~_KoQfx`y?k)_B3@Qv3ms5}A0!26r zJR*x37`TN&n2}-D90{Nxdx@v7EBgZ$4qgeSzRXZMFnGH9 KxvXskp4lqxfYylx zkAKN`Tx6MC?b!4`khS)+JL^hK4$evwN3p*DM_gqtHZgcB+q`5kzTgGa&fw|l=d#Wz Gp$PzKU?M#L From 692502f441cd80b8df8424c4cedc1d5f813a5946 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 9 Apr 2016 01:12:56 +1100 Subject: [PATCH 209/240] GUI1: fixed scrollbar layout Re-adding the pre-GUI2 redesign scrollbar images so GUI1's scrollbars show correctly. --- .../scrollgroove-bottom-minimal.png | Bin 202 -> 0 bytes .../scrollbars/scrollgroove-mid-minimal.png | Bin 155 -> 0 bytes .../scrollbars/scrollgroove-top-minimal.png | Bin 192 -> 0 bytes .../scrollbars_large/scrollbottom-active.png | Bin 0 -> 101 bytes .../scrollbars_large/scrollbottom-pressed.png | Bin 0 -> 102 bytes .../buttons/scrollbars_large/scrollbottom.png | Bin 0 -> 103 bytes .../scrollgroove-bottom.png | Bin .../scrollgroove-horizontal.png | Bin .../scrollgroove-left.png | Bin .../scrollgroove-mid.png | Bin .../scrollgroove-right.png | Bin .../scrollgroove-top.png | Bin .../scrollhorizontal-active.png | Bin 0 -> 233 bytes .../scrollhorizontal-pressed.png | Bin 0 -> 249 bytes .../scrollbars_large/scrollhorizontal.png | Bin 0 -> 222 bytes .../scrollbars_large/scrollleft-active.png | Bin 0 -> 97 bytes .../scrollbars_large/scrollleft-pressed.png | Bin 0 -> 97 bytes .../buttons/scrollbars_large/scrollleft.png | Bin 0 -> 101 bytes .../scrollbars_large/scrollmid-active.png | Bin 0 -> 207 bytes .../scrollbars_large/scrollmid-pressed.png | Bin 0 -> 213 bytes images/buttons/scrollbars_large/scrollmid.png | Bin 0 -> 199 bytes .../scrollbars_large/scrollright-active.png | Bin 0 -> 114 bytes .../scrollbars_large/scrollright-pressed.png | Bin 0 -> 114 bytes .../buttons/scrollbars_large/scrollright.png | Bin 0 -> 108 bytes .../scrollbars_large/scrolltop-active.png | Bin 0 -> 118 bytes .../scrollbars_large/scrolltop-pressed.png | Bin 0 -> 121 bytes images/buttons/scrollbars_large/scrolltop.png | Bin 0 -> 104 bytes src/widgets/scrollbar.cpp | 24 +++++++++--------- 28 files changed, 12 insertions(+), 12 deletions(-) delete mode 100644 images/buttons/scrollbars/scrollgroove-bottom-minimal.png delete mode 100644 images/buttons/scrollbars/scrollgroove-mid-minimal.png delete mode 100644 images/buttons/scrollbars/scrollgroove-top-minimal.png create mode 100644 images/buttons/scrollbars_large/scrollbottom-active.png create mode 100644 images/buttons/scrollbars_large/scrollbottom-pressed.png create mode 100644 images/buttons/scrollbars_large/scrollbottom.png rename images/buttons/{scrollbars => scrollbars_large}/scrollgroove-bottom.png (100%) rename images/buttons/{scrollbars => scrollbars_large}/scrollgroove-horizontal.png (100%) rename images/buttons/{scrollbars => scrollbars_large}/scrollgroove-left.png (100%) rename images/buttons/{scrollbars => scrollbars_large}/scrollgroove-mid.png (100%) rename images/buttons/{scrollbars => scrollbars_large}/scrollgroove-right.png (100%) rename images/buttons/{scrollbars => scrollbars_large}/scrollgroove-top.png (100%) create mode 100644 images/buttons/scrollbars_large/scrollhorizontal-active.png create mode 100644 images/buttons/scrollbars_large/scrollhorizontal-pressed.png create mode 100644 images/buttons/scrollbars_large/scrollhorizontal.png create mode 100644 images/buttons/scrollbars_large/scrollleft-active.png create mode 100644 images/buttons/scrollbars_large/scrollleft-pressed.png create mode 100644 images/buttons/scrollbars_large/scrollleft.png create mode 100644 images/buttons/scrollbars_large/scrollmid-active.png create mode 100644 images/buttons/scrollbars_large/scrollmid-pressed.png create mode 100644 images/buttons/scrollbars_large/scrollmid.png create mode 100644 images/buttons/scrollbars_large/scrollright-active.png create mode 100644 images/buttons/scrollbars_large/scrollright-pressed.png create mode 100644 images/buttons/scrollbars_large/scrollright.png create mode 100644 images/buttons/scrollbars_large/scrolltop-active.png create mode 100644 images/buttons/scrollbars_large/scrolltop-pressed.png create mode 100644 images/buttons/scrollbars_large/scrolltop.png diff --git a/images/buttons/scrollbars/scrollgroove-bottom-minimal.png b/images/buttons/scrollbars/scrollgroove-bottom-minimal.png deleted file mode 100644 index ff5792c03ce20c8d554ae09c602bcbd1bb970605..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^fFdh=fKif>+q5p_djwD@+|$J|MB;LCNs##O`fuN~+t&N& z@GN0^S6?sjNA`;342csgcmDr7a8t+VQWFmdr04Hfx~Y&HYS^I&mdKI;Vst0N0v4jsO4v diff --git a/images/buttons/scrollbars/scrollgroove-mid-minimal.png b/images/buttons/scrollbars/scrollgroove-mid-minimal.png deleted file mode 100644 index 16be9b99050c2f472a18b697ae514f4c7d543bf9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 155 zcmeAS@N?(olHy`uVBq!ia0vp^f|gW!U_%O?XxI14-? ziy0WWg+Z8+Vb&Z8ke(7xUsv`AjFOC+Oo`bd^zQaYY4jv*3LlYjjGZ_mtQyrJMv zx`E#^nb$j-4DZCGcs~#eWH)}WrA4gbM+6hY{U)OgVrGlHf%+IcUHx3vIVCg!090Kc AJpcdz literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollbottom-pressed.png b/images/buttons/scrollbars_large/scrollbottom-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e766e3a1015bed1b35b5206b55cfabe4d7e840b2 GIT binary patch literal 102 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQo5cljv*3LlYjjGZ_mtQyy3&2 z^n$zvGSTjhhIe98ydQ`KGA^Fcna8R7;loB2h85o|jlQm9{0r2`;OXk;vd$@?2>_2q BArJrn literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollbottom.png b/images/buttons/scrollbars_large/scrollbottom.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad530bd4b0821dc7ee3650d67be34a7c74c7ed3 GIT binary patch literal 103 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQhJ^)jv*3LlYjjGZ_mtQyrJMv zy1)eHq{>qp`m`kupLN~Lk|bDaz#QhC(c0dx%3%9Y(BNm`e22WQ%mvv4FO#oio B9y|a5 literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars/scrollgroove-bottom.png b/images/buttons/scrollbars_large/scrollgroove-bottom.png similarity index 100% rename from images/buttons/scrollbars/scrollgroove-bottom.png rename to images/buttons/scrollbars_large/scrollgroove-bottom.png diff --git a/images/buttons/scrollbars/scrollgroove-horizontal.png b/images/buttons/scrollbars_large/scrollgroove-horizontal.png similarity index 100% rename from images/buttons/scrollbars/scrollgroove-horizontal.png rename to images/buttons/scrollbars_large/scrollgroove-horizontal.png diff --git a/images/buttons/scrollbars/scrollgroove-left.png b/images/buttons/scrollbars_large/scrollgroove-left.png similarity index 100% rename from images/buttons/scrollbars/scrollgroove-left.png rename to images/buttons/scrollbars_large/scrollgroove-left.png diff --git a/images/buttons/scrollbars/scrollgroove-mid.png b/images/buttons/scrollbars_large/scrollgroove-mid.png similarity index 100% rename from images/buttons/scrollbars/scrollgroove-mid.png rename to images/buttons/scrollbars_large/scrollgroove-mid.png diff --git a/images/buttons/scrollbars/scrollgroove-right.png b/images/buttons/scrollbars_large/scrollgroove-right.png similarity index 100% rename from images/buttons/scrollbars/scrollgroove-right.png rename to images/buttons/scrollbars_large/scrollgroove-right.png diff --git a/images/buttons/scrollbars/scrollgroove-top.png b/images/buttons/scrollbars_large/scrollgroove-top.png similarity index 100% rename from images/buttons/scrollbars/scrollgroove-top.png rename to images/buttons/scrollbars_large/scrollgroove-top.png diff --git a/images/buttons/scrollbars_large/scrollhorizontal-active.png b/images/buttons/scrollbars_large/scrollhorizontal-active.png new file mode 100644 index 0000000000000000000000000000000000000000..3dc98f743c18b9b0186fd6a9cc295a58520c83fb GIT binary patch literal 233 zcmVX1^@s6{f;y^00026NklbY;-@0F51`Jb-5WeeV3~J6~ z{Db1!*on@S;ZBA7nVPePb7SJT6W&adIkN(~*ls_ugs-}7Ci>N}N;G4tqg!ngXqysF jXCy;>)C~Up_wBX1^@s6{f;y^0002MNklQ7v zBwU97jmW~;AI_(NC82y#X1^@s6{f;y^0001`NklMQ5&Rzi%5g~EnLFDV)}8nh@W7us**Uf+)y5$;zYZDaHhRHJJS+h3Mqu5 z2|-~{aTwZ!3gek Ycf$ctYv?P}$^ZZW07*qoM6N<$f)LSNv;Y7A literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollleft-active.png b/images/buttons/scrollbars_large/scrollleft-active.png new file mode 100644 index 0000000000000000000000000000000000000000..9b46a81a431ecfbb33edea005eb480e49676d56f GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8G(24#Lo_BP|M>skp4sY{zyYlj v3m$i=9XRxH{y~e%kO}Xa3OGL{3%4)|X__AUSN`-JP!EHrtDnm{r-UW|BuOBs literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollleft-pressed.png b/images/buttons/scrollbars_large/scrollleft-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..e50d2ebd2d19ef5230cf0be60e25a92a1b21fb73 GIT binary patch literal 97 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8G(24#Lo_BP|M>skp4sY{zyYlj v39_wf2M&Fne{g4F$b@%I1)QIfggTe~DWM4f{#hR* literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollleft.png b/images/buttons/scrollbars_large/scrollleft.png new file mode 100644 index 0000000000000000000000000000000000000000..1b06489af3e5bf05b02e7cf73cb57070ddf74911 GIT binary patch literal 101 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8bUa-gLp07O|M>skp4lo*!E1u! yaZ%rf*2nhEo%Ujmj5`Azqqq*Kp6K@#U}F%8)jORY@$xHBAA_f>pUXO@geCw4Rvlgd literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollmid-active.png b/images/buttons/scrollbars_large/scrollmid-active.png new file mode 100644 index 0000000000000000000000000000000000000000..000f4f9659ea514781cc323e34f275ca5761525b GIT binary patch literal 207 zcmV;=05JcFP)P000LF1^@s6{Wa!@0001%NklFE_Q>aoT$XOL+G)|2B>ITn{Rhh)-S5iT3SOw%D+Y5*U6B_IsVcV z>E8v(ylja~WsRN^4T=$uugln7SmE^O`tlWJIY&)BYZ6NJ`_e1y6qvjmNtCJ>@ zr_-EI1x#-fzPi3K@t)Kp@Bi#ed)I&OXPCXp`-0be_u!?gzAWC>BHrMs$<{GnNge1; N22WQ%mvv4FO#mMRQtIT`Y}+~2Y* zAf}pe`@Q;yrYzh4tI1B>_UF<+C0P#7whwJ5%tEc=&%EVZt}URzB~sKHFWwUIXNE0{ zVbiO%4?ecMZN9HR(Nmb!C?Ws%o1`7C9479)p90IvWA|QZS>M9p;j=_7^6tK0o)!(u z`&9eyXMYvm*?zUs?~6)`*7Zvq8&Bo@d&yn2OpWtl)B7@@%NRUe{an^LB{Ts52$4|b literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollright-active.png b/images/buttons/scrollbars_large/scrollright-active.png new file mode 100644 index 0000000000000000000000000000000000000000..3da73626448ea1e3f23dc91a8c9c85fb7572e387 GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8EInNuLp07O|M>skp4lqxfYylx zkAKMrZ+QHnzJ!yl?a)!@2!m?AudKq=nnG6!k1Cxw^l|=<4&^8T2Cs!Ks~8S?I|B`2 N@O1TaS?83{1OSqZCTjoy literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollright-pressed.png b/images/buttons/scrollbars_large/scrollright-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..dbd5e343db35d52ef38bb209320e9de84fdc8b9a GIT binary patch literal 114 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8EInNuLp07O|M>skp4lqxfYylw z*{|}!1$X=ZzYyZ#5kAMCc<@~E74bE9eI_m_6%lh3oA>{StIWkF2F^b|Nj2x4&H)W! N@O1TaS?83{1ORXCCbj?o literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrollright.png b/images/buttons/scrollbars_large/scrollright.png new file mode 100644 index 0000000000000000000000000000000000000000..9c71a84f527567b50b19f182f70a7fc0564e1028 GIT binary patch literal 108 zcmeAS@N?(olHy`uVBq!ia0vp^tUxTu!3HFMRzCr8j6Gc(Lp07O|M>skp4lqxfYylx zkAKN`Tx6MC?b!4`khS)+JL^hK4$evwN3p*DM_gqtHZgcB+q`5kzTgGa&fw|l=d#Wz Gp$PzKU?M#L literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrolltop-active.png b/images/buttons/scrollbars_large/scrolltop-active.png new file mode 100644 index 0000000000000000000000000000000000000000..961297f7cc10a1f3d39b020fc3797c04043d49a7 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQnsEhjv*44lYjjGZ_m8e@bHJN zEsn>(+D|no^OlIP_-8!h$NzMX`K_|)=Ug8&sS3nwk!kb}cPu!bxWUz+n9(ZMDgK-M R5o4f144$rjF6*2UngCQVC{h3b literal 0 HcmV?d00001 diff --git a/images/buttons/scrollbars_large/scrolltop-pressed.png b/images/buttons/scrollbars_large/scrolltop-pressed.png new file mode 100644 index 0000000000000000000000000000000000000000..f6ecfa487b027385448fb0bfcc4c850e16c4088e GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^l0eML!3HEZ{B>^zQVyOjjv*44lYjjGZ_m8e@bHJN zEeEY$*_#^pc}ql8{4?IM^zQu>}Qjv*44lYjjGZ_m8e@bHJN zEsn>(+D|no^OlIP_-8!h$N%&XXP5J+e{a%ln#s-JXJhj_ec!C(K&=d(u6{1-oD!M< DM$IHo literal 0 HcmV?d00001 diff --git a/src/widgets/scrollbar.cpp b/src/widgets/scrollbar.cpp index ef1b85065def..d8f562127699 100644 --- a/src/widgets/scrollbar.cpp +++ b/src/widgets/scrollbar.cpp @@ -27,21 +27,21 @@ #include namespace { - const std::string scrollbar_top = "buttons/scrollbars/scrolltop.png"; - const std::string scrollbar_bottom = "buttons/scrollbars/scrollbottom.png"; - const std::string scrollbar_mid = "buttons/scrollbars/scrollmid.png"; + const std::string scrollbar_top = "buttons/scrollbars_large/scrolltop.png"; + const std::string scrollbar_bottom = "buttons/scrollbars_large/scrollbottom.png"; + const std::string scrollbar_mid = "buttons/scrollbars_large/scrollmid.png"; - const std::string scrollbar_top_hl = "buttons/scrollbars/scrolltop-active.png"; - const std::string scrollbar_bottom_hl = "buttons/scrollbars/scrollbottom-active.png"; - const std::string scrollbar_mid_hl = "buttons/scrollbars/scrollmid-active.png"; + const std::string scrollbar_top_hl = "buttons/scrollbars_large/scrolltop-active.png"; + const std::string scrollbar_bottom_hl = "buttons/scrollbars_large/scrollbottom-active.png"; + const std::string scrollbar_mid_hl = "buttons/scrollbars_large/scrollmid-active.png"; - const std::string scrollbar_top_pressed = "buttons/scrollbars/scrolltop-pressed.png"; - const std::string scrollbar_bottom_pressed = "buttons/scrollbars/scrollbottom-pressed.png"; - const std::string scrollbar_mid_pressed = "buttons/scrollbars/scrollmid-pressed.png"; + const std::string scrollbar_top_pressed = "buttons/scrollbars_large/scrolltop-pressed.png"; + const std::string scrollbar_bottom_pressed = "buttons/scrollbars_large/scrollbottom-pressed.png"; + const std::string scrollbar_mid_pressed = "buttons/scrollbars_large/scrollmid-pressed.png"; - const std::string groove_top = "buttons/scrollbars/scrollgroove-top.png"; - const std::string groove_mid = "buttons/scrollbars/scrollgroove-mid.png"; - const std::string groove_bottom = "buttons/scrollbars/scrollgroove-bottom.png"; + const std::string groove_top = "buttons/scrollbars_large/scrollgroove-top.png"; + const std::string groove_mid = "buttons/scrollbars_large/scrollgroove-mid.png"; + const std::string groove_bottom = "buttons/scrollbars_large/scrollgroove-bottom.png"; } From 57c6b11fc33deaa2b0234219cec8d9bd5b4f4551 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 9 Apr 2016 01:18:44 +1100 Subject: [PATCH 210/240] Updated changelog --- changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog b/changelog index 0b7f312a9d17..509021ccf117 100644 --- a/changelog +++ b/changelog @@ -4,6 +4,8 @@ Version 1.13.4+dev: * Removed support for SDL 1.2. SDL 2 is now the only supported version. * Terrains: * Changed terrain code of Desert Mountains from Mdy to Mdd. + * User Interface: + * Various design improvements to GUI2 widgets * WML engine: * Fix some issues with [foreach] * Fix some issues with backstab-like weapon specials From 016861e6b539ba3c5852f7b68ebbbdc5b1c092f6 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 9 Apr 2016 01:21:20 +1100 Subject: [PATCH 211/240] Mentioned new Loadscreen --- changelog | 1 + 1 file changed, 1 insertion(+) diff --git a/changelog b/changelog index 509021ccf117..84a229d4011a 100644 --- a/changelog +++ b/changelog @@ -6,6 +6,7 @@ Version 1.13.4+dev: * Changed terrain code of Desert Mountains from Mdy to Mdd. * User Interface: * Various design improvements to GUI2 widgets + * New simpler GUI2 loading screen * WML engine: * Fix some issues with [foreach] * Fix some issues with backstab-like weapon specials From f507a42188122f6f2cc31c59a0693a269fee741f Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sat, 9 Apr 2016 01:27:02 +1100 Subject: [PATCH 212/240] Added Jetrel's trashcan icon set --- images/icons/action/trash_25-active.png | Bin 0 -> 304 bytes images/icons/action/trash_25-pressed.png | Bin 0 -> 299 bytes images/icons/action/trash_25.png | Bin 0 -> 727 bytes 3 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/icons/action/trash_25-active.png create mode 100644 images/icons/action/trash_25-pressed.png create mode 100644 images/icons/action/trash_25.png diff --git a/images/icons/action/trash_25-active.png b/images/icons/action/trash_25-active.png new file mode 100644 index 0000000000000000000000000000000000000000..2fd98ec68d4cb8171ee4c143bb7d2d118534ac8a GIT binary patch literal 304 zcmeAS@N?(olHy`uVBq!ia0vp^k|4~%1|*NXY)uAIY)RhkE)4%caKYZ?lYt_f1s;*b z3=G`DAk4@xYmNj^kiEpy*OmPNvoxoGMY&~{4p3;Xr;B5V$MLrz2YC+}@YpQ=m)Pke z@Rhx~MOR|!+@?2zb-C& zk3;23Oluh!uJkJ?EvjQ-kXWmrDinVH;cTr(GRJ;Ol-Rzz8Fg-Z^_I6UKN!XzX1$&1 z_h!?yPqsU^i2VOsSyc9`Zt5f*$8V`xxAa@xv~Ns$8TG3Dh`#hgbJt0~eN~pOP}%Rk v$tEU2ZIG zziw!7$L{EX2{zojD=li7ivK<=ZP9fI>*w9@VA76SF6-Gc4VTpo)*p^pk<~W4cg;MN z`3u+?i|!n_VIaS1mZ5>cnMDevf?X9!LTti@iCx-3A6?B(P7C02)0JE_E#b8C5w-ZH nX?N^gV{W=;ZZzg<(_~P000>X1^@s6#OZ}&00006VoOIv0RI60 z0RN!9r;`8x010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~$*D4?833h%NvC0%S=< zK~zY`ot90G6EP5lzh`wX7zuX3JrD3Iodkwh ziQ4Th*YB%m>(%SGNJ0h`Lk1F<#CFI4tba4Jw(jpT!_?$V0BwB=1r=KBt5T%D2MQujA0bqW( z=jOwE%@6kgEW16+r#l;3bB0tHuiXJmNbtDm))NE`9MuxThs+8rl1qUHl3W6UmX73p&AJ4 z?Eo+ZB~&u!tdZ71uo-z>f@-$Om_^60X`*oL7;I6}+__6A2(FxG-xuM^1~#iVb9Y=` zhg=I?X{fgYPWi5;)XZ5MYWSZ~&hBd@I+3Wmb-p*$6;b3mPD5CF_WM@xLH$ago6>lW93v8mOtG+O&^YuY(HsmTWZEq=&8X@;Ej^dO)GhY>E z*1xu5%YSMvm@%!cJdHa2?i6Rk*bw)sepy)6F`(NF8P<+)!5{F;OiID`&|Clj002ov JPDHLkV1g$>K_&nI literal 0 HcmV?d00001 From 1702f10360d245d21443ab02c6c3a1efab9235b5 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 10 Apr 2016 06:47:50 +1100 Subject: [PATCH 213/240] tbutton: fix borders of disabled state buttons not being gray --- data/gui/widget/button_default.cfg | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data/gui/widget/button_default.cfg b/data/gui/widget/button_default.cfg index a6b5b559da92..7d8e7f412aa4 100644 --- a/data/gui/widget/button_default.cfg +++ b/data/gui/widget/button_default.cfg @@ -148,8 +148,9 @@ [draw] {_GUI_STATE "background" - ({_GUI_BORDER_COLOR_ALPHA {ALPHA}}) - ({_GUI_BORDER_COLOR_DARK_ALPHA {ALPHA}}) ("1, 10, 16, 255") "~GS(){IPF}"} + ("128, 128, 128, {ALPHA}") # Same as GUI__FONT_COLOR_DISABLED__DEFAULT, but with an alpha componant + ("89, 89, 89, {ALPHA}") + ("1, 10, 16, 255") "~GS(){IPF}"} {GUI__CENTERED_TEXT ({FONT_SIZE}) () ({GUI__FONT_COLOR_DISABLED__TITLE})} From 47bb358003efa3d19571ecd0970c1adfa3866d95 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 10 Apr 2016 06:48:17 +1100 Subject: [PATCH 214/240] GUI2: removed extra + 2 offset from GUI__TEXT_VERTICALLY_CENTRED --- data/gui/macros/_initial.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gui/macros/_initial.cfg b/data/gui/macros/_initial.cfg index 7510f839d635..f0021beee88f 100644 --- a/data/gui/macros/_initial.cfg +++ b/data/gui/macros/_initial.cfg @@ -29,7 +29,7 @@ # If the text is too high it returns the top side. # Rounding happens to the bottom side. #define GUI__TEXT_VERTICALLY_CENTRED - "(if(text_height < height, (height - text_height + 2) / 2, 0))" + "(if(text_height < height, (height - text_height) / 2, 0))" #enddef #define GUI__CENTERED_TEXT FONT_SIZE FONT_STYLE FONT_COLOR From 25e8d4f07c0cb3e15e60d5570f01e6eddc62cd25 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 10 Apr 2016 06:51:06 +1100 Subject: [PATCH 215/240] tlobby_main: use large buttons for main controls --- data/gui/window/lobby_main.cfg | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/data/gui/window/lobby_main.cfg b/data/gui/window/lobby_main.cfg index 77b6e6e3359c..faa03e41969e 100644 --- a/data/gui/window/lobby_main.cfg +++ b/data/gui/window/lobby_main.cfg @@ -679,7 +679,7 @@ border_size = 5 border_size = 5 [button] id = "quit" - definition = "default" + definition = "large" label = _ "Log Out" [/button] {VERTICAL_SEP} @@ -687,7 +687,7 @@ border_size = 5 border_size = 5 [button] id = "show_preferences" - definition = "default" + definition = "large" label = _ "Preferences" [/button] {VERTICAL_SEP} @@ -695,7 +695,7 @@ border_size = 5 border_size = 5 [button] id = "refresh" - definition = "default" + definition = "large" label = _ "Refresh" [/button] {VERTICAL_SEP} @@ -703,7 +703,7 @@ border_size = 5 border_size = 10 [button] id = "create" - definition = "default" + definition = "large" label = _ "Create Game" [/button] {VERTICAL_SEP} @@ -711,7 +711,7 @@ border_size = 5 border_size = 5 [button] id = "join_global" - definition = "default" + definition = "large" label = _ "Join" [/button] {VERTICAL_SEP} @@ -719,7 +719,7 @@ border_size = 5 border_size = 5 [button] id = "observe_global" - definition = "default" + definition = "large" label = _ "Observe" [/button] {VERTICAL_SEP} @@ -727,7 +727,7 @@ border_size = 5 border_size = 5 [toggle_button] id = "skip_replay" - definition = "default" + definition = "large" label = _ "Quick replay" [/toggle_button] # wmlxgettext: [column] From 344955e4c11a17dcb7237b0ecc4490cf97c2c3e4 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 10 Apr 2016 06:57:27 +1100 Subject: [PATCH 216/240] GUI2: added macro for vertical spacer line --- data/gui/macros/_initial.cfg | 31 +++++++++++++++++++++++++++++++ data/gui/window/unit_attack.cfg | 29 +---------------------------- 2 files changed, 32 insertions(+), 28 deletions(-) diff --git a/data/gui/macros/_initial.cfg b/data/gui/macros/_initial.cfg index f0021beee88f..db950ac1aa78 100644 --- a/data/gui/macros/_initial.cfg +++ b/data/gui/macros/_initial.cfg @@ -279,6 +279,37 @@ [/row] #enddef +#define GUI_VERTICAL_SPACER_LINE + [column] + border = "all" + border_size = 10 + vertical_grow = true + + [drawing] + definition = "default" + + width = 1 + height = (height) + + [draw] + + [line] + x1 = 0 + y1 = 1 + x2 = 0 + y2 = (height - 1) + + color = {GUI__FONT_COLOR_DISABLED__DEFAULT} + thickness = 1 + [/line] + + [/draw] + + [/drawing] + + [/column] +#enddef + ############################################################################### ### ### ### Macros for the normal gui. ### diff --git a/data/gui/window/unit_attack.cfg b/data/gui/window/unit_attack.cfg index 6186bd6c3397..b040c7b2eb10 100644 --- a/data/gui/window/unit_attack.cfg +++ b/data/gui/window/unit_attack.cfg @@ -162,34 +162,7 @@ {_GUI_BIG_ATTACKER_PANEL} [/column] - [column] - border = "all" - border_size = 10 - vertical_grow = true - - [drawing] - definition = "default" - - width = 1 - height = (height) - - [draw] - - [line] - x1 = 0 - y1 = 1 - x2 = 0 - y2 = (height - 1) - - color = {GUI__FONT_COLOR_DISABLED__DEFAULT} - thickness = 1 - [/line] - - [/draw] - - [/drawing] - - [/column] + {GUI_VERTICAL_SPACER_LINE} [column] grow_factor = 1 From 3bfc17a9e9bdb8f42f4b96ac948e191bf2589afc Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 10 Apr 2016 07:06:55 +1100 Subject: [PATCH 217/240] tlobby_main: fix misalignment of game listbox borders --- data/gui/window/lobby_main.cfg | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data/gui/window/lobby_main.cfg b/data/gui/window/lobby_main.cfg index faa03e41969e..321bbff1e7c4 100644 --- a/data/gui/window/lobby_main.cfg +++ b/data/gui/window/lobby_main.cfg @@ -104,7 +104,7 @@ #define GAMELISTBOX border = "all" border_size = 5 - + [listbox] id = "game_list" definition = "default" @@ -794,6 +794,8 @@ border_size = 5 [column] horizontal_grow = "true" vertical_grow = "true" + border = "all" + border_size = 5 {GUI_FORCE_OUTLINED_WIDGET_MINIMUM_SIZE 0 "((screen_height * 30) / 100)" 5 1 {GUI__BORDER_COLOR_BRIGHT} ( From f77b3d7a6fde05cceb3ac123d2eef38edb364b05 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Sun, 10 Apr 2016 07:14:51 +1100 Subject: [PATCH 218/240] tlobby_main: improved formula for game listbox min height --- data/gui/window/lobby_main.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gui/window/lobby_main.cfg b/data/gui/window/lobby_main.cfg index 321bbff1e7c4..a392e13ee102 100644 --- a/data/gui/window/lobby_main.cfg +++ b/data/gui/window/lobby_main.cfg @@ -797,7 +797,7 @@ border_size = 5 border = "all" border_size = 5 {GUI_FORCE_OUTLINED_WIDGET_MINIMUM_SIZE - 0 "((screen_height * 30) / 100)" + 0 "((screen_height * if(screen_height < 800, 30, 50)) / 100)" 5 1 {GUI__BORDER_COLOR_BRIGHT} ( {GAMELISTBOX} )} From 53f1b5a170851a18ef8d7023324f05814ab65371 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Mon, 11 Apr 2016 02:42:24 +1100 Subject: [PATCH 219/240] New Color cursor graphics by LordBob --- changelog | 1 + images/cursors/attack.png | Bin 381 -> 1451 bytes images/cursors/attack_drag.png | Bin 626 -> 1229 bytes images/cursors/move.png | Bin 446 -> 1827 bytes images/cursors/move_drag.png | Bin 366 -> 1045 bytes images/cursors/normal.png | Bin 371 -> 1629 bytes images/cursors/select-illegal.png | Bin 294 -> 2306 bytes images/cursors/select-location.png | Bin 302 -> 1319 bytes images/cursors/select.png | Bin 391 -> 1657 bytes images/cursors/wait.png | Bin 408 -> 2032 bytes 10 files changed, 1 insertion(+) diff --git a/changelog b/changelog index 84a229d4011a..b4f5b9c6c081 100644 --- a/changelog +++ b/changelog @@ -7,6 +7,7 @@ Version 1.13.4+dev: * User Interface: * Various design improvements to GUI2 widgets * New simpler GUI2 loading screen + * New colored cursor graphics * WML engine: * Fix some issues with [foreach] * Fix some issues with backstab-like weapon specials diff --git a/images/cursors/attack.png b/images/cursors/attack.png index b59b774b1eedbe25acc9d5261751cbe965ed7213..25fdd7491d7d87cab5251fe26afc739abc46c0ad 100644 GIT binary patch literal 1451 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|X-o3pW@ zxwECEk&&5&p`nF=g|V}-rJIw1k&%m~lO@ayY?=4V_$# zEG;Z7OkGT!EgWHbJ@bl767!N%VfJPM?S<-f#;e!LxhOTUB)=#mKR*YS0s=DfOY(~| z@(UE4gUu8)d=ry1^FRWcpa_Ea*Cn+mvn(~mttdZN0UW|snOI!lXyRyWVrXJ$=xk&F z_PLRfqqDQ4i<6_PvpFzHDM9t7kP~Y9K*#8Vk_S?9fe8WAAczT1{6G#o`=sUp^Gp#i zbF66Fe2;;F@usJXV@SoVq(A@v+aGpdlv4=%=&Swv|9qzKhAoqtW;Rr*G~AF~vU5qY z)!}+8Rz~47#|;>(BF{DHZAf_RW>EX=)7t-PyRv$=eEBG@P`9x%?7CQ$n$Cp&c!rOz z0R{JW{clh_cz?d$zP6t~_&6?KzP`a?+3xi-7nt0w?VYpg<*RHp6|>md-g*5mpJl6= z*xju;+vM7#w=eCGlACzE@k4?3pTAf)t)HHMllhxzP^s3(zgMsQzp`biCBI_fnghX9YMhUcG$KA%{6<;g1HEFt`28-VHi; z>t5I&zQQaY>Zs_PC3?=uLGE343b!Le)=J$F-m5h{eioO*zuxH+-`|+{@S63Ugm2C2 z`V|XbHa14}iUnBfuyo9Boc8~IkopJv+l}%mpK=uLtx-_^Xn)oDk$s2S_Kof5kFz=C z@RqXZoN#>f&Vf5Prc^>=%he|mTxxTZRE{6-VVSj8DBu_Ol_JiFB<84h%$sVyixx~U zo|I)MEN2-Jw~t}zeg$zI16NkZBAzEANv=RdZcN}%_Q#|D4cBnbs zFhYx+F<(nu;Rlykxdty+Q95>FVdQ I&MBb@0I-?@_5c6? literal 381 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 literal 446 zcmV;v0YUzWP)4Q%}j9K+HKwJD{nd0!+&&ggIqv>WLE{ zv;vSNvKQ)PDy#%(RIZ`*uUi8b(itEmVmU>&RVe%GiQ;lTiot-Tv_75{083_K8-96A zPx=B(zp|Nb@1IKm^z(TQfP0-!kRy|0PWp|>0RX=N(gUzOodG$9q{bXW%t^mM`mp0%f9q;y=2 ztpFia66#4XCpGCY-_6enGVDt>t%)^f?%JLV0g#@TEeEMJwrm=s=nb&B7%H1xs(W96 o5R+m$Uk=R&1JscJv4DToFPI0q7umKdaR2}S07*qoM6N<$f}cOUMgRZ+ diff --git a/images/cursors/move_drag.png b/images/cursors/move_drag.png index bdd335256f2ac3b448162c7df559b7e8fdd472cb..1760d436a81851c75637d2f59c47a7e6bded910e 100644 GIT binary patch literal 1045 zcmV+w1nT>VP)#81Xuq_WoHt38+e1r-D)spFT@ZIqwOZG`|=?@-) z-#fj}`@Y|wcjpp9@PC-=tOuNI%;j?R07^2I*(+Cc0N1Z`X=|?KI_|gL`7!jvWGb_# zsXk(#eF`9kC#FvQpZlDkzgxagFaSVlXliv0}5~zKvR9Tb2>53#amwih;s*< zYWtI^%y-RdWmCP1IB&%YFkq>bp)<2t0RHg~w1vChR&6`zS?2CGp+Z65)8;uDTHM(_ zb)5?xLI*=Z-)diE6wR-)vXEvh_gh=&d)4jk8;Bo?Sv=Iumk1=XuYz-f#JfomJ3a)U}43ShR! z2AB-htH#%Q)ffZ}C*VOq6GD8yxx2@7V!Q!hL38=#hLULky$L)9wt)I+;2z-fjZ%5l z6OLwwC#HyhaSIEcfBxb`gJ_qzrph(dtL(ReHd{ZCPNp(qqf{22a8wM%Cxs9~%;grv zMyYI%WGW*(;i#C)EsD9^qENkxJ%CSu9@VQf+(<%*h9N7y40y{Go#@>JcSc4i?rbwW zF=Z!`b;LhEdBVd7_bKZK@i?CfyyyffB=BzR~d_4CzoHglWJul&CBAW6A30Ko$6KgokC^s zWx&%6m0r}@yh~ADCmndA8~1E z9=&P=RIk!8SOMO#pq5F{o2KjP=I#M3q+@-NQKEMf$F+MrXLPFAZ7TM(yUtXv@)TGD z{;&X=U#0NVERjnC=v5;igs4{zk8m2_h6bYfRW!ePBCaO9ZbIuV8i>(Nj9d2V&E12% z+zMs8_T>~-t=HBI0Z%yEwlno!x#0{fmB&_Xy&%IIUR|aW<3uhEbgfnfzbaRB`|1M< zCj1u(UI&aHzPXo|?&|vAe?IG2ZNq)6ncc}!Y{6>lg|*u8Mhr8-`1qps3@8l6C+WR% zgH~|MXMIVudIRYPqUP_usdnGYcB?q8#A@YpWX+#2E@`nI>o_}Euv_rIriIEUU{|`( P00000NkvXXu0mjfdoJQK literal 366 zcmV-!0g?WRP)X6|~UHtA_i0& zEp@!!)qK5G-7wNhLQjp`+W0qs)9s-Fqd38iGXRW93e*D=2=G#X02Oj-u+tNMQnj<3D4Fmw|`W#O}tR4v>vVM#T zIW=aZIZa{!qJg>D6Q241WSWZrcExrdcrFBRRLAF15>zJuP=5({0_HqFJ5qyMXaE2J M07*qoM6N<$f-S(0j{pDw diff --git a/images/cursors/normal.png b/images/cursors/normal.png index d181bbdccf098d90fe8fe241f8a4c21cbbec7c22..45898885ae70037bd7a58b90a409283c802390cb 100644 GIT binary patch literal 1629 zcmbVMdr;GM9M6CP^JvEya^M4UMHCL(H0gt;P-yxZ9k$lOT>WF(&;}ZzO--XM3>^<2 z;A1dvW5RhGL*3~%QGBv_>QK3M7GPx)iC~AD(|Km*n^Ree?Z% zzV9@dO|NsOOq&7#0M}5cwXkby=!uPH-?^f$PIgIQbXKOADr0;&O#qmKDkVUJ3oj=u z1n#I>c816UfJi4G63W5PkiE`4dmwOX$c z!#NrhMG%=BhUFr;SR+RDY7v5HQ8gOocpg>)OGP?NuhZv9bTF)wq8O~!A*fs~mujUN zITpqm++GHE+ljDUlC?XD)xHp`(9i_VP;?1JRfapj?4%gV>!duOrdS4M8gV=64hgbC z1$r8Q z!G&$zUylZx2d}8M%x$PGYuWxWr!k{8F!R)<+>G{KwER|Z_rv;)l2JJR0nk0A@%oJ! z5r?;?CY|g(cC;e7Wu>WT!=fKJHHUhT%6pf-_f!%|{q&c;JbK2(n*OY_=f3HP?H>DU zq}lde-L-3X$T77~t@o{qWzTq3at-0rN8e&F9 zXTBUHTYIim-G@%l=DiI-W?&bIuJ7yc>kj3WKbqFQ=)JZcmF+=Qtm}5v;Tegy!F3C= z18t29R^Rcq3~y|&3z7*J;S<}JxA`WU&)M6}9e?uoo|M*oyB5}}1P3`84lti{s+o5uuX?oG#Fckp`GlSL z{L`gp);Mmhsf-!-fkhbFo^-6Ne)js@Hauf$Ve6`U2O@9AwG0nBhbmh7pj!W&_&vJ) zi67*=d;aX8CvEB3J~d_R4ZCq692STY7CT;NCBS!XpAO&o=4`g zn+Y2zc9 z3!CO9P~n)fzT-CfXOn Rnh^j1002ovPDHLkV1n$%l_vlI diff --git a/images/cursors/select-illegal.png b/images/cursors/select-illegal.png index 744357d0ec83bb80723ab6d2587542bb3600130b..2273edcdb040997f4f153d130f325de8a135b1cb 100644 GIT binary patch literal 2306 zcmbVOX;c$g8V!ruEWsv-OOQ|m5kVkTAqhz&LN+8~5ZOd+Y_b$2Ko*ih641tmRs=@{ zmysS3MMb*hsO{3W2)H1@;|hW-qR^raf-OiCL>6@_D$e}y^pB}iRqws8?!DjgzIRUL zg@-M{TH~!T7z|br!izvhg6a8YD*9doo;ZXKa}a(k5~)f+(nT5=!iba$mh?+?vrKhL+ru+G-G>IgL!C;s)$YdWB;iJ_n5s}VEsdbxF z;K5pnMy^KWDkWf26p2-72#bhD`Y8p4S}6P?tkixk6k0NpPNXJ5z931VFy-|Ttwkc> z|Az5Zv^GkwhDi~yR+Xlap!<>FHc3Wn_xFxWKr|ZWa*Z6_6j2IKB}r4jN<_e85z#Nc zQn{4L;RJL2Ab&1{K_=7a5JU&*eq29BFb5=)c?=F?QsZk}3Pkmzarm@ge+nOh_*4cP z;_%4~I-O4CQMq*XBv+u+A|j;(p7bk6{eI?B|CY<-YG4tf(nP6LDU%%#E>j^YtxTl` zxREqqflwroD@_JZ(*}LYmj`R)>tJcHMx_8gR+uUON(5{Q+m8ZKAc#u_KW0uQv$~(dN2OgOXnUl2gXJveLxK0|TzC%8f+j5R<*#zS zy*+dQ&jsr&-SJOIJvidlUNwFq-p?2~SG_OUb9kD+ zzGcG zf;qvj9kh4*#C3$A@q?tnQD#?y>S)P!ZhJ6=VN9i^4HXr?#~%d|8)Tc!qiGb2)^#0q z*po3W>wY)B$-e8^KFE&~E+*{I9j~i)FKpddelnLXvg(_jq)f^hdv3EA=}#=WkgvB4 z?`1mmSOAudBj;E4pWXR5Xbq!z$X4(pxAmu+F8P+S2LSy7Sg5W8mR;(-v4?A8+#fXN zzAWxw9b+TA@UYssFk6*kUsv1V_pgbU9(HH1+aJx+lU*a#dvE?>(cs}S{wHFX2)k2_ zup`5+B%8BVyXM_}02UA$cD=V+k^Q?AU}V0kJ~88tgCYxgge>h%yQw<3UhJJi z^=^xGm5V5;*$?i3WqDX{uTk7o>a2_HLxCa2{0sh^Im6_X72;dzKJs48_K5M)R%_el zmA{rFaf)2v+*qIE?QF%iqP@rKV)Z@C7yNu(E-{A83wQdqHgmkVtKYHU5a-@ddmPJk zt*qdeYqHFkwrMDI&-~5g*NJSdP50V{`$heSM)o_+GgutYK7$>}FS+=Dv4(v(wZCMv z-E5(8Zj%48c7eMC+rA;UYX8iM*?SD+kT{=e^|h{J(c`t%ozKc&ZJ{M%6-64yErp)u zZ=W1TCNjh4DQ?7O*!)&DO4*yy!|Wa&P{)keMYRz6o;sIOqf#1Mcb6ut^AJ~gw&7U8 zZLJmr<1Qn$vq^G=NJn7n@v0vVjbMD@m^-gEc?rYPSe=j)WUs_R_V`D6DSa82V z-Jn0^dH;nO%^WOTeIPxwvy+w>>82xCo_xr+t`%oia1WFfejhzLl>F;L3y`(c;l_fh z8Uw+)3U`?qbT#I#!^MVy)!4Fol{jN@sYiEAG5*%AtPsbf_3o>Ds!Ff*n2kf1lg93l z#`gzvM`yWjZA!0f%EE=duMLk#og%sdCV1Xo@5w)n``~sN0oneEP)Gy~^xXpY)oq}~A_gWLNW8PXzfeE;+j$jBBo@Y90F^OcaPK#9x;YGfi%w*zE8 zP&b(m)W~rz0h~bgnL)}6jc-vS$9Hs&uogv=DGv)438*uxt)=#&k$~!n#4(bf&WPsX skSnNqqRxDI0+a`^dM~b2DwW^!0`_nm3CX-?p#T5?07*qoM6N<$f>!~4t^fc4 diff --git a/images/cursors/select-location.png b/images/cursors/select-location.png index 3e124ae585b025ef73f5dc17cf9a0764595469c9..aaed99495a43d7be94b68b34035e6758e4a76dd7 100644 GIT binary patch literal 1319 zcmbVMZA{!`9PfrAVh*=Nylfv#EeN9A_2pi;77n~?@3vb!b~|nvQKyvN1J^;@vn^i1 zm&AnxQ8xm~)Q#kV7mP96F=CWBSajgrVisoD4*fv(!KUr= zJpcZGzyEuCBlX)XgalxN{gQ2Re<>7N;5!1 z65k4T1s+Yn7g|hG8LgW%uZE=Md8~yMd*-#tcN%+2EW+jVw~~&gRFzBVriP9+#Ztj z5FQ8Xpo4ybqBz=5=Q!5GI!Tu^;0lnzDrbNs11{P}`U4d0@pxREi}m<&*pRI0yexp6 zT@l({#S(YLGOP-CT~T9-(w^&pNJ7ySEukb)w!w`)9_9s6HU$-CfmY(>fGWNO;z3oB z(B%v>;yNDqoIZz>bdn@X5zCQNl#gY7oZlBln2kx^=1d@-ni&4DFi$&+a%oK9La50*D& zD=+^Pp1PtVTVwxMYH ztoNxC3b%U(eD2IU_UMJY>)pi_i=~IP$?-DnZNjo=@$k~X^}&yg?_O;i{j`7Tz*m{_ znQN7^cZxqck(j=;Z`bgfwdLN~rEf#uKmVg;c(|nZ;*&=Kb#bTwx7;r;9J+j_@u3WM zauJPe20y>hSL@pKaJu@}P$pZHuD-M*lPye-96yus%y$2|Z5Z47!PU}(V}-_8?bPqL blnwdFLc`6boBi`Yn7^)2pq?A?H|_ri;qTH_ literal 302 zcmeAS@N?(olHy`uVBq!ia0vp^8X(NU1|)m_?Z^dEUp-wMLn>~)o$kox(o z(WU=6c3riuWHgUExb#7#)@Fg04#!0&m$f$X2ftW6+5Ykwt2)t8)4l6T{%+@-{deQM z(@ZC`lP@KiUj15T?vQl%^3P9_1uDHQKa030sO|X3Ysy%(*V;k-KaY79(;SAEO^+uO z+;OysoxJOrLCa&a62I1x11D#FIb7)Lq|Q6*a{U}0nfEHpA`eS^jT|n-nfo=bYP*KODEUs#$V;@i&8Y6$~%!WPY!H``-u{01Te4elF{r5}E*r34p5r diff --git a/images/cursors/select.png b/images/cursors/select.png index 91a37b715596057c1b1cd3ba9d1929214314bd36..a6c528c4056a1a193c7655e58ac4884ed5ae9e95 100644 GIT binary patch literal 1657 zcmeAS@N?(olHy`uVBq!ia0vp^av;pX1|+Qw)-3{3k|nMYCBgY=CFO}lsSJ)O`AMk? zp1FzXsX?iUDV2pMQ*9U+m@_g%B1$5BeXNr6bM+EIYV;~{3xK*A7;Nk-3KEmEQ%e+* zQqwc@Y?a>c-mj#PnPRIHZt82`Ti~3Uk?B!Ylp0*+7m{3+ootz+WN)WnQ(*-(AUCxn zQK2F?C$HG5!d3}vt`(3C64qBz04piUwpD^SD#ABF!8yMuRl!uxSU1_g&``n5OwZ87 z)XdCKN5ROz&`93^h|F{iO{`4Ktc=VRpg;*|TTx1yRgjAt)Gi>;Rw<*Tq`*pFzr4I$ zuiRKKzbIYb(9+TpWQLKEE>MMTab;dfVufyAu`kBtHuNWFoz#!AFNG#Ad)HBe}%?0@jth%@)C>7xhtg4GcDhpEegHnt0 zON)|$@sXws(+mtd{1$-}0$pR}Uz7=ql*AmD{N&Qy)VvZ;7h5Huj9yA+ij|X-o3pW@ zxwECEk&&5&p`nF=g|V}-rJIw1k&%m~lO@ayY?=4S_sM z3kwTV7gJ{oN0?sEyyB9?yyR4vy_rCJp?VGR>a}t%N=+=uFAB-e&w-_YfQ?Cj{`b4op%?P`xSSgql9kG5Vn7fs|ZeLclZ#V!{(YkOR*?sd>OWQv}Q$ zpHHsY#K6F`+|$J|q~cc6pa1{u4>vGOIBL+t`hj8NsWVTb|Igo9^V+^c?RZSijLwES zPKC1lUmqyWNM5tp%anh!zy$W+Kd${{=Sg3GXIYlVW`V^XzJZOa_OUXmC5h_Y-_*Wp znsDmJre5iTC7#DienriB@cz8O%g0Q|O8B!R46aRNPuC9GB&I3W9K1O{>SiUYWGB;v z1Kn5Ccy2wKFh#f4c9!C~nMUpg4>w$4$awiS{dm|R*6s34X@6e7mRz#t(8HXZK85Q^ z8bFO}x>o)x?wFPLsAJZ;h`scGexS1oU372S6yVaNAZ>^COO z-K=h`;%CR3_PCg3B`XL2m7+FgZ)-`V>F?XTS+1;e4&>NmBj|Cx?KP9`lLU)zkCmEb z*pCQ4iTJ}hrLRhR^EQU&+wBs}v%=%rELctoK4JOFt+0<{>A|O;XT5EgkXdxPbCrt2 z!lFmL43T2>jZs{SBonp@Y24ssoS>Ze>f~9!4-eWTJMtKuZA9<0|UM>MV({NF{>4k z$V=#To*;1|N!zxz?d;}VA&D=WW4aw@=_@?Xj^Jd|atP4o4Q2a&C1%6XBfq8vaI?%i z)V%rifoV-V`EzX8ofSP~LM{oujuuF8$%{2IGFmh}$?U+XBLBIGR@6W7lVJ((pWxT@dU!|=@Ui}M&)Jh$H|cKFrfw;Q6mc1-Kk z+T-fg^Hj&8=|V(uRa|8YRYpd z!B(N#+S4y)fzWB$u%d~K4z1_?7VIqd*eWrtyz;~ri8;KD&mNtPVqj!rVC;)o^{3V- Q2~-()y85}Sb4q9e0B;vwVE_OC literal 391 zcmV;20eJq2P)qbEPZ*i zJ9*#Z@tC_WM`ZiT0KGn$S3O*sHzs{yG643qzIBD*W8hOWm!>6WBhz9GPzUEbAVUAq zt~VcZgh_D1;OG0TgU4C|kSfk1^gSCCcyBWw0stZ^yji|bl?n(bkZMrj zDB4h}q!ma8`C$K5x%B4{)oTPu%DW`9R_#L-UJV920Z87ada2mm*c6V={4NuqQa9f1 l<;vRe-a3Q5bTBv=*e~!5?s16gqMHB!002ovPDHLkV1kFPr~m)} diff --git a/images/cursors/wait.png b/images/cursors/wait.png index 31ec10805a35a896275201fd691a544b929c0f7d..9c8e8bc653fa16a93e34cd190c90e9b601a09b6e 100644 GIT binary patch literal 2032 zcmbVMYg7|w8XhhUXhYZ2rE*!tF^U&zE|ZXuL;|@Hpf!L%A$C}~~JklVVp#gbAHP|~87s#uG*f?LH3f(S@xc7kC0!_yy~Gc(`!z4JcL zd!NFXsBn+vzRLjs@Q92M#$v0V<8jAf@2!;6A7P7+AxvV3Lz4|zunqxu3RH%Gk!m;v ziA7+ADdQp%3;-^v%6N%EBHqT9qiPcD&>lKst#=lv5xGWH3ljAf3U0wt!R$L?u(On?ZyE*>nb*8U!w0 z1k9RFk<5-2iWY5QCk`RiV9>J3QcxMi^XzqP^m;rgQz!Y46u=?(XU%# z5F&cHPN_90Q4Q!|gk@-^fkVJNeI9~ZD;B>X*60@#g{6#agtcUdL?Nryj<^=I^@dpF zS2td&t&cZp5ppb|M>BPDtRBhhmcUr3lzUnHPGK>`+wN@Xx1h)H461T>b2PoYwUEIwb`0zHpci0G7i5QRvGs=4ToKn;06G$evv|6 zyz!>YX19mB;IW!a0GkVmna*d|j1EwCR$s%fv`jy6+bOQ{`pYrmMzZS(;?&L`WJ!Zn zKE{f9?~YsFyWT67Sfz?DoV~AXsRUvf+=j7}7j~cLuDy}-bKUyOHm@7QlFKtmwGzVC z{pC)B*Ly<>W_^d{irafvH~F|vH`b3>$)Bux?~#1P$Ie}kxamMwFt;Wg*wqoyJ=E!0 zU%6xKt7T{UWC@8eV%XN#+x2Ah@es%B{U`O#gIQ%?h2yqKy12ZyKNq2UT^|;y8mlCO zLo}!@dqa$^VP?VX0S)jrG^qs#Lvas|K5nztN7TblC0leUI(8bG6R%{o^&&6`s+( zGTh*s#7(vXS8?^9+pD>i`?3$6b~}MvBV7yH)8>xb@%`hk-h z8HZZl04YEK7oRusG`r@+pVnUfD1Kz_-;E)w)BLDEHRr&_FV=QzYvNW7$CcT(m!Uj! zp6Z^y$VB6R<7_H?)w3r?Fuia2D>1fRvlm=mOD_AEjP6ca{z1W9WfgNnDipY8-&@DS zYxz!`U#=y1eZU>b-A-FWyJPK%xSx0INb$pLyo*m?(6@)nOAAZn-ZQTjSyIlD^8YqF zbM4INwuT1pDF%H4+H%PM;iT%4uwsCasHwJ&&-nJ!a6ul&-!6C>+@A4h_$4kliIny)Oc*8dW1nz>^!D+UgZcieBwGr!JN zHCLA&TsA9l_v|@*6Sw=|HfyN#@mXf*Rrjur7S*9Eeeb*(wWluS(fs7Ro2B^}Kj6$n z%ZhU$$uirV{dOorV%yc8S^C51=o~&M!OC!}`z&dov2;*6>n)jXoeDSobpBGRqOXbg z;XS<0Q#_G@RuvNubeKm2Tu6PeS*nU?T;I%ia4~&|`s1nf%_H&{kGnY!ZlZsWMxRp8 z*`K)yI=}rcxARGPVv@HXhhGxiU2gHt`Mf={wUpO!#_8Ffxx7rcmKQ|==xQD>!!^+h rceK=h(|fJjm37_S0ei7O1pq{bMF~&yrF;JmRii#~ literal 408 zcmV;J0cZY+P)LfB?K?Q2T%x&Yo>o+Zx`+5YSz z=fDgZbM?VB8E4%|sr0U;)2R)7=u%G3%-9_VAU z2a_ From 37deb40b9b32d5f41d4825ed511ac55095caf676 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Mon, 11 Apr 2016 16:40:00 +0300 Subject: [PATCH 220/240] Server-side fix to /adminmsg not working right --- src/server/server.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/server/server.cpp b/src/server/server.cpp index 86030c5c1dc8..802ec74231dd 100644 --- a/src/server/server.cpp +++ b/src/server/server.cpp @@ -1295,7 +1295,7 @@ void server::process_query(const network::connection sock, // Commands a player may issue. if (command == "status") { response << process_command(command + " " + pl->second.name(), pl->second.name()); - } else if (command.find("adminmsg") == 0 + } else if (command.find("adminmsg") == 0 || command.find("report") == 0 || command == "games" || command == "metrics" || command == "motd" From f84e8f4795c66d07e350f8211429a40d5ebf932b Mon Sep 17 00:00:00 2001 From: Dugy Date: Thu, 7 Apr 2016 00:34:09 +0200 Subject: [PATCH 221/240] Added a new way to generate unit names, using rules of a context-free grammar. --- data/core/macros/names.cfg | 166 ++++++++++++++++++- src/CMakeLists.txt | 1 + src/SConscript | 1 + src/race.cpp | 18 ++ src/race.hpp | 4 +- src/utils/context_free_grammar_generator.cpp | 123 ++++++++++++++ src/utils/context_free_grammar_generator.hpp | 61 +++++++ 7 files changed, 371 insertions(+), 3 deletions(-) create mode 100644 src/utils/context_free_grammar_generator.cpp create mode 100644 src/utils/context_free_grammar_generator.hpp diff --git a/data/core/macros/names.cfg b/data/core/macros/names.cfg index 582d59ac93b8..a06301d8d2f9 100644 --- a/data/core/macros/names.cfg +++ b/data/core/macros/names.cfg @@ -17,62 +17,226 @@ #define DRAKE_NAMES male_names= _ "Egar,Elch,Ga’ash,Gadé Ihn,Gakré Ohm,Galeck,Galsh,Garadin,Garchin,Gark,Garlan,Garlin Ohn,Garrutin,Gart’lo,Garushi,Gashinar,Gashol,Gaushii,Gaustun,Gegchi,Gelka Kon,Gelknick,Gillan,Gisharri,Gost,Grada,Græt Ihn,Grashen,Gravlan,Grag,Grelnit,Grenn Ohn,Greth,Gribbel,Gridda,Grish,Gron Ihn,Ka,Kahn Ih,Karigan,Karri Kon,Karron,Kask,Kegrid,Kerath Ihn,Kerath Kor,Klash,Kon Garashé,Kraag,Krall Ohn,Kran Kor,Krash,Kraslar,Krenli,Kruggen,Kun,Mah Toa,Margian,Mar’Ildian,Markan,Markinos,Mar Ohn,Marra Di’lek,Marrito,Marritos,Merkush,Merritos Gark,Morusté,Murr,Omataké,Reshan,Vashitt,Velnick,Veralon,Veramo,Verath,Verditt,Verkon,Verlinn,Vermad,Vertick,Vladnir" female_names= _ "Alen Ka,Alinash Mal,Ashirt,Auginet Ka,Auuglann,Damell,Dell,Demla,Dinsill,Eshi,Olath,Omage,Omagrra,Orra Ka,Orridan,Orrida,Oshibi,Vallin,Valnirra,Valnitt,Velisk,Verra,Vellin Ka,Veshtar,Vushtin" + male_name_generator= _ << +main={prefix}{suffix}|{prefix}’{suffix}|{prefix}{suffix} {short_name} +short_name=Ohm|Ihn|Ohn|Ka|Murr|Kon|Elch|Ko|Græt|Egar +prefix=Ga|Ge|Gel|Gi|Go|Gra|Gri|Ka|Ko|Kla|Mar|Di|Mer|Mor|Oma|Re|Vel|Vash|Ver|Vla +suffix=ash|kré|lsh|lin|rutin|shinar|rushi|ka|ash|ag|all|ash|slar|li|dian|ritos|rusté|shitt|nick|rath|ditt|kon|mad|tick|nir +>> + female_name_generator= _ << +main={prefix}{suffix}|{prefix}{suffix} {short_name} +prefix=Al|Ali|Ash|Aug|Auug|Da|De|Dem|Din|Ol|Oma|Orri|Oshi|Val|Ver|Vel|Vush +suffix=en|nash|irt|glann|ll|ge|lin|nitt|tin|tar|lisk|rida|grra|sill|la|mell +short_name=Mal|Ka|Emth|Dar|Eshi +>> #enddef #define DWARVISH_NAMES - male_names= _ "Aigaithas,Aigaithil,Aigaithing,Aigaithol,Aigalas,Aigaling,Aigalis,Aigalol,Aigalsil,Aigatas,Aigatis,Aigatlos,Aigatsil,Aigatsol,Aigatus,Aigcatas,Aigcatil,Aigcating,Aigcatis,Aigcatsil,Aigcatsol,Aigcatus,Aigdring,Aigdris,Aigdrlos,Aigdrsil,Aigdrsol,Aigduras,Aigdurlos,Aigdursol,Aigthaing,Aigthais,Aigthasil,Aigthaus,Alaithas,Alaithis,Alaithlos,Alaithol,Alaithsol,Alaithus,Alalas,Alalil,Alalol,Alalsol,Alalus,Alatas,Alatil,Alating,Alatlos,Alatsil,Alcatil,Alcatis,Alcatlos,Alcatsil,Aldras,Aldril,Aldring,Aldris,Aldrlos,Aldrol,Aldrsol,Alduras,Aldurlos,Aldurol,Althaas,Althail,Althalos,Althaol,Althasil,Althasol,Althaus,Anaithas,Anaithil,Anaithing,Anaithis,Anaithsil,Anaithus,Analil,Anallos,Analol,Analsil,Analus,Anatas,Anating,Anatis,Anatol,Anatsol,Ancatas,Ancatil,Ancatol,Ancatus,Andril,Andris,Andrlos,Andrus,Anduril,Andurol,Andursol,Andurus,Anthaas,Anthaing,Anthais,Anthaol,Anthasil,Anthasol,Anthaus,Augaithas,Augaithing,Augaithsil,Augaithus,Augalas,Augaling,Augalol,Augating,Augatlos,Augatol,Augatsil,Augatsol,Augcatas,Augcatil,Augcatis,Augcatol,Augcatsil,Augcatus,Augdras,Augdris,Augdrsil,Augdrus,Augduras,Augduril,Augduring,Augdurol,Augdursol,Augdurus,Augthail,Augthais,Augthalos,Augthaol,Dulaithil,Dulaithing,Dulaithlos,Dulaithsil,Dulaithsol,Dulalas,Dulaling,Dulalis,Dulalsil,Dulatil,Dulating,Dulatol,Dulatsol,Dulatus,Dulcatil,Dulcating,Dulcatlos,Dulcatol,Dulcatsil,Dulcatsol,Duldril,Duldris,Duldrlos,Duldrol,Duldrsil,Duldrus,Dulduras,Dulduring,Duldursil,Duldurus,Dulthalos,Dulthasil,Dulthasol,Dulthaus,Glamaithil,Glamaithis,Glamaithol,Glamaithsol,Glamalil,Glamaling,Glamalis,Glamallos,Glamalsil,Glamalus,Glamatil,Glamatus,Glamcatas,Glamcatil,Glamcating,Glamcatsil,Glamcatus,Glamdras,Glamdril,Glamdrlos,Glamdrsol,Glamduras,Glamduril,Glamduring,Glamduris,Glamdursol,Glamthaas,Glamthaol,Glamthasil,Glamthasol,Glamthaus,Glomin,Gomaithas,Gomaithil,Gomaithol,Gomaithsol,Gomalil,Gomalis,Gomalus,Gomatas,Gomatil,Gomating,Gomatis,Gomatlos,Gomatol,Gomcatil,Gomcatis,Gomcatlos,Gomdras,Gomdril,Gomdring,Gomdris,Gomdrol,Gomdrsil,Gomduris,Gomdurlos,Gomdursil,Gomdursol,Gomdurus,Gomthaas,Gomthalos,Gomthasol,Naraithil,Naraithing,Naraithol,Naraithsil,Naraithsol,Naraithus,Naralas,Naralil,Naralsil,Naralus,Naratlos,Naratol,Naratsil,Narcating,Narcatis,Narcatol,Narcatsil,Narcatsol,Nardras,Nardril,Nardring,Nardris,Nardrol,Nardrsil,Nardrsol,Nardrus,Narduras,Narduril,Nardurol,Narthalos,Narthaol,Pelaithas,Pelaithil,Pelaithing,Pelaithis,Pelaithlos,Pelaithol,Pelaithsil,Pelaithsol,Pelalil,Pelaling,Pelalis,Pelalsil,Pelalsol,Pelalus,Pelatil,Pelating,Pelatis,Pelatol,Pelatsil,Pelatus,Pelcating,Pelcatlos,Pelcatol,Pelcatsil,Peldras,Peldril,Peldrsol,Peldrus,Pelduril,Pelduring,Pelduris,Peldurol,Peldursol,Peldurus,Pelthaas,Pelthail,Pelthasil,Trithaithas,Trithaithil,Trithaithis,Trithaithlos,Trithaithol,Trithaithsil,Trithaithsol,Trithaithus,Trithalis,Trithalol,Trithatas,Trithatil,Trithatlos,Trithatsol,Trithcatlos,Trithcatsol,Trithcatus,Trithdril,Trithdring,Trithdris,Trithdrlos,Trithdrol,Trithdrsol,Trithdrus,Trithduril,Trithduring,Trithdurlos,Trithdurol,Trithdursil,Trithdurus,Triththaas,Triththail,Triththaing,Triththasol,Triththaus" + male_names= _ "Aigaithas,Aigaithil,Aigaithing,Aigaithol,Aigalas,Aigaling,Aigalis,Aigalol,Aigalsil,Aigatas,Aigatis,Aigatlos,Aigatsil,Aigatsol,Aigatus,Aigcatas,Aigcatil,Aigcating,Aigcatis,Aigcatsil,Aigcatsol,Aigcatus,Aigdring,Aigdris,Aigdrlos,Aigdrsil,Aigdrsol,Aigduras,Aigdurlos,Aigdursol,Aigthaing,Aigthais,Aigthasil,Aigthaus,Alaithas,Alaithis,Alaithlos,Alaithol,Alaithsol,Alaithus,Alalas,Alalil,Alalol,Alalsol,Alalus,Alatas,Alatil,Alating,Alatlos,Alatsil,Alcatil,Alcatis,Alcatlos,Alcatsil,Aldras,Aldril,Aldring,Aldris,Aldrlos,Aldrol,Aldrsol,Alduras,Aldurlos,Aldurol,Althaas,Althail,Althalos,Althaol,Althasil,Althasol,Althaus,Anaithas,Anaithil,Anaithing,Anaithis,Anaithsil,Anaithus,Analil,Anallos,Analol,Analsil,Analus,Anatas,Anating,Anatis,Anatol,Anatsol,Ancatas,Ancatil,Ancatol,Ancatus,Andril,Andris,Andrlos,Andrus,Anduril,Andurol,Andursol,Andurus,Anthaas,Anthaing,Anthais,Anthaol,Anthasil,Anthasol,Anthaus,Augaithas,Augaithing,Augaithsil,Augaithus,Augalas,Augaling,Augalol,Augating,Augatlos,Augatol,Augatsil,Augatsol,Augcatas,Augcatil,Augcatis,Augcatol,Augcatsil,Augcatus,Augdras,Augdris,Augdrsil,Augdrus,Augduras,Augduril,Augduring,Augdurol,Augdursol,Augdurus,Augthail,Augthais,Augthalos,Augthaol,Dulaithil,Dulaithing,Dulaithlos,Dulaithsil,Dulaithsol,Dulalas,Dulaling,Dulalis,Dulalsil,Dulatil,Dulating,Dulatol,Dulatsol,Dulatus,Dulcatil,Dulcating,Dulcatlos,Dulcatol,Dulcatsil,Dulcatsol,Duldril,Duldris,Duldrlos,Duldrol,Duldrsil,Duldrus,Dulduras,Dulduring,Duldursil,Duldurus,Dulthalos,Dulthasil,Dulthasol,Dulthaus,Glamaithil,Glamaithis,Glamaithol,Glamaithsol,Glamalil,Glamaling,Glamalis,Glamallos,Glamalsil,Glamalus,Glamatil,Glamatus,Glamcatas,Glamcatil,Glamcating,Glamcatsil,Glamcatus,Glamdras,Glamdril,Glamdrlos,Glamdrsol,Glamduras,Glamduril,Glamduring,Glamduris,Glamdursol,Glamthaas,Glamthaol,Glamthasil,Glamthasol,Glamthaus,Glomin,Gomaithas,Gomaithil,Gomaithol,Gomaithsol,Gomalil,Gomalis,Gomalus,Gomatas,Gomatil,Gomating,Gomatis,Gomatlos,Gomatol,Gomcatil,Gomcatis,Gomcatlos,Gomdras,Gomdril,Gomdring,Gomdris,Gomdrol,Gomdrsil,Gomduris,Gomdurlos,Gomdursil,Gomdursol,Gomdurus,Gomthaas,Gomthalos,Gomthasol,Naraithil,Naraithing,Naraithol,Naraithsil,Naraithsol,Naraithus,Naralas,Naralil,Naralsil,Naralus,Naratlos,Naratol,Naratsil,Narcating,Narcatis,Narcatol,Narcatsil,Narcatsol,Nardras,Nardril,Nardring,Nardris,Nardrol,Nardrsil,Nardrsol,Nardrus,Narduras,Narduril,Nardurol,Narthalos,Narthaol,Pelaithas,Pelaithil,Pelaithing,Pelaithis,Pelaithlos,Pelaithol,Pelaithsil,Pelaithsol,Pelalil,Pelaling,Pelalis,Pelalsil,Pelalsol,Pelalus,Pelatil,Pelating,Pelatis,Pelatol,Pelatsil,Pelatus,Pelcating,Pelcatlos,Pelcatol,Pelcatsil,Peldras,Peldril,Peldrsol,Peldrus,Pelduril,Pelduring,Pelduris,Peldurol,Peldursol,Peldurus,Pelthaas,Pelthail,Pelthasil,Trithaithas,Trithaithil,Trithaithis,Trithaithlos,Trithaithol,Trithaithsil,Trithaithsol,Trithaithus,Trithalis,Trithalol,Trithatas,Trithatil,Trithatlos,Trithatsol,Trithcatlos,Trithcatsol,Trithcatus,Trithdril,Trithdring,Trithdris,Trithdrlos,Trithdrol,Trithdrsol,Trithdrus,Trithduril,Trithduring,Trithdurlos,Trithdurol,Trithdursil,Trithdurus,Triththaas,Triththail,Triththaing,Triththasol,Triththaus" + name_generator= _ << +main={long_name} +long_name={prefix}{centre}{suffix}|{prefix}{centre}{centre}{suffix} +short_name={prefix}{suffix} +prefix=Ai|Al|A|Du|Glam|Dul|Gom|Nar|Pel|Tri|Dun|Do|Bar|Er|Tim|Al|Du|Bu|Bur|Nor|Der|Ur|Gar +suffix=sil|fur|bor|bus|bur|bor|gos|dor|rin|dur|ing|ras|this|tis|rol|sol|las|til|til|tol|los|rol|sol|ril|sil|as|us|lil|fur|mur|fur +centre=lal|mal|ra|dur|thal|thas|ma|gal|thau|ga|ith|ma|cat|la|ral|dur|bur +>> #enddef #define ELVISH_NAMES male_names= _ "Amadrieriand,Amáril,Amelad,Ameldor,Amendel,Ameng,Amilmaldur,Amilmalith,Amilmandir,Amind,Amiol,Amiorion,Amithrarion,Amóldor,Amorfimir,Amorfir,Amowyn,Amulas,Amundil,Anán,Anebrin,Anebrir,Anémbor,Anénduil,Anerion,Anilad,Anil-Gawyn,Anilmambor,Anilmariand,Anior,Anithranduil,Anol,Anon,Anorfing,Anundil,Belán,Belandil,Belarandel,Belel,Belén,Belil-Gandil,Belilmand,Belilmang,Beliondil,Beliril,Belithraldor,Belithrawyn,Belólad,Belómir,Belondel,Belyrion,Cadriembor,Cadrieriand,Cálad,Caladrielas,Calándel,Caldur,Cáldur,Calebrindel,Calebrindir,Calénduil,Calil-Gandir,Calil-Gawyn,Calioriand,Caliril,Calónduil,Caloril,Cándir,Canduil,Caraldur,Carang,Célad,Celadrieriand,Celang,Celaral,Celarandil,Celáriand,Celebririon,Celelas,Celendel,Celér,Celilmalas,Celiondir,Celior,Celiorion,Celong,Celór,Celóril,Celorion,Celundir,Celuwyn,Celyndel,Cénduil,Cindil,Ciong,Cithralad,Cithraldur,Cithrand,Cithrandel,Cithraril,Col,Corfil,Corfildur,Cówyn,Cun,Cundir,Cylas,Delán,Delánd,Delandel,Delaraldur,Deláril,Delawyn,Deléng,Delilmaldor,Deliol,Delithrar,Deliwyn,Delóldor,Delorfilad,Delorfilith,Delorion,Delundil,Eäradriendel,Eäradrier,Eäránduil,Eäraralad,Eärebrindel,Eäréldor,Eäreng,Eärérion,Eärithrandil,Eäromir,Eärorfiriand,Eäryldur,Eäryriand,Eladrieng,Elálith,Elánd,Elándil,Elebrildor,Elebrindel,Elebriril,Elélas,Elémbor,Elemir,Elen,Elil-Garil,Elilmaldur,Eliomir,Eliondil,Elolas,Elólas,Elor,Elorfilad,Elradrien,Elralith,Elran,Elreldur,Elrilmand,Elrioldor,Elriolith,Elrithralith,Elrithranduil,Elrorfir,Elval,Elvandir,Elvaramir,Elváwyn,Elvebrind,Elvebrindel,Elvélith,Elvémir,Elverion,Elvil-Garion,Elvilmaldur,Elvilmaril,Elvioldur,Elvombor,Elvónduil,Elvorfimir,Elvorfiriand,Elvorfiril,Elvóriand,Elvund,Elyldor,Elyrion,Eowambor,Eowanduil,Eowar,Eowaraldor,Eowaran,Eowarar,Eowariand,Eowarion,Eowebrind,Eowémir,Eowil-Garion,Eowimbor,Eowiomir,Eowithrawyn,Eowóldur,Eoworfildor,Eowówyn,Eowylas,Fadriendel,Fandel,Farandir,Fáwyn,Fendel,Fer,Filman,Fioril,Fithraril,Forfilas,Fyrion,Gadriendil,Gadrieng,Galadrieldor,Galálad,Galálas,Galalith,Galar,Galelas,Galeldur,Galelith,Galémbor,Galithrariand,Galoldur,Galuldur,Galur,Galurion,Gambor,Gán,Ganduil,Garaldor,Gararil,Gelad,Géril,Gil-Gandel,Gil-Gang,Giombor,Githral,Githralad,Gladriendil,Glal,Glámbor,Glandil,Glarang,Glararil,Glilmal,Glimir,Glior,Glólas,Gloldor,Glómir,Glon,Glul,Golad,Gor,Gumbor,Gyl,Gymbor,Gyn,Harariand,Háriand,Hebril,Hemir,Hénduil,Hilas,Hil-Garion,Hilmariand,Hiong,Hirion,Hithrandel,Horfilad,Horfindel,Hundel,Hymir,Hyrion,Hywyn,Isadrieng,Isándir,Isarandel,Isarar,Iselas,Isér,Isilmandel,Isirion,Isithral,Isól,Isóndel,Isóng,Isorfilad,Isorfindir,Isuwyn,Isyndel,Legal,Legaran,Legémir,Legéril,Legilad,Legil-Gal,Legiondel,Legithralith,Legorfindil,Legorfirion,Legówyn,Legyl,Legyn,Linduilas,Lómadrieril,Lómarand,Lómariand,Lómebrilad,Lómebrind,Lómémbor,Lómilmaril,Lómiriand,Lómorfindil,Lómowyn,Madrieril,Maldur,Mánduil,Maraldur,Mebrin,Méng,Mérion,Miolith,Miomir,Mithrand,Mondir,Móndir,Morfilas,Morfin,Morfiriand,Mylith,Nadrieldor,Nalith,Nán,Nél,Nil-Galas,Nil-Galith,Nil-Gar,Nilmar,Nóndel,Norfildor,Norfilith,Norfindil,Norfindir,Numbor,Nyldur,Padrieriand,Padrieril,Pamir,Paraldor,Parariand,Pilmalad,Pindir,Pór,Porfildur,Pumbor,Pyldur,Rebrir,Réndir,Rilmandil,Rithrandil,Ról,Róldor,Roldur,Róldur,Rorfilad,Rorfindil,Rówyn,Ryn,Sadrielas,Sebrin,Sebriril,Sénd,Sil-Gal,Sólad,Sorfind,Sóriand,Tadriendir,Taral,Taraldur,Táriand,Tendel,Téwyn,Thradrieriand,Thrambor,Thraral,Threbring,Thrélad,Thréldur,Thril-Gamir,Thril-Gandir,Thril-Gar,Thrilmandel,Thrimir,Thrion,Thrithran,Throlas,Thrón,Thróng,Thrund,Thryriand,Til-Gan,Tilmalad,Tilmalas,Tinandir,Tinarambor,Tinarariand,Tinén,Tinil-Ganduil,Tinilmand,Tinilmawyn,Tinimir,Tinindil,Tinithrar,Tinoldor,Tinond,Tinorfind,Tinorfiriand,Tinóriand,Tinowyn,Tinun,Tinyl,Tion,Tolas,Torfildur,Tówyn,Tylad,Unadrieldor,Unadrier,Unál,Unalas,Unálas,Unaraldur,Unaril,Unárion,Unebrin,Unebrind,Uneldor,Unil,Unil-Gan,Uniolith,Unioril,Unólith,Unombor,Unóndel,Unondir,Unorfildor,Unorfiril,Unorfiwyn,Unulad,Uradrielas,Uradrierion,Urálas,Urálith,Urambor,Urér,Uril-Gambor,Urilmalith,Uróldor,Urorfildor,Urul,Urymir,Válad,Ván,Vándel,Vandir,Varalas,Vararion,Vebril,Vebrilas,Vebrinduil,Vel,Vilith,Vol,Vólas,Vóldur,Vondel,Vorfin,Vorfindil,Vulas,Vuldur,Vunduil,Vylas,Vyldor" female_names= _ "Amadrielia,Amadrielindë,Amadriendra,Amadriewen,Amarang,Amebrilindë,Amedë,Améthien,Amewien,Amil-Gadith,Amil-Garith,Amilmadia,Amiolith,Amionia,Amithraniel,Amithrawien,Amiwen,Amodë,Amorfilith,Amorith,Amulia,Amuviel,Amuwen,Analia,Anang,Anaraclya,Anáthien,Anebriniel,Anilmarith,Aning,Aniorith,Anówien,Anundra,Anuthiel,Anuthien,Anylindë,Anythien,Anywien,Belaclya,Beladrielith,Beladriewen,Beladriewien,Belarania,Belaraviel,Belebrindra,Belendra,Beliolia,Belithraniel,Belithrawiel,Belithrawien,Belowen,Belulindë,Cádë,Cadriewen,Caladrieng,Calándra,Calang,Calánia,Calebriwien,Calewen,Calewiel,Calil-Galith,Calilmalith,Calithraclya,Calóniel,Calorfiniel,Calówien,Caluclya,Ceclya,Celadë,Celália,Celálindë,Celarandra,Celararith,Celárith,Celebriniel,Celebriviel,Celelith,Celéng,Celérith,Celidien,Celilith,Celindë,Celiodë,Celioniel,Celith,Celithradith,Celódith,Celorfilindë,Celorfing,Celorfiwien,Celówien,Celylia,Cethien,Cing,Cithralith,Cithrania,Cithrawen,Cólindë,Corfiviel,Cydia,Delararith,Delebrinia,Deléthien,Delil-Ganiel,Deliowen,Delithrathiel,Delóndra,Delorfilindë,Delorfithien,Deloviel,Delydien,Eäradriedien,Eärániel,Eärarawien,Eärélia,Eärenia,Eärewen,Eäréwiel,Eärilmadë,Eärilmathien,Eäriolith,Eärithrang,Eärorfiwien,Eärudë,Eladriedë,Eladrielia,Elarawiel,Elebrindra,Eledë,Elelith,Elil-Gang,Elilmalia,Elilmawien,Elithraclya,Elithradien,Elóndra,Elorfing,Elorfithien,Elradrierith,Elránia,Elrebridith,Elréthiel,Elrilindë,Elrilmandra,Elrilmathien,Elrithiel,Elrithradith,Elriwen,Elródith,Elrorfidia,Eluviel,Elvádia,Elvánia,Elvil-Gawien,Elvilmathiel,Elviniel,Elviondra,Elvithrang,Elvithrathien,Elvowien,Elvyniel,Elvyviel,Elynia,Elywen,Eowalia,Eowarawien,Eowathiel,Eowebridith,Eowedith,Eowidien,Eowil-Galindë,Eowilindë,Eowiowien,Eowylia,Eowyniel,Fadriedith,Fadrielia,Fadriendra,Fadrienia,Falindë,Fáthiel,Fathien,Fáwien,Feclya,Féthiel,Fil-Galia,Fil-Gathiel,Fil-Gawien,Filmaclya,Fioniel,Fódë,Fólindë,Fulindë,Gadrieclya,Gadrieviel,Galadriethien,Galándra,Galaraniel,Galebrilia,Galebrindra,Galédë,Galedien,Galéwiel,Galil-Gania,Galilmadia,Galiothiel,Galithrathien,Galólia,Galolindë,Galorfiwiel,Galothiel,Galowen,Galundra,Galyniel,Gathien,Gáviel,Gebririth,Gewen,Gil-Gawien,Gilia,Gioniel,Gioviel,Giowen,Githrania,Githrawiel,Glália,Glebrithien,Gléndra,Glilmadien,Glilmawiel,Glithiel,Gloclya,Glodith,Glorfilith,Gloviel,Glowiel,Goclya,Godien,Gólia,Golindë,Guviel,Harawiel,Haviel,Háwien,Héclya,Hedia,Helith,Hewen,Hil-Gania,Hiodë,Hiwien,Hodia,Hódia,Horfinia,Horfiwien,Hóthiel,Huclya,Hunia,Huthien,Hyclya,Hythiel,Hythien,Isadrieng,Isáwen,Isebridien,Isebrinia,Isendra,Iséng,Iseviel,Isil-Garith,Isilindë,Isithradë,Isithradien,Isithrarith,Isithrawiel,Isóthien,Legádë,Legadien,Legadrieclya,Legadriedë,Legadrieniel,Legaraclya,Legebrilia,Legelith,Legeng,Legéniel,Legethiel,Legidia,Legil-Galindë,Legilmadith,Legilmawiel,Legithralindë,Legithrandra,Legithrania,Legolith,Legondra,Legorfidë,Lómániel,Lómebriclya,Lómebriniel,Lómedia,Lómeniel,Lómiclya,Lómilindë,Lómilmathiel,Lómilmawiel,Lómithradë,Lómithrarith,Lómódë,Lómolith,Lómóndra,Lómorfing,Lómorith,Lómudia,Lómulindë,Lómuniel,Lómuthiel,Lómynia,Lómythien,Mádia,Madrieclya,Maraclya,Mebriwiel,Meclya,Medien,Mil-Gathiel,Mil-Gathien,Milindë,Milith,Miowen,Miowiel,Mithradë,Mithralindë,Módë,Módia,Moniel,Morfilindë,Munia,Myndra,Mywiel,Narania,Naraniel,Náviel,Nawen,Newen,Nil-Gang,Nilmadia,Niodien,Niolia,Niothien,Nithraniel,Nithrarith,Nowen,Nydith,Pádia,Padriedith,Paralindë,Parandra,Pawen,Pebridien,Pil-Gadia,Pil-Gadien,Pilindë,Pindra,Pong,Porfindra,Porfiwien,Póviel,Pulia,Puthien,Reniel,Réviel,Ril-Gawien,Rindra,Riothien,Róng,Rorfiviel,Sadrienia,Sadrierith,Sálindë,Sáng,Saradith,Sarandra,Sédith,Sendra,Sethien,Silmaclya,Silmathiel,Sioclya,Siorith,Sithrang,Sithrawen,Soniel,Sothiel,Sothien,Syniel,Tadrierith,Tang,Taradien,Tarathiel,Tathiel,Terith,Thradia,Thrália,Thraraviel,Threbriniel,Thredien,Thrérith,Thridith,Thrinia,Thrithradia,Thrithrandra,Thrithraniel,Throlith,Throng,Throthiel,Thrulith,Thruthien,Thryng,Til-Gandra,Tilmaclya,Tilmaviel,Tináclya,Tinadriethien,Tinálindë,Tinaraniel,Tinarathien,Tinawiel,Tinebrithiel,Tinerith,Tinil-Gania,Tinil-Gawiel,Tiniolith,Tinithrathiel,Tinóng,Tinorfilith,Tinorfithien,Tinudia,Tiorith,Tithrathien,Tówiel,Tuniel,Unadrieng,Unáthien,Unebridë,Unénia,Unil-Gadia,Unilmadia,Unindra,Uniodë,Uniolia,Uniong,Unionia,Unóndra,Unorfiwen,Unulindë,Unuviel,Unynia,Uraclya,Uradriedia,Uránia,Urárith,Urebriclya,Ureclya,Urilmadia,Urilmawiel,Uriolia,Urithralindë,Uruthien,Uryrith,Vadrierith,Vadrieviel,Vadriewen,Varawiel,Vebrithien,Vil-Gandra,Violindë,Viowiel,Vithrang,Vithraniel,Viwiel,Vódia,Vóng,Vorficlya,Vorfing,Vorfirith,Vorfiwiel,Vówien" + male_name_generator= _ << +main={generated_prefix}{consonnant}{suffix}|{prefix}{centre}{suffix} +generated_prefix={starting_consonnant}{vowel} +starting_consonnant=C|D|F|L|M|N|P|Qu|R|S|T|V +vowel=a|e|i|o|ae|é|ë +consonnant=n|l|r|m|s|v|th|nn +prefix={prefix_vc}{vowel}|{prefix_cv} +prefix_vc=Lon|Eon|Ad|Sar|Al|Tal|Tin|El|Leg|Or|Tir|Ol|Cál|Cán|Elv|Fan|Fad|Fith|Fil|Gal|Glad|Leg|Glar|Gli|Hár|Tad|Sór|Pyr +prefix_cv=Ama|Ami|Be|Ca|Ga|Isi|Ha|He|Le|Ló|Ny|Ni|Ma|Thu|Thri|Ti|Unu|Ve|Va +suffix=or|im|ian|in|ar|iel|as|eon|as|or|ion|al|and|ér|as|ir|el|al|ad|ael +centre={short_centre}|{short_centre}|-{short_centre}|{short_centre}- +short_centre=lol|febr|tom|lith|nal|lor|wón|rad|rien|mar|reb|riel|mal|ram|nil|nim|nol|bris|lad|rier|ra|fil|thran|man +>> + female_name_generator= _ << +main={generated_prefix_v}{centre_v}{suffix_v}|{generated_prefix_c}{centre_c}{suffix_c} +generated_prefix_v={starting_consonnant}{vowel} +generated_prefix_c={starting_consonnant}{vowel}{consonnant} +starting_consonnant=C|D|F|L|M|N|P|Qu|R|S|T|V +vowel=a|e|i|o|ae|é|ë +consonnant=n|l|r|m|s|v|th|p|d|f|t +prefix_c=Val|Ol|Am|An|El|Fa|El|Glo|Hu|Le|Mil|Nil|Pin|Por|Mot|Mor|Thral|Leg|Nam|Nym|Sim|Len|Is|Thal +prefix_v=La|Va|Tha|Ne|Ay|Ce|Fa|Phe|Ja|Que|Ma|Mi|Pa|Ri|Siu|Ga|Ca|De|Eä|Eo|No|Pó|Le|Ló|Isá|Pa|Sa|Ni|Ti|Uno|Uni|Vó|Gio +suffix_v=thea|nia|lia|kea|ni|ith|niel|wiel|ra|dë|lya|thiel|nna|nne +suffix_c=iel|ien|ya|a|ë|i|ia|ea +centre_v=|{short_centre_v} +short_centre_v=nna|lla|na|thi|saie|li|ma|lo|thra|ló|rá|bri|fi|mi|nio|wi|né|nu|wi +centre_c=|{short_centre_c} +short_centre_c=enn|all|an|ith|el|il|am|ol|arth|ól|ár|ir|if|im|ion|iw|én|un|iw +>> #enddef # Very restricted phonotactics on these for a reason: Gryphons have beaks. #define GRYPHON_NAMES male_names= _ "Graa,Greaa,Gree,Kaaa,Kassshh,Kessshh,Korro,Kraa,Kuu,Kzaaa,Kzuuu" female_names= _ "Kaasa,Kayya,Keyya,Kiira,Korra" + male_name_generator= _ << +main={prefix}{suffix}|{prefix}{centre}{suffix} +prefix=Gr|Ka|Ke|Ko|Kr|Kz +suffix=aa|eaa|ee|aaa|ssshh|rro|uu|uuu +centre=arr|aash|eez|ozz +>> + female_name_generator= _ << +main={prefix}{suffix}|{prefix}{centre}{suffix} +prefix=Kaa|Ka|Ke|Kuu|Ko +suffix=sa|yya|ra|rra +centre=err|aash|eez|azz +>> #enddef #define HUMAN_NAMES male_names= _ "Addraecyn,Addraenvan,Addraer,Addraercyn,Addraryn,Addreddry,Addredry,Addregwyn,Addrenyc,Addreoddry,Addreoddyn,Addreonyc,Addreorcyn,Addreran,Addribryn,Addriddyn,Addrocyn,Addroryn,Addrunvan,Addrurcyn,Addryllyn,Addrynvan,Aethacyn,Aethadry,Aethaec,Aethaeran,Aethaeryn,Aethagwyn,Aethanry,Aetharcyn,Aethec,Aethellyn,Aethenvan,Aetheoc,Aetheollyn,Aetheonyc,Aetheorcyn,Aethercyn,Aetherraent,Aethibryn,Aethiddry,Aethircyn,Aethobryn,Aethoddyn,Aethonnyn,Aethuc,Aethudry,Aethugwyn,Aethun,Aethunry,Aethydry,Aethynyc,Blac,Bladoc,Blaec,Blaedry,Blanry,Blebryn,Bledoc,Blemyr,Blennyn,Blenvan,Bleollyn,Blercyn,Blidd,Bliddry,Blillyn,Blinvan,Blollyn,Blubryn,Blucyn,Bludry,Blullyn,Bluran,Blybryn,Blydd,Blygwyn,Blymyr,Blyr,Bucyn,Cac,Cadry,Caebryn,Caedry,Caeran,Caercyn,Car,Carac,Caraddry,Caradoc,Caraedry,Caraennyn,Cararyn,Caredd,Careddry,Caregwyn,Caren,Careobryn,Careogwyn,Careonvan,Careorraent,Careoryn,Carercyn,Caric,Cariddry,Carocyn,Caroddyn,Caror,Caroran,Carraent,Carudoc,Carullyn,Carygwyn,Caryn,Cebryn,Cemyr,Cennyn,Ceoc,Ceoddry,Ceoddyn,Ceomyr,Ceonnyn,Ceonry,Ceoryn,Cicyn,Cin,Cinry,Coc,Convan,Corcyn,Cubryn,Cunry,Curyn,Cynyc,Cyryn,Dac,Dadd,Dadoc,Daeddry,Daedoc,Daellyn,Demyr,Denvan,Deodd,Deollyn,Deonyc,Derraent,Dibryn,Dinnyn,Dircyn,Dycyn,Dyddyn,Gaddry,Gaebryn,Gaedry,Gaercyn,Gagwyn,Gan,Gannyn,Gar,Gecyn,Geddyn,Gegwyn,Geodry,Ginvan,Glacyn,Gladoc,Glaercyn,Glarraent,Gleddry,Gleoddyn,Gleran,Gliddyn,Glillyn,Glinry,Glircyn,Gloddry,Gloddyn,Glonry,Glonvan,Glumyr,Glun,Glunry,Glunvan,Glyc,Glydd,Glydoc,Glynry,Glynvan,Glyran,Goc,Gor,Gubryn,Gudd,Gullyn,Gumyr,Gur,Gwadoc,Gwaec,Gwaeddyn,Gwan,Gweddyn,Gwegwyn,Gwellyn,Gwennyn,Gwenyc,Gweocyn,Gweodd,Gweodoc,Gweodry,Gweogwyn,Gweoran,Gwidoc,Gwilam,Gwodd,Gwoddyn,Gwollyn,Gwor,Gwucyn,Gwudoc,Gwumyr,Gwuran,Gwybryn,Gwycyn,Gwyddry,Gwydoc,Gwymyr,Gwynnyn,Gydoc,Gyllyn,Gymyr,Haldar,Labryn,Ladoc,Laellyn,Lan,Lannyn,Laran,Lec,Lemyr,Lenvan,Leogwyn,Lercyn,Ligwyn,Lin,Liryn,Lonnyn,Lorraent,Luddry,Ludoc,Lunnyn,Lunvan,Lurraent,Mac,Maddyn,Maennyn,Manry,Manyc,Marcyn,Mec,Menvan,Meollyn,Meon,Meonnyn,Meorraent,Middry,Midry,Mimyr,Modd,Moddry,Monry,Moran,Morcyn,Mubryn,Mudoc,Mugwyn,Murcyn,Mydoc,Mygwyn,Myn,Myrraent,Owac,Owadd,Owaddyn,Owaecyn,Owaedry,Owain,Owarcyn,Owaryn,Owecyn,Owedry,Oweomyr,Oweor,Oweorcyn,Oweran,Owercyn,Owidry,Owinvan,Owinyc,Owodd,Owoddry,Owogwyn,Owollyn,Oworan,Oworcyn,Oworraent,Owuddry,Owuddyn,Owugwyn,Owur,Owyran,Rabryn,Radd,Ranvan,Rar,Reoddyn,Reodry,Rhaecyn,Rhaedoc,Rhaemyr,Rhaerraent,Rhanry,Rharcyn,Rhenry,Rhenvan,Rhenyc,Rheodd,Rheoddyn,Rheollyn,Rheor,Rheoran,Rheorraent,Rheran,Rherraent,Rhobryn,Rhodry,Rhollyn,Rhonvan,Rhubryn,Rhugwyn,Rhunyc,Rhur,Rhygwyn,Rhyllyn,Rhynyc,Rhyrcyn,Rhyrraent,Rocyn,Roddyn,Romyr,Ron,Ronry,Rubryn,Ruddry,Rumyr,Run,Rurcyn,Rybryn,Rycyn,Ryddry,Rygwyn,Rynnyn,Rynry,Saec,Saellyn,Saemyr,Saenvan,Saercyn,Sanyc,Saran,Sarraent,Secyn,Seddyn,Sedry,Sellyn,Sennyn,Seoddry,Seorcyn,Sercyn,Siddry,Simyr,Siryn,Sodd,Sodry,Soran,Suc,Sudd,Surcyn,Sydd,Syran,Syryn,Tabryn,Taec,Taedd,Taedoc,Taemyr,Taenvan,Taercyn,Tanry,Tarcyn,Teddyn,Tegwyn,Ten,Tennyn,Tenvan,Teobryn,Teoddyn,Teor,Teorcyn,Terraent,Tinry,Tinvan,Tiryn,Todd,Tudd,Tuddry,Tudoc,Tunvan,Turraent,Tyddyn,Vaddyn,Vaeddyn,Vaedry,Vaennyn,Varcyn,Ven,Vennyn,Veocyn,Veoddyn,Veodry,Veogwyn,Veomyr,Vinvan,Vinyc,Virraent,Vobryn,Vogwyn,Vonry,Vuddyn,Vugwyn,Vyc,Vygwyn,Vyrcyn,Yracyn,Yraec,Yran,Yrannyn,Yranvan,Yraryn,Yredd,Yreddyn,Yregwyn,Yreryn,Yrinvan,Yrirraent,Yroddry,Yrullyn,Yrumyr,Yrunnyn,Yrunvan,Yryllyn,Yrymyr,Yrynyc,Yryrcyn" female_names= _ "Alabrylla,Alaebrylla,Alaeniver,Alalla,Alalonna,Alaryan,Aleacla,Aleaniver,Aleara,Alearka,Alena,Alengwen,Alilonna,Alingwen,Alolla,Alolonna,Alora,Alubrylla,Aluniver,Aluryan,Alussa,Alwcla,Alwllyra,Alwlyan,Alwna,Alybrylla,Alynoic,Alyra,Alyryan,Braedda,Brassa,Bravyan,Breabrylla,Breall,Brealla,Brealonna,Breana,Brell,Brellyra,Brera,Brerka,Breryan,Bricla,Brirka,Brobrylla,Brollyra,Brona,Bronoic,Brora,Brorka,Brungwen,Bruryan,Brwra,Brycla,Brynoic,Caella,Caena,Caengwen,Caevyan,Call,Calla,Cassa,Cealonna,Cera,Ceryan,Cibrylla,Cicla,Cinoic,Cira,Cissa,Clacla,Claella,Claelyan,Claenoic,Clalla,Clallyra,Clara,Clarka,Clavyan,Cleacla,Cleall,Clealyan,Cleana,Cleanoic,Clenoic,Clibrylla,Clill,Clillyra,Clilyan,Clinoic,Clissa,Clobrylla,Clollyra,Clona,Clongwen,Clungwen,Clurka,Cluvyan,Clwdda,Clwlla,Clwvyan,Clydda,Clylla,Cora,Coryan,Cucla,Cudda,Curyan,Cwdda,Cwlonna,Cwngwen,Cwvyan,Cydda,Cylla,Cyllyra,Cylyan,Cyniver,Cyvyan,Daedda,Daelyan,Daengwen,Daenoic,Dalla,Dallyra,Dangwen,Dara,Dassa,Deanoic,Deassa,Della,Devyan,Dicla,Diniver,Dissa,Dollyra,Dullyra,Dulonna,Dwbrylla,Dwdda,Dwna,Dwnoic,Dwra,Dybrylla,Dydda,Dyssa,Elacla,Elaedda,Elaell,Elaelonna,Elaessa,Elaevyan,Elallyra,Elalonna,Elara,Elavyan,Elealla,Eleanoic,Elearka,Elenoic,Elerka,Elivyan,Elulonna,Elurka,Elwllyra,Elwlonna,Elwngwen,Elwra,Elycla,Elyllyra,Elyngwen,Elyniver,Elyrka,Gwaera,Gwaessa,Gwangwen,Gweacla,Gwedda,Gwerka,Gwicla,Gwirka,Gwobrylla,Gwoll,Gwona,Gwongwen,Gwonoic,Gworyan,Gwullyra,Gwussa,Gwwcla,Gwwna,Gwwvyan,Gwycla,Gwydda,Heldra,Jacla,Jaena,Jaerka,Jaevyan,Jalyan,Jana,Jarka,Jassa,Jeabrylla,Jealla,Jeanoic,Jeniver,Jiryan,Jissa,Joll,Jolla,Jona,Jongwen,Jonoic,Jora,Jorka,Jovyan,Judda,Jull,Julonna,Jura,Jwll,Jwlyan,Jycla,Jyniver,Jynoic,Jyrka,Jyvyan,Laeniver,Laenoic,Laeryan,Langwen,Larka,Lassa,Lealonna,Lealyan,Ledda,Lelonna,Lelyan,Lengwen,Lerka,Lessa,Lidda,Lill,Lina,Lirka,Liryan,Livyan,Locla,Lodda,Lollyra,Lolonna,Lulla,Lulyan,Lungwen,Lunoic,Luryan,Lwcla,Lwlla,Lwnoic,Lwryan,Lycla,Lylla,Lylyan,Lyna,Lynoic,Maecla,Maeniver,Mavyan,Meacla,Mealyan,Meana,Meangwen,Meanoic,Medda,Melonna,Mengwen,Meniver,Meradda,Meraecla,Meraelyan,Merall,Merallyra,Meralonna,Merana,Meranoic,Merealonna,Mereangwen,Mereaniver,Merebrylla,Merella,Merengwen,Meressa,Merilyan,Merina,Merinoic,Merissa,Merivyan,Merolla,Merolyan,Merona,Meroniver,Merubrylla,Merudda,Merurka,Merwlla,Merwnoic,Merwryan,Merydda,Merylyan,Messa,Milonna,Molyan,Moniver,Mossa,Mudda,Mullyra,Mulyan,Muryan,Mwbrylla,Mwlyan,Mwngwen,Mwnoic,Mycla,Myll,Mylla,Myra,Myvyan,Nabrylla,Naebrylla,Naecla,Naell,Nalyan,Nangwen,Nealla,Neallyra,Nealonna,Neavyan,Nera,Nessa,Ninoic,Niryan,Nivyan,Nobrylla,Nolla,Nonoic,Norka,Noryan,Nucla,Nulla,Nulyan,Nungwen,Nuvyan,Nwllyra,Nwryan,Nwvyan,Nybrylla,Nyll,Nylyan,Nyryan,Nyssa,Nyvyan,Raebrylla,Raera,Raerka,Ralonna,Rara,Rarka,Rassa,Reacla,Realla,Reana,Reangwen,Rella,Relyan,Rengwen,Rerka,Revyan,Rilonna,Rilyan,Rirka,Rora,Rucla,Ruryan,Rwdda,Rwlla,Rwllyra,Rwlonna,Rwngwen,Rybrylla,Ryna,Ryngwen,Saell,Saellyra,Saeniver,Saerka,Saessa,Sallyra,Sanoic,Sara,Sassa,Searka,Sena,Senoic,Sera,Silonna,Sira,Siryan,Sona,Sorka,Subrylla,Sull,Sulonna,Sulyan,Sura,Sussa,Swlla,Swlyan,Swngwen,Swnoic,Swvyan,Syllyra,Sylyan,Syssa,Ysacla,Ysaenoic,Ysaerka,Ysanoic,Yseacla,Ysealonna,Ysealyan,Ysedda,Ysell,Yselonna,Ysilyan,Ysinoic,Ysodda,Ysongwen,Ysonoic,Ysura,Yswniver,Ysycla,Ysylla,Ysylyan,Ysyrka,Ysyssa" + male_name_generator= _ << +main={generated_prefix_c}{suffix_c}|{generated_prefix_v}{suffix_v}|{prefix_c}{centre_c}{suffix_c}|{prefix_v}{centre_v}{suffix_v} +generated_prefix_c={starting_consonnant}{vowel}{consonnant}|{starting_vowel}{consonnant} +generated_prefix_v={starting_consonnant}{vowel}|{starting_vowel} +starting_consonnant=B|C|D|G|H|L|M|R|Rh|S|T|V +starting_vowel=A|E|I|Y|Ae +vowel=a|e|i|o|u|y|eo|ae +consonnant=w|l|d|n|r|rc|ll|nn|dd|th +prefix_c=Add|Den|Derr|Gum|Mad|Mar|Ow|Tedd|T{vowel}n|Var|Vin|Vob|Vug|Yr|Rhyr +prefix_v=Ae|Bl{vowel}|C{vowel}|D{vowel}|Gl{vowel}|G{vowel}|Gw{vowel}|Ha|L{vowel}|M{vowel}|R{vowel}|Rh{vowel}|S{vowel}|S{vowel}|T{vowel}|V{vowel} +suffix_c=yn|er|yc|ec|oc|yr|in|aent +suffix_v=ry|ryn|ran|lyn|van|nyc +centre_c=redd|reor|og|thyn +centre_v=rae|ra|thar|gwy +>> + female_name_generator= _ << +main={generated_prefix_c}{suffix_c}|{generated_prefix_v}{suffix_v}|{prefix_c}{centre_c}{suffix_c}|{prefix_v}{centre_v}{suffix_v} +generated_prefix_c={starting_consonnant}{vowel}{consonnant}|{starting_vowel}{consonnant} +generated_prefix_v={starting_consonnant}{vowel}|{starting_vowel} +starting_consonnant=B|C|D|G|H|L|M|R|Rh|S|T|V +starting_vowel=A|E|I|Y|Ae +vowel=a|e|i|o|u|y|eo|ae +consonnant=w|l|d|n|r|rc|ll|nn|dd|th +prefix_c=Al|El|Mer|Mil|Rer|Ys|M{vowel}r|M{vowel}l +prefix_v=A|Br{vowel}|Cl{vowel}|C{vowel}|D{vowel}|Gw{vowel}|He|J{vowel}|L{vowel}|M{vowel}|N{vowel}|R{vowel}|S{vowel} +suffix_c=yan|oic|ell|yll +suffix_v=wyn|nna|lla|ra|la|wyan|ssa|ka|ven +centre_c=il|ing|ol|ur|ung|ean|eal|ong|al|iv +centre_v=na|lla|na|ry|li|ni|ri|rae|bry +>> #enddef #define KHALIFATE_NAMES male_names=_ "Aban,Abbas,Abbud,Abdul-ʿAdl,Abdul-Ahad,Abdul-Alim,Abdul-Aliyy,Abdul-Azim,Abdul-Aziz,Abdul-Badi,Abdul-Baʿith,Abdul-Baqi,Abdul-Bari,Abdul-Barr,Abdul-Basir,Abdul-Basit,Abdul-Fattah,Abdul-Ghaffar,Abdul-Ghafur,Abdul-Ghani,Abdul-Hadi,Abdul-Hafiz,Abdul-Hakam,Abdul-Hakim,Abdul-Halim,Abdul-Hamid,Abdul-Haqq,Abdul-Hasib,Abdul-Hayy,Abdul-Jabbar,Abdul-Jalil,Abdul-Karim,Abdul-Khabir,Abdul-Khaliq,Abdul-Latif,Abdul-Malik,Abdul-Majid,Abdul-Matin,Abdul-Mubdiʾ,Abdul-Mughni,Abdul-Muhaimin,Abdul-Muhsi,Abdul-Muhyi,Abdul-Muʿid,Abdul-Muʿizz,Abdul-Mujib,Abdul-Mumin,Abdul-Muqaddim,Abdul-Muqtadir,Abdul-Musawwir,Abdul-Mutaʿal,Abdul-Nafi,Abdul-Nasser,Abdul-Nasir,Abdul-Nur,Abdul-Qadir,Abdul-Qahhar,Abdul-Qawi,Abdul-Qayyum,Abdul-Quddus,Abdul-Rafi,Abdul-Rahim,Abdul-Rahman,Abdul-Rashid,Abdul-Raʿuf,Abdul-Razzaq,Abdul-Shakur,Abdul-Tawwab,Abdul-Wadud,Abdul-Wahhab,Abdul-Wahid,Abdul-Wajid,Abdul-Wakil,Abdul-Wali,Abdul-Waliy,Abdul-Warith,Abdul-Zahir,Abdullah,ʿAbid,ʿAbidin,Abu Bakr,Aby al-Khayr,Adil,Adham,Adib,ʿAdli,ʿAdnan,ʿAfif,Ahmad,ʿAjib,ʿAkif,Akil,Akram,Alaʾ,Alaʾ al-Din,Alʿ Abbas,Aladdin,al-Bara,al-Hakam,al-Harith,Alhasan,Alhusain,Ali,Alim,Almahdi,al-Safi,Altaf,Altair,al-Tayyib,al-Tijani,al-Tufail,Amid,ʿAmid,Amin,Amir,ʿAmir,Amjad,ʿAmmar,ʿAmro,Anas,Anis,ʿAntarah,Anwar,ʿAqil,Arfan,Arif,ʿArif,Asad,Asʿad,Asadel,Ashraf,Asif,ʿAsim,Aswad,Ataʿ,Ataʿ Allah,Ataʿ al-Rahman,Athil,Athir,ʿAtif,ʿAwad,ʿAwf,Aws,Awwab,Ayham,Ayman,Ayser,Ayyub,Aza,ʿAzab,Azhar,Azim,ʿAziz,ʿAzzam,Badi,Badi al-Zaman,Badr,Badr al-Din,Badri,Bahaʿ,Bahiyy al-Din,Bahij,Bahir,Bakr,Bakri,Baligh,Bandar,Barakah,Barir,Bashshar,Basil,Basim,Bassam,Bayezid,Bayhas,Bilal,Bishr,Boulos,Budail,Burhan,Bushr,Butrus,Dabir,Dani,Darwish,Daʿud,Dhakir,Dhakiy,Dhakwan,Dhul Fiqar,Dirar,Diya,Diya al-Din,Duqaq,Fadi,Fadil,Fadl,Fadl Allah,Fahd,Fahad,Fahmi,Faisal,Faʿiz,Fakhir,Fakhr al-Din,Fakhri,Fakih,Falah,Falih,Faraj,Farhan,Farid,Fariq,Fariq,Faris,Faruq,Fath,Fathi,Fatih,Fatin,Fawwaz,Fawzan,Fawzi,Fayyad,Ferran,Fida,Fikri,Firas,Fuʿad,Fudail,Gamal,Ghayth,Ghali,Ghalib,Ghanim,Ghassan,Ghawth,Ghazwan,Ghiyath,Habbab,Habib,Haddad,Hadi,Hafiz,Hakem,Hakim,Halim,Hamal,Hamas,Hamdan,Hamdi,Hamid,Hamim,Hamzah,Hana,Hanaʾi,Hanbal,Hani,Hanif,Hannad,Haris,Harith,Harun,Hashim,Hassan,Hatim,Haydar,Haytham,Hayyan,Hazim,Hilal,Hilmi,Hisham,Hud,Hudad,Hudhafah,Hudhayfah,Humam,Hussein,Husam,Husam al-Din,Ibrahim,ʿId,Idris,Ihsan,Ihtisham,ʿIkrimah,Ilias,ʿImad,Imad al-Din,Imran,Imtiyaz,Inʿam,Iqbal,ʿIrfan,ʿIsa,ʿIsam,Ishaq,Ismaʿil,Iyad,Iyas,Izz al-Din,Jabbar,Jabr,Jabir,Jad Allah,Jaʿfar,Jal,Jalal,Jalal al-Din,Jalil,Jamal,Jamal al-Din,Jamil,Jarir,Jasim,Jaul,Jaun,Jawad,Jawdah,Jawhar,Jibran,Jibril,Jubair,Jul,Jumah,Junayd,Juwain,Kadar,Kadin,Kadir,Kahil,Kaliq,Kamal,Kamil,Karam,Kardal,Karif,Karim,Kasib,Kasim,Katib,Kazim,Khalaf,Khaldun,Khalid,Khalil,Khalil al-Allah,Khalis,Khatib,Khair al-Din,Khairi,Khoury,Khulus,Khuzaymah,Kutaiba,Labib,Lablab,Latif,Layth,LuʿayLubayd,Luqman,Lut,Lutfi,Maʿd,Madani,Mahbub,Mahdi,Mahfuz,Mahir,Mahjub,Mahmud,Mahrus,Maimun,Majd,Majdy,Majd al-Din,Majid,Makin,Malik,Mamduh,Maʿmun,Maʿin,Mandhur,Mansur,Marghub,Marid,Maʿruf,Marwan,Marzuq,Mashʿal,Mashhur,Masrur,Masʿud,Masun,Maysarah,Mazhar,Mazin,Mehmed,Mihran,Mihyar,Mikaʾil,Miqdad,Misbah,Mishʿal,Miyaz,Muʾadh,Muʾawiyah,Muʾayyad,Mubarak,Mubin,Mudar,Muddaththir,Mufid,Muflih,Muhab,Muhayr,Muhammad,Muhanna,Muhannad,Muhib,Muhibb,Muhsin,Muhtadi,Muhyi al-Din,Muʿin,Muʿizz,Mujab,Mujahid,Mukarram,Mukhlis,Mukhtar,Mulham,Mulhim,Muʿmmar,Muʿmin,Mumtaz,Munahid,Mundhir,Munib,Munif,Munir,Muʿnis,Munjid,Munsif,Muntasir,Murad,Murid,Murshid,Murtada,Musa,Musʿab,Musaʿid,Mushtaq,Muslih,Muslim,Mutafa,Mutaʾ,Muʿtasim,Mutawalli,Muʿtazz,Muthanna,Muti,Muwaffaq,Muyassar,Muzaffar,Mussammil,Nabhan,Nabighah,Nabih,Nabil,Nadhir,Nadim,Nadir,Nafiʾ,Nahid,Naʾil,Naʾim,Naji,Najib,Najid,Najjar,Najm al-Din,Naʿaman,Namir,Nashʿah,Nashʿat,Nashwan,Nasib,Nasih,Nasim,Nasir,Nasir al-Din,Nasr,Nasri,Nasuh,Nawaf,Nawfal,Nayif,Nazih,Nazim,Nazmi,Nibras,Nidal,Nijad,Nimr,Nizar,Nuʿaym,Nuh,Nuhayd,Numair,Nuʿman,Nur al-Din,Nuri,Nusrah,Nusrat,Omar,Orhan,Osman,Qasim,Qays,Qudamah,Qusay,Qatadah,Qutaybah,Qutb,Qutuz,Rabah,Rabi,Radi,Rafi,Rafid,Rafiq,Raghib,Rahman,Raʿid,Raʿif,Rais,Rajaa,Rajab,Raji,Rajih,Rakin,Rami,Ramih,Ramiz,Ramzi,Rani,Rashad,Rashid,Rasil,Rasin,Rasmi,Rasul,Ratib,Raʿuf,Rayhan,Rayyan,Razin,Ridha,Ridwan,Rihab,Riyad,Rizq,Ruhi,Rushd,Rushdi,Ruwayd,Saad,Saʿadah,Sab,Sabih,Sabir,Sabri,Saʿd,Saʿd al-Din,Sadad,Sadid,Sadiq,Saʿdun,Saʿid,Safi,Safiy,Safiy al-Din,Safuh,Safwah,Safwat,Safwan,Sahib,Sahir,Sahl,Saʾib,Saif,Saif al-Din,Sajid,Sajjad,Sakhr,Salah,Salah al-Din,Salamah,Salih,Salim,Salman,Sami,Samih,Samir,Samman,Saqr,Sariyah,Sati,Saud,Sayyid,Shaʿban,Shadi,Shadin,Shafi,Shafiq,Shahid,Shahin,Shahir,Shakib,Shakir,Shams al-Din,Shamal,Shamil,Shamim,Sharaf,Sharif,Shawqi,Shihab,Shihab al-Din,Shihad,Shuʿayb,Shukri,Shumayl,Siddiq,Sinan,Siraj,Siraj al-Din,Sofian,Subhi,Sufyan,Suhayb,Suhayl,Suhaym,Sulaiman,Sumrah,Suraqah,Suʿud,Tahir,Tahsin,Taym Allah,Taj,Taj al-Din,Talal,Talib,Tamim,Tamir,Tamam,Tammam,Taqiy,Tarif,Tariq,Taslim,Tawfiq,Tawhid,Taymullah,Taysir,Tayyib,Thabit,Thamir,Thaqib,Thawab,Thawban,ʿUbaidah,Ubaid,Ubayy,ʿUdayl,ʿUday,ʿUmar,Umarah,Umair,ʾaUrwah,Usaym,Usama,ʿUtbah,Uthal,Uthman,Waddah,Wadi,Wadid,Wafiq,Wahab,Wahhab,Wahid,Waʾil,Wajdi,Wajid,Wajih,Wakil,Walid,Walif,Waliy Allah,Waliy al-Din,Waqar,Waqqas,Ward,Wasif,Wasil,Wasim,Wazir,Yahya,Yaman,Yaʿqub,Yasar,Yasin,Yasir,Yazan,Yazid,Yunus,Yushua,Yusri,Yusuf,Zafar,Zafir,Zahid,Zahir,Zayd,Zaim,Zayn,Zarif,Zakarriya,Zaki,Zakwan,Ziyad,Zubayr,Zuhayr" + name_generator= _ << +main={name_long}|{prefix}{suffix}|{name_mid}{connector}{name_mid} +name_mid={prefix}{suffix}|{name_short} +name_long={prefix}{suffix}|{prefix}{centre}{suffix} +name_short=Din|Sif|Din|Taj|Sud|Ali|Lut|Nuh|Qays|Nimr|Jad|Bushr|Lut|Maʿd|Nur|Fadl +prefix=Ab|Bas|Fat|Gha|Al|Ba|Ja|Ha|Mu|Ra|Raz|Abi|Am|La|ʿAj|Ala|ʿAk|Fa|Du|Im|Ju|Mun|Ma|Ni|Ji|Mu|Lab|Luf|Mih|Mi|Qu|Tal|Ta|Tha|Za|Zi|Yas|Wa|Su|Qa|ʿIkri|Lu|Su|Osa|Rag|Saf|Da|Fay|Nib|Nash +suffix=af|al|lih|bair|sur|bi|lah|at|sim|ma|ih|yl|iq|raj|mam|man|ya|zid|riya|ail|air|ah|en|in|ayd|ud|rah|wah|nan|as|ir|ba|ni|yad|ras|zuq|hid|mal|kib +connector= al-| bin | ibn +centre=ʿ|{centre_syllabe} +centre_syllabe=hi|sa|kar|da|na|ja|tay|ki|hai|saw +>> #enddef #define LIZARD_NAMES male_names= _ "Amprixta,Anexir,Anitraz,Arix,Axiz,Bzz’Kza,Chamil,Cleezi,Clezz,Fazzis,Fizztrax,Flixta,Flizzil,Frikes,Frizzle,Hasz,Heffez,Hertrazzir,Hesz,Hezzir,Hezzis,Hix,Inexis,Irix,Jezzix,Jizz,Kaliez,Kepzs,Kernix,Kersezz,Kertrasz,Kerx,Kerxenix,Kezz,Klexaz,Klezyx,Krarax,Krenarex,Krex,Krinex,Krisess,Laizix,Lazki,Lixeez,Merax,Mexiss,Moxanzz,Naxisz,Nix,Pekzs,Plaxis,Plesix,Presch,Sailik,Salanix,Salik,Sandix,Saprazz,Satras,Skalix,Skandix,Skazix,Skeely,Skeezix,Sklizle,Skrez,Slizilx,Sprizz,Ssexur,Ssizer,Ssorix,Sszasz,Sterizz,Talerez,Tarex,Tarnix,Tezzaz,Tirasch,Tirax,Tirix,Trezz,Venezz,Vriss,Waks,Xaffrasz,Xartrez,Xasz,Xaztex,Xerxix,Xirasz,Xirr,Xirtras,Xirtrez,Xirz,Zandler,Zedrix,Zilrix,Zizzasz,Zslap,Zzalkz,Zzupde" + name_generator= _ << +main={prefix}{suffix}|{prefix}{centre}{suffix} +prefix=Am|An|Ar|Bzz|Cha|Clee|Fa|Fi|Fli|Fri|Ha|He|In|Ir|In|Ka|Ke|Jezz|Ji|Ka|Ke|Lo|Ma|Ox|Po|Sa|Se|Li|Me|Na|Pre|Ska|Sse|Ssi|Sto|Ste|Szi|Sza|Ti|Ve|Vri|Xa|Xe|Xi|Zan|Zil|Zzu +suffix=ta|ir|az|ix|za|trax|il|le|esz|izs|ezz|irr|asch|ez|is|iss|azz +centre=ix|’Kza|tra|na|an|ex|ssa|zzi|’Usz +>> #enddef #define MERMAN_NAMES male_names= _ "Absu,Abzu,Aigaion,Alastyn,Apalala,Apam,Apsu,Aremata,Atlahua,Atlaua,Barinthus,Dhakhan,Dylan,Elcmar,Ember,Enki,Faro,Habaek,Ikatere,Jamm,Jin,Kinilau,Kulullu,Labuna,Laut,Lir,Llyr,Ludd,Makara,Maui,Melicertes,Mimir,Natat,Nechtan,Neptune,Nereus,Nethuns,Njord,Nuada,Nudd,Nudimmud,Nun,Oceanus,Okeanos,Phorcys,Pontus,Popoa,Poseidon,Proteus,Raja,Rau,Rorua,Ryujin,Scylla,Sinilau,Sisiutl,Tagaloa,Tanaoa,Tangaloa,Tangaroa,Thaumas,Tikitiki,Tini,Tinilau,Tinirau,Toniwha,Triton,Vizi,Vodnik,Vourukasa" female_names= _ "Aglaopheme,Amphitrite,Aphrodite,Ariel,Atargatis,Calypso,Delphine,Derceto,Diktynna,Electra,Galatea,Himeropa,Jengu,Leucosia,Ligia,Lori Lamaris,Mama Wata,Marina,Miranda,Miriam,Molpe,Parthenope,Pelagia,Pisinoe,Rân,Sedna,Stella Maris,Thelxiepia,Tirgata,Vatea,Ved-Ava,Veen emo,Vete-ema" + male_name_generator= _ << +main={prefix}{suffix}|{prefix}{centre}{suffix} +prefix=A|Ai|Apa|Bar|Atla|Dha|El|Fa|Ja|La|Ku|Li|Ma|Me|Mi|Na|Ne|Njo|Nua|Nu|Oce|Okre|Phor|Po|Pro|Ra|Ro|Ryu|Scy|Si|Ta|Thau|Ti|Vi|Tri|Vo|Vou +suffix=su|ion|la|ta|ua|mar|re|lau|lu|na|yr|ra|tes|nus|teus|tes|tan|mas|ki|ni|lau|nik|sa|loa|roa +centre=la|ma|ri|sei|te|ka|li|cer|tu|ni|ki|na|ga|si +>> + female_name_generator= _ << +main={prefix}{suffix}|{prefix}{centre}{suffix} +prefix=Agla|Amphi|A|Ca|Del|Der|Di|El|Ga|Je|Leu|Li|Lo|Ma|Wa|Ma|Mi|Mo|Par|Pel|Pi|Se|Ste|Ma|The|Ti|Va|Ve +suffix=me|pe|gia|noe|dna|la|ris|ta|tea|va|mo|pe|riam|riel|na|ra|tea +centre=ophe|phri|tri|phro|di|si|xie|ce|ty|la|me|ro|co|mar|ran|then|la|ga +>> #enddef #define NAGA_NAMES male_names= _ "Abraxas,Aleiss,Amail,Axmail,Blanal,Bleii,Blo,Bress,Briss,Gaxmol,Griam,Griss,Grissileii,Hailoss,Hainoss,Harxos,Huzel,Inaloss,Ineii,Issal,Klezel,Kras,Krezkps,Kzap,Lamaiss,Lameii,Lexpek,Liness,Lobor,Maissol,Malinos,Milbor,Mileii,Nildloss,Oxpeii,Poniaz,Psell,Pson,Pzakp,Reii,Sassal,Saxil,Saxrireii,Sekol,Silas,Skell,Skepz,Slell,Snol,Soill,Sorkol,Srell,Trixoz,Vilail,Vissal,Vlanis,Xabrak,Xamalel,Xinas,Xnamos,Xopkon,Zalsp,Zlek,Zpsek,Zsekp" female_names= _ "Aliasse,Amailis,Axmailia,Blai,Blanalai,Bli,Bliana,Brassas,Brissal,Gaxmail,Griama,Grissa,Grissilai,Haila,Haina,Harxias,Huzi,Inai,Inalai,Issalai,Klez,Kras,Krezkps,Kzap,Lamai,Lamaissa,Lexpek,Liabra,Lilin,Linassa,Maissa,Malina,Mila,Milbra,Nildlasi,Oxpel,Poniazal,Psal,Psen,Pzakp,Riaa,Sall,Sassalia,Saxiala,Saxririaa,Sek,Skal,Skepz,Sla,Snelia,Srak,Sral,Szak,Trixzed,Vilaila,Vissalai,Vlanissa,Xabrak,Xamalia,Xina,Xinasia,Xnamas,Xopkne,Zalsp,Zlek,Zpsek,Zsekp" + male_name_generator= _ << +main={prefix}{suffix} +prefix=Abra|Ale|Ama|Ax|Bla|Ble|Bre|Bri|Gri|Hai|Har|Hu|Ine|Kle|Krez|Lam|Lin|Lob|Mai|Lal|Nild|Pon|Pse|Pza|Sa|Se|Sle|So|Sor|Tri|Vi|Vla|Xa|Xi|Xna|Za|Zle|Zse +suffix=iss|ail|nal|eii|mol|loss|noss|xos|sal|zel|kps|pek|ness|or|sol|peii|iaz|on|sal|ol|kil|oz|ail|al|nis|rak|lel|nas|kon|ekp +>> + female_name_generator= _ << +main={prefix}{suffix} +prefix=Ali|Ama|Ax|Bla|Bli|Bra|Bri|Gax|Gri|Hai|Har|Hu|Ina|Iss|Krez|Kzap|Lam|Lex|Li|Lin|Mai|Mu|Nil|Ox|Pon|Pza|Ri|Sal|Sax|Sek|Snel|Sra|Trix|Vil|Vis|Blan|Xab|Xam|Xi|Xnam|Xop|Zal|Zle|Zse +suffix=asse|mailia|ilis|ana|ama|ssa|ssilai|zi|xias|lai|maissa|bra|lin|lina|na|bra|aa|lia|lai|laila|na|pkne|alsp|ekp +>> #enddef #define OGRE_NAMES male_names= _ "Akoark,Akort,Akzalk,Arkarm,Barkuk,Blokkar,Borkuk,Bukkak,Bulruk,Corkkar,Delkkak,Garkuk,Gnukk,Goruk,Grak,Gurk,Gurm,Kalknix,Karak,Karbuk,Kargnak,Karterak,Kayrak,Kelkrar,Kerta,Kilkrar,Kingrok,Kirk,Klud,Kokkan,Kolk,Komak,Korgnak,Kork,Koruck,Kramak,Krog,Krukrak,Krumuk,Kuknuk,Kurkur,Kurmak,Makron,Markaak,Markuk,Merknik,Nargak,Olk,Orkut,Reknak,Takolak,Trabuk,Trakkon,Urkar,Urkark" + name_generator= _ << +main={prefix}{suffix} +prefix=Ak|Ar|Bar|Blok|Bor|Bul|Cork|Del|Gar|Gnu|Gra|Gru|Gu|Kal|Kar|Kay|Kel|Ker|Kil|King|Kor|Kru|Kur|Mar|Mer|Nal|Trak|Urk +suffix=ark|ort|alk|arm|kuk|kak|ukk|nak|ta|k|rok|rar|kon|gak|nik +>> #enddef #define ORCISH_NAMES male_names= _ "Badush,Bagar,Bagdish,Barag,Barbag,Bart,Bashnak,Bidish,Bidush,Bik,Bilg,Bilo,Binak,Bink,Biol,Birt,Bogar,Bogdish,Bogdush,Bogor,Bok,Bolg,Bong,Borg,Bork,Bort,Boshnak,Budush,Bugdish,Buk,Bunak,Bung,Bunk,Burag,Burg,Burk,Buurk,Eradash,Eradish,Eragdish,Eragdush,Eragor,Eranak,Erang,Erarag,Erarg,Erart,Erigdush,Erik,Erinak,Eriol,Erirag,Erirbag,Erirg,Erirt,Erishnak,Eriurk,Erogdish,Erogdush,Erok,Erong,Eronk,Erorbag,Erudish,Erudush,Erugar,Erugdush,Erulo,Erunk,Eruol,Erurag,Eruurk,Gadash,Gagar,Gagdush,Gagor,Galo,Ganak,Gank,Gaol,Garag,Gashnak,Gigor,Ginak,Ging,Gink,Girt,Gogdish,Gogdush,Gong,Gork,Gort,Goshnak,Gradash,Gragar,Gragor,Grak,Gralg,Gralo,Granak,Graol,Grarbag,Gridash,Gridish,Gridush,Grigar,Grigor,Grilg,Grilo,Grink,Grirag,Grirg,Grirk,Grishnak,Grodish,Grogar,Grogdish,Grok,Grolg,Grong,Gronk,Grorag,Grorg,Grork,Grort,Groshnak,Grudash,Grugar,Grugdish,Grugdush,Gruk,Grulo,Grunk,Gruol,Grurg,Grurk,Grurt,Gruurk,Gugdish,Gugdush,Gulg,Gulo,Gunak,Gurbag,Gurt,Gushnak,Hadash,Hadish,Hadush,Hagar,Hagdush,Hagor,Hak,Halg,Hank,Hashnak,Hidash,Hidish,Hidush,Higdush,Hilg,Hinak,Hing,Hink,Hiol,Hirag,Hirg,Hodush,Hogar,Hogor,Hong,Hool,Horbag,Hork,Hort,Hoshnak,Hudash,Hudish,Hugor,Huk,Hulg,Hulo,Hunk,Huol,Hurag,Hurbag,Hurk,Hushnak,Huurk,Pagdish,Pagor,Palg,Palo,Paol,Parag,Pashnak,Pidush,Pigdish,Pigdush,Pilg,Pinak,Pink,Pirbag,Podash,Podish,Podush,Pogdish,Polg,Porbag,Porg,Pork,Port,Poshnak,Pradish,Pragdush,Pragor,Pralg,Pralo,Prang,Praol,Prarag,Prarbag,Prarg,Prark,Prart,Prashnak,Praurk,Pridish,Prigar,Prigdish,Prigor,Prilg,Prilo,Prinak,Priol,Prirbag,Prirg,Prirt,Priurk,Prodash,Prodish,Prodush,Prolg,Prolo,Pronak,Prong,Pronk,Prool,Prourk,Prudish,Prugar,Prugdish,Pruk,Prunak,Prunk,Prurg,Prurk,Pruurk,Puk,Pulg,Pulo,Punak,Pung,Punk,Purag,Purbag,Purg,Puurk,Radash,Ragar,Ragdish,Rak,Rang,Rank,Raol,Rarag,Rarbag,Rark,Rashnak,Raurk,Rigor,Rik,Rilg,Rinak,Rink,Rirg,Rirk,Rodish,Rodush,Rogdish,Rok,Rolo,Ronak,Rudash,Rugar,Rugdish,Ruk,Rung,Ruol,Rurag,Rushnak,Vadash,Vadish,Vadush,Vak,Valo,Vank,Varag,Varbag,Vigar,Vigdish,Vigor,Vilg,Vilo,Vink,Virag,Virt,Vishnak,Vogdish,Vogor,Vonak,Vong,Vorg,Vork,Voshnak,Vourk,Vradash,Vragar,Vragdush,Vragor,Vralo,Vrang,Vrarbag,Vrarg,Vrart,Vraurk,Vridash,Vridish,Vrigor,Vrik,Vrinak,Vring,Vrirt,Vrishnak,Vriurk,Vrodash,Vrodish,Vrogar,Vrogor,Vrolo,Vrong,Vrorg,Vrork,Vrudish,Vrugdush,Vrulg,Vrung,Vruol,Vrurg,Vrurt,Vruurk,Vudish,Vuk,Vulg,Vulo,Vunak,Vurag,Vurbag,Vurg,Vushnak" + name_generator= _ << +main={starting_consonnant}{vowel}{consonnant}{vowel}{ending_consonnant}|{starting_consonnant}{vowel}{consonnant}{ending_vowel}|{starting_vowel}{consonnant}{vowel}{ending_consonnant}|{starting_consonnant}{vowel}{ending_consonnant}|{starting_vowel}{consonnant}{ending_vowel} +starting_consonnant=B|Br|D|Dr|G|Gr|Gh|H|Kh|M|N|P|Pr|R|S|Sh|T|V +starting_vowel=A|I|O|U +consonnant=b|br|d|dr|g|gr|gh|kh|m|n|p|pr|r|s|sh|t|v|gz|zg|rb|br|dr|vr|khr|gd|shn +vowel=a|i|o|u +ending_consonnant=b|g|r|sh|k +ending_vowel=o|u +>> #enddef #define TROLL_NAMES male_names= _ "Äg,Agh,Bog Äh,Borb,Brag,Brag Goh,Brok,Dak,Drog,Frok,Ga,Gah,Gark,Gnarf,Grar,Grokk,Grumph,Gulk,Hak,Hask,Hoth,Hug Bah,Hu Kah,Kak,Krak,Krug,Kub,Kuh,Lok,Luk,Nak,Nuk Kar,Pag,Reck,Rok,Ruk,Sark,Shak,Shuf,Stuh,Targ,Thog,Thruf,Thur,Tohg,Torg,Trok,Tsok,Tuh,Tuk Ruh,Ugg,Üh,Urg,Urgh,Urk,Vak,Zog,Zuug" + name_generator= _ << +main={short_name}|{short_name}|{short_name}|{short_name} {short_name} +short_name={prefix}{middle}{suffix}|{prefix}{middle}{suffix}|{prefix}{middle}{suffix}|{beginning}{suffix} +prefix=B|Br|D|G|Gn|H|K|Kr|L|N|K|P|R|S|Sh|St|Th|Ts|T|V|Z +middle=a|o|u|uu|ä|ü +beginning=Ä|Ü|A|U +suffix=rb|g|gh|k|rf|kk|r|g|th|h|rg +>> #enddef #define WOSE_NAMES male_names= _ "Bludebalmen,Boladrumbadrum,Bolwuldelman,Bombempomgontor,Bomtanbomkenton,Bomtanbomtonum,Bregalad,Bremdebubde,Brenbasnudnem,Brendumadoak,Brommantendronnor,Brumbendublun,Brumennarunom,Brummdlebroak,Bumbadadabum,Buomdumdenlol,Carnimirië,Dabumdabumtam,Dammantongonnur,Danmonlulbam,Debundbemun,Delmduelmdelom,Diblembumnde,Dolmannumbil,Drongnoblemdu,Dulmandarook,Dulwulmendom,Dumdumdumatum,Elmaroomadrum,Grelmadrumbumadum,Gulladroamadoak,Gumabeladrelm,Laffalialomdium,Landunwonbam,Lassemista,Lefnublemdde,Libleddnumm,Lolmandindel,Monlamwimdan,Muldondindal,Mundionalafla,Mundumblemdum,Munnamdulbon,Nanmildaldum,Nunmaldildun,Orofarnië,Pambedrumne,Pomtamkomtrobum,Rithramcamhan,Tantondernintan,Temtundembenn,Temtunnongetem,Tondenkontenkon,Troombadoom,Tumtentantarun,Tumtonnongatum,Tumtumgamtomtom,Wonrunmaldin,Wudadoonopl" + name_generator= _ << +main={prefix}{centre}{centre}{suffix}|{prefix}{centre}{centre}{centre}{suffix} +prefix=Blu|Bo|Bre|Bro|Bru|Bu|Car|Da|Da|De|Dib|Dol|Dro|Dul|Dum|El|Gre|Gul|Gum|Laf|Lan|Las|Lef|Lib|Lol|Mon|Mul|Mun|Nan|Nun|Or|Pam|Pom|Rith|Tan|Tem|Ton|Troom|Tun|Tum|Won|Wun +centre=de|bal|drum|wul|del|bem|pom|gon|tan|bom|ken|tan|ton|man|ten|dron|dub|na|da|ni|mi|lul|mon|duel|lem|num|nob|mand|room|lad|roam|be|lom|sem|nub|di|wim|din|blem|nand|dul|dil|of|tam|kon|ton|tun|kon|ten|run|mal|do +suffix=men|drum|tor|num|lad|de|ak|lol|dum|tam|nur|dium|deum|bil|rook|relm|dium|numm|dan|doom|tum|din +>> #enddef #define VILLAGE_NAMES male_names= _ "Bal,Cam,Corn,Del,Earl,El,Fox,Fren,Gel,Hel,Hex,Hol,Hox,Il,Kin,Nam,Nes,New,Ol,Old,Olf,Oul,Ox,Rock,Rook,Sal,Sam,Sed,Sel,Sen,Sil,Tal,Water,Wet,York" + name_generator= _ << +main={prefix}{middle}{suffix} +prefix=B|C|D|E|F|Fr|Wat|G|H|K|N|O|R|S|T|W|Y|Ro +middle=a|e|o|u|i +suffix=l|m|rn|x|w|ld|ck|k|rk +>> #enddef diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 12163edbb22c..50bc744a11f5 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -980,6 +980,7 @@ set(wesnoth-main_SRC units/map.cpp units/types.cpp utils/sha1.cpp + utils/context_free_grammar_generator.cpp variable.cpp variable_info.cpp whiteboard/action.cpp diff --git a/src/SConscript b/src/SConscript index c4d977a51966..ec815f12ca60 100644 --- a/src/SConscript +++ b/src/SConscript @@ -555,6 +555,7 @@ wesnoth_sources = Split(""" units/udisplay.cpp units/unit.cpp utils/sha1.cpp + utils/context_free_grammar_generator.cpp variable_info.cpp variable.cpp whiteboard/action.cpp diff --git a/src/race.cpp b/src/race.cpp index 5784eaa97fef..bde33dfadab9 100644 --- a/src/race.cpp +++ b/src/race.cpp @@ -191,6 +191,21 @@ unit_race::unit_race(const config& cfg) : name_[FEMALE] = (cfg["name"]); } + if (cfg.has_attribute("male_name_generator")) { + name_generator_[MALE].constructFromString(cfg["male_name_generator"]); + } + if (cfg.has_attribute("female_name_generator")) { + name_generator_[FEMALE].constructFromString(cfg["female_name_generator"]); + } + if (cfg.has_attribute("name_generator")) { + if (!name_generator_[MALE].is_initialized()) { + name_generator_[MALE].constructFromString(cfg["name_generator"]); + } + if (!name_generator_[FEMALE].is_initialized()) { + name_generator_[FEMALE].constructFromString(cfg["name_generator"]); + } + } + if(chain_size_ <= 0) chain_size_ = 2; @@ -202,6 +217,9 @@ unit_race::unit_race(const config& cfg) : std::string unit_race::generate_name( unit_race::GENDER gender) const { + if (name_generator_[gender].is_initialized()) { + return name_generator_[gender].generate(); + } return unicode_cast( markov_generate_name(next_[gender], chain_size_, 12)); } diff --git a/src/race.hpp b/src/race.hpp index b4c9abbebfc3..07b81491d1bc 100644 --- a/src/race.hpp +++ b/src/race.hpp @@ -17,8 +17,7 @@ #include "config.hpp" #include "serialization/unicode_types.hpp" - - +#include "utils/context_free_grammar_generator.hpp" typedef std::map markov_prefix_map; @@ -63,6 +62,7 @@ class unit_race unsigned int ntraits_; markov_prefix_map next_[NUM_GENDERS]; int chain_size_; + context_free_grammar_generator name_generator_[NUM_GENDERS]; config::const_child_itors traits_; config::const_child_itors topics_; diff --git a/src/utils/context_free_grammar_generator.cpp b/src/utils/context_free_grammar_generator.cpp new file mode 100644 index 000000000000..f9733bb185ef --- /dev/null +++ b/src/utils/context_free_grammar_generator.cpp @@ -0,0 +1,123 @@ +/* + Copyright (C) 2016 by Ján Dugáček + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +/** + * @file + * Algorithm to generate names using a context-free grammar, which allows more control + * than the usual Markov chain generator + */ + +#include "context_free_grammar_generator.hpp" +#include "../log.hpp" +#include "../random_new.hpp" + +context_free_grammar_generator::context_free_grammar_generator() : + initialized_(false) +{ + +} + +context_free_grammar_generator::~context_free_grammar_generator() +{ + +} + +bool context_free_grammar_generator::constructFromString(const std::string &source) { + const char* reading = source.c_str(); + nonterminal* current = nullptr; + std::vector* filled = nullptr; + std::string buf; + + while (*reading != 0) { + if (*reading == '=') { + current = &nonterminals_[buf]; + current->possibilities_.push_back(std::vector()); + filled = ¤t->possibilities_.back(); + buf.clear(); + } else if (*reading == '\n') { + if (filled) filled->push_back(buf); + filled = nullptr; + current = nullptr; + buf.clear(); + } else if (*reading == '|') { + if (!filled || !current) { + lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced | symbol"; + return false; + } + filled->push_back(buf); + current->possibilities_.push_back(std::vector()); + filled = ¤t->possibilities_.back(); + buf.clear(); + } else if (*reading == '\\' && reading[1] == 'n') { + reading++; + buf.push_back('\n'); + } else if (*reading == '\\' && reading[1] == 't') { + reading++; + buf.push_back('\t'); + } else { + if (*reading == '{') { + if (!filled) { + lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced { symbol"; + return false; + } + filled->push_back(buf); + buf.clear(); + } + if (*reading == '}') { + if (!filled) { + lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced } symbol"; + return false; + } + filled->push_back(buf); + buf.clear(); + } else buf.push_back(*reading); + } + reading++; + } + if (filled) filled->push_back(buf); + + initialized_ = true; + return true; +} + +std::string context_free_grammar_generator::print_nonterminal(const std::string& name, uint32_t* seed, short seed_pos) const { + std::string result; + std::map::const_iterator found = nonterminals_.find(name); + if (found == nonterminals_.end()) { + lg::wml_error() << "[context_free_grammar_generator] Warning: needed nonterminal " << name << " not defined"; + return "!" + name; + } + const context_free_grammar_generator::nonterminal& got = found->second; + unsigned int picked = seed[seed_pos++] % got.possibilities_.size(); + if (seed_pos >= seed_size) seed_pos = 0; + if (picked == got.last_) { + picked = seed[seed_pos++] % got.possibilities_.size(); + if (seed_pos >= seed_size) seed_pos = 0; + } + const_cast(got.last_) = picked; /* The variable last_ can change, the rest must stay const */ + const std::vector& used = got.possibilities_[picked]; + for (unsigned int i = 0; i < used.size(); i++) { + if (used[i][0] == '{') result += print_nonterminal(used[i].substr(1), seed, seed_pos); + else result += used[i]; + } + return result; +} + +std::string context_free_grammar_generator::generate() const { + uint32_t seed[seed_size]; + for (unsigned short int i = 0; i < seed_size; i++) { + seed[i] = random_new::generator->next_random(); + } + return print_nonterminal("main", seed, 0); +} diff --git a/src/utils/context_free_grammar_generator.hpp b/src/utils/context_free_grammar_generator.hpp new file mode 100644 index 000000000000..a4465fbc8ac2 --- /dev/null +++ b/src/utils/context_free_grammar_generator.hpp @@ -0,0 +1,61 @@ +/* + Copyright (C) 2016 by Ján Dugáček + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +#ifndef CONTEXT_FREE_GRAMMAR_GENERATOR_INCLUDED +#define CONTEXT_FREE_GRAMMAR_GENERATOR_INCLUDED + +#include +#include +#include +#include + +class context_free_grammar_generator +{ +private: + + struct nonterminal { + nonterminal() : last_(1) {} + std::vector > possibilities_; + unsigned int last_; + }; + + std::map nonterminals_; + bool initialized_; + std::string print_nonterminal(const std::string& name, uint32_t* seed, short int seed_pos) const; + static const short unsigned int seed_size = 20; + +public: + /** Default constructor */ + context_free_grammar_generator(); + + /** Initialisation + * @param source the definition of the context-free grammar to use + * @returns if the operation was successful + */ + bool constructFromString(const std::string& source); + + /** Generates a possible word in the grammar set before + * @returns the word + */ + std::string generate() const; + + ~context_free_grammar_generator(); + + /** Checks if the object is initialized + * @returns if it is initialized + */ + bool is_initialized() const {return initialized_; } +}; + +#endif From 9e35e4d83ee8cb80225f49f7b2518fc0b04049f6 Mon Sep 17 00:00:00 2001 From: Dugy Date: Mon, 11 Apr 2016 22:03:20 +0200 Subject: [PATCH 222/240] Added credit and described the change in changelog --- changelog | 3 +++ data/core/about.cfg | 3 +++ 2 files changed, 6 insertions(+) diff --git a/changelog b/changelog index efadb73f5940..9e34d1d8ff63 100644 --- a/changelog +++ b/changelog @@ -23,6 +23,9 @@ Version 1.13.4+dev: uses full weapon filter. * lua_function=var.member now works in SUF; however, 'var' still needs to be a global variable. + * Added new keys name_generator, male_name_generator and female_name_generator + for the [race] tag to declare a context-free grammar to describe how names + are derived * AiWML: * Simplified aspect syntax which works for all aspects, present and future: * All aspects with simple values can be specified as key=value diff --git a/data/core/about.cfg b/data/core/about.cfg index 600794a3fa93..c933c82f5003 100644 --- a/data/core/about.cfg +++ b/data/core/about.cfg @@ -1058,6 +1058,9 @@ name = "Doug Rosvick (dlr365)" wikiuser = "dlr365" [/entry] + [entry] + name= "Dugi" + [/entry] [entry] name = "Duthlet" [/entry] From 7e5e3acc57241a5a53d2f215a22023f187b0fd24 Mon Sep 17 00:00:00 2001 From: sigurdfdragon Date: Wed, 13 Apr 2016 18:28:37 -0400 Subject: [PATCH 223/240] HttT S10: Clarify objectives. --- .../Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg b/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg index 95a7dabfba0c..7ecf454fcf24 100644 --- a/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg +++ b/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg @@ -21,7 +21,12 @@ [objectives] side=1 [objective] - description= _ "Defeat the mother gryphon and the enemy commander" + description= _ "Defeat the enemy leader" + condition=win + [/objective] + [objective] + {BONUS_OBJECTIVE_CAPTION} + description= _ "Defeat the mother gryphon before the enemy does"+{OBJECTIVE_FOOTNOTE _"(special bonus)"} condition=win [/objective] [objective] From 868084f6e7d40ee0c1fe4197805bc02d6ab3f805 Mon Sep 17 00:00:00 2001 From: sigurdfdragon Date: Wed, 13 Apr 2016 19:00:44 -0400 Subject: [PATCH 224/240] HttT S10: Change image when eggs are captured. --- .../Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg b/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg index 7ecf454fcf24..713bd57d6ab0 100644 --- a/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg +++ b/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg @@ -176,6 +176,8 @@ name=get_gryphons value=1 [/set_variable] + {REMOVE_IMAGE 13 16} + {PLACE_IMAGE scenery/nest-empty.png 13 16} [/event] [event] @@ -205,6 +207,8 @@ message= _ "Ha ha! We have killed this foul beast of the air, and can deny the rebels its eggs!" [/message] {VARIABLE_OP gryphon_disposition sub 1} + {REMOVE_IMAGE 13 16} + {PLACE_IMAGE scenery/nest-empty.png 13 16} [/event] [event] name=attack From 0b316b39a94fe786408b8d0ba7d30ffca0d2de0f Mon Sep 17 00:00:00 2001 From: sigurdfdragon Date: Wed, 13 Apr 2016 19:12:46 -0400 Subject: [PATCH 225/240] HttT S10: Clean up side 3 status table entry. --- .../Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg | 3 +++ 1 file changed, 3 insertions(+) diff --git a/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg b/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg index 713bd57d6ab0..1dbfe7192a36 100644 --- a/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg +++ b/data/campaigns/Heir_To_The_Throne/scenarios/10_Gryphon_Mountain.cfg @@ -101,9 +101,12 @@ id=Mother Gryphon name= _ "Mother Gryphon" side=3 + team_name=gryphons + user_team_name=_"Gryphons" canrecruit=yes recruit=Gryphon gold=0 + {NO_INCOME} [ai] {ATTACK_DEPTH 1 3 5} passive_leader=yes From 3ad092aa2bcedf5d09449a66bbb647efa337ffcb Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 15 Apr 2016 03:49:38 +1100 Subject: [PATCH 226/240] Hi-res colored cursors by LordBob --- images/cursors/attack@2x.png | Bin 0 -> 2096 bytes images/cursors/attack_drag@2x.png | Bin 0 -> 3058 bytes images/cursors/move@2x.png | Bin 0 -> 2865 bytes images/cursors/move_drag@2x.png | Bin 0 -> 2572 bytes images/cursors/normal@2x.png | Bin 0 -> 2839 bytes images/cursors/select-illegal@2x.png | Bin 0 -> 3436 bytes images/cursors/select-location@2x.png | Bin 0 -> 2041 bytes images/cursors/select@2x.png | Bin 0 -> 2294 bytes images/cursors/wait@2x.png | Bin 0 -> 3666 bytes 9 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/cursors/attack@2x.png create mode 100644 images/cursors/attack_drag@2x.png create mode 100644 images/cursors/move@2x.png create mode 100644 images/cursors/move_drag@2x.png create mode 100644 images/cursors/normal@2x.png create mode 100644 images/cursors/select-illegal@2x.png create mode 100644 images/cursors/select-location@2x.png create mode 100644 images/cursors/select@2x.png create mode 100644 images/cursors/wait@2x.png diff --git a/images/cursors/attack@2x.png b/images/cursors/attack@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..f99cab064d0c311fb9f32316b0548afe5cd43df3 GIT binary patch literal 2096 zcmbVNX;c&E8ctiJ$f5xe56Go4psZPDLP8PUuvm~PZWW1EMS+6U3MyW`73r-ABJ}o75WM$?r$6qTnfbo&o%ea({md7# zus|zw2Xg{}U?mL_MdGWU@i8;S-`v?jExy=e;utInO~NuDEll7m&_tLdRYOWR5{496 zsogM+_$XNw9fQS$hH&MmnhF_psF`XFj>gFXGBuDq1;$8;uu_Ha$m1QIWRgn3BX4Ae z(nB>uI9U~xt%akq!=mNcDRPd29N1>9O!I22)ASmJpI13!_!?NfsKERjwNH~B10K`lV9}tK^4x7zp zikLz+e*r5+bQpxl;RU-Y-0nP<^_N(#PzysCs*Og`Z3`VBOGYtNmyBvi!YCHWEfkWg z5Tn4|SfID@ieRlO9ac!RsG2mFVXo>u9xx?n2#cU9miyQ>`LLpxy;ERPmcuSGz zv5NmEYc$*$nz23pr(G6Acn=!4@0uS!yc-`F!DmK`4@cV5vZDlo$rh=IADwycaanwj zE#I+AdAZPJ)v-?l8{)A0!5c)@E|CZFM`Hzl28q5TivPLl+MU9+qUulWc!%nU6E+(* zBxe0l{Y_L;rA?8=Bd+1!evbQ(yNnL8I#o&p?Fi_|ICHZ&;5BD^$M)@06}N7nI~lrl zOAID-Nd~ar|#U=X_p^U zR!-);sW~^}?#^#fNM7CgEI|?z-6PFLBKH&^Y|k3+-39)qOc<$)XZ(w+4x$COt82)T z?6`h&LH5O~V?e<0%*nuh>*p=B)w!*;`UGwHx$My1!WGEi-g}52scZCO^VjH|^ZUae z2j?}W#Kk@Lvy8pnGTvIbyk5GmxajD#>UhKh%ZVyM&H6)UOB_->rd@J6$I6vhj^7&i z=McE7S6X4SExcz}Qw}l`)vZ` zwsLSQ5MrO&Hmnpi5=)Day4cF5h>Hj6y^c>Auotx#(nFR^@&^9qdp-OK_uydnqL}`% zoxfb~*E558HeQdvjUTnl8W=~B-xrmvXunqY=lD6_%QKg|!hOP5jM@@Cmu8SPTgouO zj>FX9yn*<0Z~*^lbLG&LcDr&COtxEc!}f^VNSmAdU|-_P;w`Q}IZbxYTJ#6oPu5-d zwfW=SQTq6%u8}ek6GVxSw?%!>40**Z=7>Igkq%zX9Blh>a`<4R!aB--O;Ww5{ z&uqEWW@{;2+S;E!r4Z})M4pK-kj`RKR}ac!^JD4fkx#f0L;Pa>fa&H5&*fe931erJ z;?%Fe?~(K!W~R%^a zA9XIP+f(Fuw`MB-SsUq-&9l_}HKI6&-Br&{%&29_w2633RAs0gEMm64Wc}1E|G7~3PS*YzT;uSj}8eP`s! zO``r;ca2rls>G~#0=*PHIir2`gGVox`Q>W2B&x}w>2RlfFidKpa;dkjeDdHDu~-q! zUY>H*Q0UGNUfK4WW_`o?g3r?*JzO;D`+9okX%p9kkj4`22?p3%(r)GPN5z9hguESX z@r>%Ko}qow0b7@UPOnf6ULsa{r+hHHkMI%UMa9zfv$JNGjsI||I81a}kdXTyR7*`N literal 0 HcmV?d00001 diff --git a/images/cursors/attack_drag@2x.png b/images/cursors/attack_drag@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..79a17c8e51535d8dcaba01003843ea9b3b18746d GIT binary patch literal 3058 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 MgFB(pKJfT|02htWIsgCw literal 0 HcmV?d00001 diff --git a/images/cursors/move_drag@2x.png b/images/cursors/move_drag@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..a6ee961d4126d42a2601f10b4159162bcc8ae7e5 GIT binary patch literal 2572 zcmbVOdpwi-A0H|q)QOaCYosa0#@03*?SdSpxrB72wLKWyp4lF4AxG5FRfUvGCo0p1 z@sdi_v|I;qhBDe>qwm+I5KKvLTKmgB-2p*0Su%!xtm__!a zQv##|k8?NdUE*ePBR-3iW){?7S;EmNmNF$~E3cz1lW|eMh)41d=+2BaOZKH4iqlWd zxm}+^&-_G+T$jFtj%vL@sn@fNo||&Me+d2&AQbUB}DZ^6w&Sc1>6nYOOJv zUr>QCEkh(WqPq+|^P!&Smm9oQ*n(H4N=(xLUZUIFxGFKyKMrY{rAbq7wf6ZkS#5(yZ!5-_uJU3TP9En3dF`sUlIO{I_jO!9 zcAVR=09VS4>Dyy);9>lyK|*P2b@q*}clc{}Pn~G-REYYnDDB=AH6#^QfkUmuC))}( zNH!G-i^@aQSyG2~oz)ia5@VcCV^U{6c$(UL*N>eWSv!ZC1a1y-6T;TTU;AiaD0t1$1kuh5pA@ERriNY=sWH`-@{P@1M_SM z&jxz@hW%!c4Fi+f_R;)n+V&sMT~prv+t~PlAW`a*jx}EK0Y-fcTAS~w%2LbUHtK34<}B-gPU-eON9kpO)zPTkPx8<5R@6Dk-q$oT zJ{LPl?wKD#Jlj8%mqCsgU35!qq}Y6TPj$Oy>+8K0H>(X+l5CzjAbeS%&F}j0gO)U{ zV4aQDAt%o7Se;v?#WdCY<;Ri>kLJwSpQf8n?z{Bzgh^~@Q9gQ=X|ZK+Y`OiUNmQ|i z=AZMKOSzh-rMzE+`AR*T)PpG!jzvDzN~&(?>Mn%N2?B%h%wxXiE|GkPXOAh*`LkID z2dVgF7c2W3%rUNkh6(qqL+5$b+gMY=Q|8P{-Dq2|koPESJh=AQ@aECg$^(VtXCO`N zd}4*k(TarLBL@?`9o0^4VKqGuIu<-!V0i1Qbn;b4mFZE{i|15WKM0}r>wC58DIJ%&oVM6mrX40F zM;}VPxxky_6n=KUpry%p#Ts5lLb;K4Zo=a$a>9}Rq#RAL@DWR2an?6dCkE45A}`kS z3{N4S76hr0Po(Wp%#w!Yy&sH``SUM^p-%?sSEak(*14r!dJ-~5D?$9eOhCS|vj6WI zhSx+BwqxL#Y<8ARA82p6Ojb<1XRd8MZ~or-owrhzo)|Rx`_=kmReIj0H7EAfJA;Ox zB9@^F*cyvr`^eT!ptn@ZmUd@5SMF9y#II!9I$3K!Z)5Dt$jb4_l+A6~9;yo7>Rfk| z1>`*$Dz<*}Z28M5OGAWYx!UNgdhj;+j|+8Z4EFtj5QY3f2gf*j(+H;}j@zM{^OEfC zmA;MY9LPgkSyo>BhZvC=+k0%&JZJT<4i`%6fBo_@P3>|tDq2wy7b-YxtV56uzg<|l zN@Y@i*}S=_?2PwlT%rANR>#8{ZG2ack4cHA+opRwX5$0Ri-H7Ano^vuygj3%{!5hJ z0Btmmx@d3_cWy`xfG!@ zmBW+sNFsCTW`&sQNQLxF?=TZYmwkQ2-eBM6Cl-*^eK{fZc_2l}QW2qNlz zcgn+lKZwHPGeH;_8p=Q*ksvGyZp z6P&45KWxcPL_L;35JG^%BO@bWk!To?9{@+<@%R-E6bdTSfQChJ1#}^l8>YX?KxKw8 z`0Nk?o5uyMFwzh6!UaSnZf!(5|6m~dxi7%!a9kk!Lqe-$jt-9H;zQIvT@aOAUPMWF{%d5mxllPjQ6iF&dx zFh8~*flRidppm;NcsvS)#UYV61P)C>K2&SJEpT_}x%P@icHy&WDkfta!m1K!SA-_eA zLXjvG5|vD{r0kZpl->`l-~W>}xXc;&N_+fIyR3?2J-D*{tNCSzzs85jmCX!aHXK}w z#Bu;&gC&hhautflbEATPI91$Rp< z5|-%3PA3cl-_^Le_TAMtjc*vKls~~Co>DmHYFjYVttswH9F>Y+%!@N-7Z=9fMnsgf z+^aLIf`4ZEM`lO^+S=c=N=?ek&wPD!{AaThg|##D#9yYsj)rGN(;6pYUWimYljUpe z#oI|7RD=un zof&=eal@_tHl(d`i@C9+8XezOZS_YKphqbL{N-K?n<7Wplecd%=7_V)V^WC)$}?>; zZ>iYUS9+PQ60FvY?6u8b8Atv z((x@`ogs+U$E|p5eDto&O?okfNeX0VpT0w zh(mF~G}vIsYxjm*yVY}#fBa33qmZtZG}+m#^O@8e!W+`>P4?6go3aa@BebJgH=7Rr zQCVFN?c4nLb$}`=EW_B843NfF*mjz;PikXEv^Z<;DO23`SqGThk6m~V_(Um^*`S4P#^TF!e7refOHf!u&hprpV#dc$-#7K zcGlp~p@rCWDVmDuoU+LRr)!ewDqno6M*R-N3l&XMpo1E}wtn!gFfR78ZQ3j9&B&d- z$Tj&011B(2Y*U*H&Jbdae-X7Vq8ri|=4xv^E9H+h50_32o$)$&vuv&eDn6F@woG#O zL}tQ;G`HBCYg0cjLVxanP&#Sxk}7%+GWhy)bDW!$Q(D`413lh4eGXYEHQ6$3`sDM> z29cq5|D2)=3tiZr78HQDL*`xVb0FJiPW{zfYP5VYkA+1 zBbfc&Onvi|OjTVq2C`*FKM1 zYOjrfP7beN*RS2q`^uERTs#xekt3(i?s}PRoq|-@sYNtBq?8$X>V8p~pTSUtPUkI) zjl54Kp(ak?`9N+4)X^u`xE^yfoD1ntZ_W%BoD@qcF22!j)xGQ+ zK|fb|mf4vgO59aL6P)$KKWjUL{1k~B>4!N55suV83I9-Fzj334y}TJXJXph_FbR$K zoF%6mfrUlfl>YkE}0wqPo{=TYbeahSBQbKC`0HePBQ;`yB zYpHFR+1325_eY~Sl_LZyeIdI-|5#G@=n@J4b-vMuR~i(!SqeebA1o~L_k%PHU7&e> z*{17LsQpo*Q>NavuTpqi-2lEW^nBXkg7!NTsJekxskCy5~d&R1J-lFS#rwYr8!2+6KK% zjoLHvX{c<@aV*NtHy@#f_f}&qJ|0@W_OH?KV{S_^Td>*|JGUSX%?Dy}n9n1A9RL78 z(!`ixBOJ9iAK*6O8?!#Z77p@U14phc%aiL*WK#fGGRuPkGVvi&DK-=$IpAyyMTpo! zquV)h9WBf;B$f|^xTyo-`S=RaLNYy`FOlR;;etFUR60`!{ITW{7(^%QfE~0fG%bAb z6dK()kWH}-w6r4ydXvy(u%0eRn}-n+_)xe+5YLCf&vfrZxC zWKWC@!SK5+;YtTg<8pm58XEro{t*9@5Eh%N0Y#(Hn;bBhx==%%6TsvWdFo7#@(%_A zg+pS~eYtcN6ST=l^kALi>VSow{uP3cuZ6|m#7xfjLb$LDD(zn#ik33LSztFq;ozLCf9_Z z0~UUPkm+O$4rhoz2}R=3Xc!EEfZoxlSOYv#*izu{Sn~gqH4ULN8k_C$Kkf2EB<#V>>EF#ST>QO#C`{p= zVGB10Z)Ua(01!_#Az~1ZOWdVB;r|P&;qki?U#fRe7V)JodTSJxfk)wO-#p~C`Hxi3I=WEBREj=?=wDsz5 zij44ybKyq)?wsPQx1{DL&W0oD0HcTA%4o9E_{pS4Z9AhXqEP>oCQ&b`&v)C}rq7Vo4*SRx z{XCm3Naf63vaWNms?4oWX=~j2zEaHd(0qkULPFeC@0R%l_LN-h`AE^DKvBbsa65KB zU>@)c$`kF8vJ-ul{M+O5Gb>)H4pn#9Q8{15Xj{5XArT?2NuS)9?|zN(yPcm*`GS$r z{j=3^Wy=aLV^mrxHSQh;+t`Q_S1t?GKiP2bpknXTZ)!bjNd1+d7b);dIbw2Ia;scHl9pP^zAB$4r$hNBSbfn+ox~1-B8mVa;o~e2rouP3cPPAp13)l zwJ&Gw)}ddlNn_Epc@6zPN(trI8+jSGYZk`!5qslai}70NwCLULel?>Z{UwvL(Ony? zBNKY@*H|Eja!``Z6u#pnHrzb(+0kUkMy2Y#^RbsRt!k#zO8(d|J{%b9`1?H99yLNv z;X1wC7NUL*CpXd;Y_P<CcSYy3Rmk2E@_6^Zb%sKcA41a5hoCQl0PM@rzgbDj%zu10c)C z2gJlWMKbpO96*Z*08_l2r;~fY2^8bhXg8cd{2Kg}pjnmCT`d{^+?HIP0=F(4cS(y$ ziXD8?{c~$4EnWXrzcsnsVbH@ZN5S!h2U&r*R2bL^k4L26Zv&L)2lm^z6=l2TX!e3) zG)tn$rCBip5sWixm1Gn8)0#&0moFgvi2)1cD+LGF9BmErK077Xg{NevI)ciN$?gC{ z&den%Okv~CUow=lN3-=UB>Hazwk7oKi(?!=9{hCdj6G%Vkwbln7rKEYkZ!P}nM9-o zzD)cXa{pzuq02LZb&>oJg^2gs>yF%cc#LnFox((jsTxgrqBQEgj5>r*w(SnN*E~|$ zrv92xllQ!HIOX{5u@Z#`OAFyyeeqrAPn{6A+z3df>@-cbgBK!$S``I@NvK;-{G~1J z1QFAx6?0r=^?H*o#yoIyaBuPWGzV-uPkz`MvPJ7xtrc?mka^)*;$L|=qusC1@A!h=9!RCiVYo|PN8KTl>W^t9hE(7$a|Rb)zYluc zeSJt`Cf7A+pmXh!#`aS{S?9*QUfR75K15<&e^*9D;Vzj_wYAd*P1on7%$9+|({@a! z$Y-I8YIkBkF~t%{YKne?&fn?k^>%SCC%C1hxkp?jGuY%0yK`f=1yy$hVT}5@RfyJ? zH@z!Q2P3wOC2B_AsCpT;M%b_-ginIHD$_O1r@ZtI7(q4=4&}eS=!=0ZF<J9tyR+00FHBlo=W`}0FVM^>ox_sM!IUe^@T=6L ztHTW7n5o)?ID##m6Y05nTo8}D=qzu_@_31>B%N_810T$YQn4XZtX*+9~d=Ll)L}lVtBFIj0Y{f zyQCQ%0M!ljq=Ex`%s(0_Qo5r&4;Bx&h*OP8pipXorgy`Oxt%T4=cWR?KiZ|g7Cp!o z6r^%2W_rAz!V@jE5LL=jvte!O`#(eJ`ZXKD1G;w!Fj8g?N(mT z_Q&5`mX6Q72K16Zj&e4{^?M^!p)}*#NCGuxTG(ft0jy56wEuGd%WY zRCO5OV9G?K(%P9{FW4OJFh&^;PtM+D+e$yocy(c`9Ka&+d6;Z5EOzt%$Hc&rP=a&k F{|B?D`r-fp literal 0 HcmV?d00001 diff --git a/images/cursors/select-location@2x.png b/images/cursors/select-location@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..84506cfdaadc43e1fb5bf60242a49d2c39d387b6 GIT binary patch literal 2041 zcmbVNYg7|w8V(c`VFP*qt!!aqqKK4SCL|%r5-`am5N!wz350_PLl_~F8_57cYy%1f zDitdr#a7hP=n5=NX^e`rLbXe)i_L}>f(stJv9{tuk$PKOcYYO>yS(uJ&H!j;!S!;SpXxr95_#<<>05!p2Oo* zxg2~NT}%<{`Eb4}afbm;*^wku?kG^Qa`EwTxL6Y#CD6bKgfnT>S|i)U!O!!u(Y;$t z#^dHykOB_=nNtdJGLEk^z&JW7ny91z0FJ>R0W>;;0Yu@b6o5*mpf`gE(Aaban;L^# zxbUboL+&=V6cjGlLQfogK7#1kWO7MK38^HSq%-7^0Tzqp=AcrEs0Ptkszo3ZQEMbD zGJvpAX;A4Al}?LuGeSAKB7}oSJ$)8}MlTjWC)OGl5{0IWY=ZP;fJ7l{H14?OwT*}r z{?&~aY8z#xdYCMQjk+R(60OHJ!Xg;W-R~Q6E27@8B?c8*6i5x~ltmg?i-T%kdy!Odrwt$Kk6bRj^aMuS`dlM2j7PNj1Bd@ji2 z3ivT-OW_x=xql>UWYih5yFGr>E{h_x2i@D}&5s_Qj}NRxXU2dIM{R0a4hG}3UIcPw zrYlqLbMk|@K?5bt<;OuAaO?nWdz;=B@p4D@t}3tn*@0CwuHT-NDV}4K@;_;7YJB!@ zUcTo@HtZ=PZ0Jh1F+1yJ+xME}!w(qI17l;CN5(HtUAWnAEqi}-{L$UAPh+NkCPS|b z^l$Bsa4GEpPtIioj4wM+8I8+&Z_oPrr!H3U>~_6Xx3)2JLjJvVHvG<=$KRY(j4?b< z1E)r3OAFxkN765TT(uWleWEY>Gsok?$k$9d}x4d@|8F zIO|kXiz^SAnJc!K=hiRxAWSX)x!mDlt37*9n*ZeN#c;hsIiikh^Rmyt_U|Jq<%7`N zOy5Y}gACrj)*1&Rq3)jMvMW}{$J!ll40 V%Z!ZaV1aN_sU+ z=*a#gp!Kf(Lc<2yTGAD3#;YksonJX7yN_A0p=L9=s%mic*ht0T*_z|t@7y=Gy=x0P zzv)t`-I?Qe;G62d_FyK@Qz$=J)^v+!RsNJS{k5NaX6gHWX=s*&o)*_bf5~+5S7mJ) z81TckU>Yh;aT`dtAB|vS?|KYbC)<{Ek$;N%KwW>rPq#Jt4&L^9BuY!7bSJ9=%d@?LGTUau{Z-XdH>VY6KUdFs>C`r4M*sQn4qEv^r*UlXR*nLl}WT5$3Lwj&^T z&#u7c(6X21o_1*XrGGP5-1usuZ~|ZGH{t|;^102L^X?*idy8E?6dC;Ytyhu)Pgl0D ztMI?2x|JAbRHPnw-RHXWJ88_}V&Adax0}1e|JzeDu{OhZ?c*p9kt|kGAs^j$EQ=rB zzOHxfi{6H%nqUdOxS-=edSf}^lJ#Ox{iW_seu5nu4XXFA+ z1qzQD#DPWeV7MhH=m@R@o`6J9PoAc)O61f4iWY`pxR4se&%JT4^_ul*w%DSGWiPUm`A;+4|5ndSL7Eg z^f~t{q6<2uSUh0QnS{k8>-!-r5md+lG3)IxlM0h}@{f^31Rx*XN06^X_Ez zy`Onzyq;M`UxKKNbWZHpf<1|^KeW%GvY=!2`8~gZbKlf=w@xOmvMAf=HMc<@SlX*Q zBfh`u{YmPR-El>Q7o^cv)|Xm)+JMdOm)Co)p+5^a!TT`RJPSwkCv=3B7n~dg9#5C&Ja|BEp)Y_aI-xaQLH%tS*~#zMi(~i5j(<0dY-!LhDE8d$ZE9D< z_S9q#`gJhTOWl_Ej6JNc|H0XFq5V}uUAx@!=ZAtU+)z`A? zbF)Geg_Ez-Lowm#O~S2FLQq+p-qtca>h7|w(~UT> zyJ=E-sldwf&i$F}V=T|-|1tVD)76o7-ys%Qn`%uGT6ypO!{5(%PI}m+X>lqS zPj6@|+_Bm)0H9DOcF-deEKg+gi{Y s*+^f~l|lS_S;?bx$F&xZ4^KJ7Ah($ literal 0 HcmV?d00001 diff --git a/images/cursors/wait@2x.png b/images/cursors/wait@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd622f47c1571562c9f8402b727215230eb166d GIT binary patch literal 3666 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 kYOHAcay!gx@sgN?*v_V!uTEg7o~DuBme*a literal 0 HcmV?d00001 From cdd1370276278fa6d89e03fce921de577db03765 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Fri, 15 Apr 2016 08:50:13 +1100 Subject: [PATCH 227/240] Updated CB projectfile --- projectfiles/CodeBlocks/wesnoth.cbp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/projectfiles/CodeBlocks/wesnoth.cbp b/projectfiles/CodeBlocks/wesnoth.cbp index df0347a4a959..4f77a4304e46 100644 --- a/projectfiles/CodeBlocks/wesnoth.cbp +++ b/projectfiles/CodeBlocks/wesnoth.cbp @@ -1064,6 +1064,8 @@ + + From 1649930113480c0fdf8e1e949445d4c9a9022265 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 15 Apr 2016 14:12:29 -0400 Subject: [PATCH 228/240] Lua API for the name generators --- changelog | 3 + .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 22 ++- src/CMakeLists.txt | 3 +- src/SConscript | 3 +- src/generators/default_map_generator_job.cpp | 43 +++-- src/generators/default_map_generator_job.hpp | 5 +- src/gui/dialogs/unit_create.hpp | 2 +- src/help/help_impl.cpp | 2 +- src/help/help_topic_generators.cpp | 2 +- src/scripting/game_lua_kernel.cpp | 66 +++++++ src/scripting/lua_race.cpp | 40 ++++- src/units/race.cpp | 168 ++++++++++++++++++ src/{ => units}/race.hpp | 11 +- src/units/types.hpp | 2 +- src/utils/context_free_grammar_generator.cpp | 59 ++++-- src/utils/context_free_grammar_generator.hpp | 23 +-- src/{race.cpp => utils/markov_generator.cpp} | 141 +-------------- src/utils/markov_generator.hpp | 32 ++++ src/utils/name_generator.hpp | 35 ++++ 19 files changed, 474 insertions(+), 188 deletions(-) create mode 100644 src/units/race.cpp rename src/{ => units}/race.hpp (87%) rename src/{race.cpp => utils/markov_generator.cpp} (52%) create mode 100644 src/utils/markov_generator.hpp create mode 100644 src/utils/name_generator.hpp diff --git a/changelog b/changelog index 5054619911c6..755c48c1382e 100644 --- a/changelog +++ b/changelog @@ -139,6 +139,9 @@ Version 1.13.4+dev: sources. The [sound_source] and [remove_sound_source] now use these. * New wesnoth.log function for printing log messages. The [wml_message] and [deprecated_message] tags now use this. + * New wesnoth.name_generator function builds a name generator and returns + it as a callable userdata. Both the original Markov chain generator + and the new context free gramamr generator are supported * WML tables defined in Lua now accept string keys with array values (where "array" is a table whose keys are all integers). This joins the elements of the array with commas and produces a single string diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 3ba884ad8a82..b8af7f84dd3a 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -135,6 +135,7 @@ 916719061CADABEA00B055A9 /* game_data.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EC387E68195AFB1F00FC0342 /* game_data.cpp */; }; 916719071CADAC0D00B055A9 /* libboost_randomw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = EC64D75C1A085C990092EF75 /* libboost_randomw.dylib */; }; 916719081CADAC2800B055A9 /* apple_notification.mm in Sources */ = {isa = PBXBuildFile; fileRef = F40A13BB1A3A88BA00C4D071 /* apple_notification.mm */; }; + 916B7E941CC151FA00811097 /* race.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C00EC62181008DD061 /* race.cpp */; }; 919B37F81BAF789E00E0094C /* synced_user_choice.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 919B37F71BAF789D00E0094C /* synced_user_choice.cpp */; }; 919B37FC1BAF7A9D00E0094C /* synced_choice_wait.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 919B37FA1BAF7A9D00E0094C /* synced_choice_wait.cpp */; }; 91A214E51CAD666B00927AEA /* arrow.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B52EE8A1121359A600CFBDAB /* arrow.cpp */; }; @@ -448,6 +449,7 @@ 91B622221B76C0F400B00E0F /* libboost_regexw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5313AD4E35003C701D /* libboost_regexw.dylib */; }; 91B622231B76C0F400B00E0F /* libboost_systemw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5413AD4E35003C701D /* libboost_systemw.dylib */; }; 91B622241B76C0F400B00E0F /* libboost_threadw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = F4EF0D5B13AD4E6D003C701D /* libboost_threadw.dylib */; }; + 91C55DA41CC078820040012E /* context_free_grammar_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91C55DA21CC078820040012E /* context_free_grammar_generator.cpp */; }; 91DCA6891C9066CC0030F8D0 /* unit_preview_pane.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA6871C9066CC0030F8D0 /* unit_preview_pane.cpp */; }; 91DCA68D1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91DCA68B1C9066EC0030F8D0 /* unit_recruit.cpp */; }; 91E355631CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 91E355621CACA1CE00774252 /* libboost_unit_test_frameworkw.dylib */; }; @@ -718,6 +720,7 @@ 91F462881C7115C50050A9C9 /* combobox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462861C7115C50050A9C9 /* combobox.cpp */; }; 91F462941C7117400050A9C9 /* drop_down_list.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91F462921C7117400050A9C9 /* drop_down_list.cpp */; }; 91FAC70A1C7FBC3400DAB2C3 /* lua_formula_bridge.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91FAC7091C7FBC2C00DAB2C3 /* lua_formula_bridge.cpp */; }; + 91FBBADB1CB6D1B700470BFE /* markov_generator.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 91FBBAD91CB6D1B700470BFE /* markov_generator.cpp */; }; B504B94C1284C06B00261FE9 /* tips.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B504B94A1284C06B00261FE9 /* tips.cpp */; }; B508D13F10013BF900B12852 /* Growl.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = B508D13E10013BF900B12852 /* Growl.framework */; }; B508D14B10013E4700B12852 /* Growl Registration Ticket.growlRegDict in Resources */ = {isa = PBXBuildFile; fileRef = B508D14A10013E4700B12852 /* Growl Registration Ticket.growlRegDict */; }; @@ -841,7 +844,6 @@ B5599B0B0EC62181008DD061 /* reports.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B70EC62181008DD061 /* reports.cpp */; }; B5599B0C0EC62181008DD061 /* replay_controller.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B90EC62181008DD061 /* replay_controller.cpp */; }; B5599B0D0EC62181008DD061 /* replay.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999BB0EC62181008DD061 /* replay.cpp */; }; - B5599B0F0EC62181008DD061 /* race.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C00EC62181008DD061 /* race.cpp */; }; B5599B100EC62181008DD061 /* preferences_display.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C20EC62181008DD061 /* preferences_display.cpp */; }; B5599B110EC62181008DD061 /* preferences.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C40EC62181008DD061 /* preferences.cpp */; }; B5599B130EC62181008DD061 /* playturn.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999C80EC62181008DD061 /* playturn.cpp */; }; @@ -1671,6 +1673,9 @@ 91B621F51B76BCB000B00E0F /* unicode_cast.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = unicode_cast.hpp; sourceTree = ""; }; 91B621F61B76BCB000B00E0F /* unicode_types.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = unicode_types.hpp; sourceTree = ""; }; 91B621F71B76BD4600B00E0F /* multimenu.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = multimenu.hpp; sourceTree = ""; }; + 91C55DA11CC078780040012E /* name_generator.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = name_generator.hpp; sourceTree = ""; }; + 91C55DA21CC078820040012E /* context_free_grammar_generator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = context_free_grammar_generator.cpp; sourceTree = ""; }; + 91C55DA31CC078820040012E /* context_free_grammar_generator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = context_free_grammar_generator.hpp; sourceTree = ""; }; 91DCA6871C9066CC0030F8D0 /* unit_preview_pane.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unit_preview_pane.cpp; sourceTree = ""; }; 91DCA6881C9066CC0030F8D0 /* unit_preview_pane.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = unit_preview_pane.hpp; sourceTree = ""; }; 91DCA68B1C9066EC0030F8D0 /* unit_recruit.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = unit_recruit.cpp; sourceTree = ""; }; @@ -1716,6 +1721,8 @@ 91FAC7081C7F931900DAB2C3 /* lua_formula_bridge.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = lua_formula_bridge.hpp; sourceTree = ""; }; 91FAC7091C7FBC2C00DAB2C3 /* lua_formula_bridge.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = lua_formula_bridge.cpp; sourceTree = ""; }; 91FAC70B1C80168600DAB2C3 /* group.hpp */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.cpp.h; path = group.hpp; sourceTree = ""; }; + 91FBBAD91CB6D1B700470BFE /* markov_generator.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = markov_generator.cpp; sourceTree = ""; }; + 91FBBADA1CB6D1B700470BFE /* markov_generator.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = markov_generator.hpp; sourceTree = ""; }; B504B94A1284C06B00261FE9 /* tips.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tips.cpp; sourceTree = ""; }; B504B94B1284C06B00261FE9 /* tips.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = tips.hpp; sourceTree = ""; }; B508D13E10013BF900B12852 /* Growl.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Growl.framework; path = lib/Growl.framework; sourceTree = ""; }; @@ -3001,8 +3008,6 @@ B55999C10EC62181008DD061 /* preferences_display.hpp */, ECC84C1B1B973C5900A5F451 /* quit_confirmation.cpp */, ECC84C1C1B973C5900A5F451 /* quit_confirmation.hpp */, - B55999C00EC62181008DD061 /* race.cpp */, - B55999BF0EC62181008DD061 /* race.hpp */, EC84245B18F30D9100FC1EEF /* random_new.cpp */, EC84245C18F30D9100FC1EEF /* random_new.hpp */, EC84245718F30D9000FC1EEF /* random_new_deterministic.cpp */, @@ -3565,11 +3570,16 @@ isa = PBXGroup; children = ( 91EF6BFC1C9E22E400E2A733 /* const_clone.hpp */, + 91C55DA21CC078820040012E /* context_free_grammar_generator.cpp */, + 91C55DA31CC078820040012E /* context_free_grammar_generator.hpp */, 918056BE1CB1E4C0001A7F35 /* functional.hpp */, 911F471B1CAE5A7E00F47035 /* iterable_pair.hpp */, 91EF6BFF1C9E22E400E2A733 /* iterator.hpp */, EC53B04D1B23BB0E002F758F /* make_enum.cpp */, 91B621931B76720B00B00E0F /* make_enum.hpp */, + 91FBBAD91CB6D1B700470BFE /* markov_generator.cpp */, + 91FBBADA1CB6D1B700470BFE /* markov_generator.hpp */, + 91C55DA11CC078780040012E /* name_generator.hpp */, 91EF6C001C9E22E400E2A733 /* reference_counter.hpp */, 91EF6C011C9E22E400E2A733 /* sha1.cpp */, 91EF6C021C9E22E400E2A733 /* sha1.hpp */, @@ -3648,6 +3658,8 @@ B55999730EC62181008DD061 /* map.cpp */, B55999720EC62181008DD061 /* map.hpp */, 91B6219C1B76735200B00E0F /* ptr.hpp */, + B55999C00EC62181008DD061 /* race.cpp */, + B55999BF0EC62181008DD061 /* race.hpp */, B55999710EC62181008DD061 /* types.cpp */, B55999700EC62181008DD061 /* types.hpp */, B55999790EC62181008DD061 /* udisplay.cpp */, @@ -5016,7 +5028,6 @@ B52EE89E1213590500CFBDAB /* progress_bar.cpp in Sources */, B5599ADC0EC62181008DD061 /* progressbar.cpp in Sources */, 62CC8E7817B9063E00C16B75 /* pump.cpp in Sources */, - B5599B0F0EC62181008DD061 /* race.cpp in Sources */, EC84246718F30D9100FC1EEF /* random_new_deterministic.cpp in Sources */, EC84246818F30D9100FC1EEF /* random_new_synced.cpp in Sources */, EC84246918F30D9100FC1EEF /* random_new.cpp in Sources */, @@ -5186,6 +5197,9 @@ 91DCA68D1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */, 9122417C1CAAB7B7008B347F /* loadscreen.cpp in Sources */, 91FAC70A1C7FBC3400DAB2C3 /* lua_formula_bridge.cpp in Sources */, + 91FBBADB1CB6D1B700470BFE /* markov_generator.cpp in Sources */, + 91C55DA41CC078820040012E /* context_free_grammar_generator.cpp in Sources */, + 916B7E941CC151FA00811097 /* race.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index c61b56db26f2..5025bf6d8916 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -980,9 +980,11 @@ set(wesnoth-main_SRC units/helper.cpp units/id.cpp units/map.cpp + units/race.cpp units/types.cpp utils/sha1.cpp utils/context_free_grammar_generator.cpp + utils/markov_generator.cpp variable.cpp variable_info.cpp whiteboard/action.cpp @@ -1039,7 +1041,6 @@ set(libwesnoth-game_STAT_SRC pathutils.cpp preferences.cpp preferences_display.cpp - race.cpp quit_confirmation.cpp reports.cpp show_dialog.cpp diff --git a/src/SConscript b/src/SConscript index 67881dea8587..0ff1debe9d9d 100644 --- a/src/SConscript +++ b/src/SConscript @@ -120,7 +120,6 @@ libwesnoth_sources = Split(""" pathutils.cpp preferences.cpp quit_confirmation.cpp - race.cpp reports.cpp show_dialog.cpp sound_music_track.cpp @@ -552,11 +551,13 @@ wesnoth_sources = Split(""" units/helper.cpp units/id.cpp units/map.cpp + units/race.cpp units/types.cpp units/udisplay.cpp units/unit.cpp utils/sha1.cpp utils/context_free_grammar_generator.cpp + utils/markov_generator.cpp variable_info.cpp variable.cpp whiteboard/action.cpp diff --git a/src/generators/default_map_generator_job.cpp b/src/generators/default_map_generator_job.cpp index f1e3799ea29f..ae3930d6e881 100644 --- a/src/generators/default_map_generator_job.cpp +++ b/src/generators/default_map_generator_job.cpp @@ -27,10 +27,11 @@ #include "default_map_generator_job.hpp" #include "pathfind/pathfind.hpp" #include "pathutils.hpp" -#include "race.hpp" #include "util.hpp" #include "wml_exception.hpp" #include "formula/string_utils.hpp" +#include "utils/context_free_grammar_generator.hpp" +#include "utils/markov_generator.hpp" #include #include "seed_rng.hpp" @@ -601,14 +602,14 @@ static map_location place_village(const t_translation::t_map& map, return best_loc; } -std::string default_map_generator_job::generate_name(const unit_race& name_generator, const std::string& id, +std::string default_map_generator_job::generate_name(boost::shared_ptr& name_generator, const std::string& id, std::string* base_name, utils::string_map* additional_symbols) { const std::vector& options = utils::split(string_table[id].str()); if(options.empty() == false) { const size_t choice = rng_()%options.size(); LOG_NG << "calling name generator...\n"; - const std::string& name = name_generator.generate_name(unit_race::MALE); + const std::string& name = name_generator->generate(); LOG_NG << "name generator returned '" << name << "'\n"; if(base_name != nullptr) { *base_name = name; @@ -783,12 +784,19 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t config naming = cfg.child_or_empty("naming"); // If the [naming] child is empty, we cannot provide good names. std::map* misc_labels = naming.empty() ? nullptr : labels; - // HACK: dummy names to satisfy unit_race requirements - naming["id"] = "village_naming"; - naming["plural_name"] = "villages"; - // Make a dummy race for generating names - const unit_race name_generator(naming); + boost::shared_ptr name_generator; + if(naming.has_attribute("name_generator")) { + name_generator.reset(new context_free_grammar_generator(naming["name_generator"])); + if(!name_generator->is_valid()) { + name_generator.reset(); + } + } + config::attribute_value markov_list = naming.get_old_attribute("names", "male_names", + "[naming]male_names is deprecated, use names instead"); + if(!markov_list.blank()) { + name_generator.reset(new markov_generator(utils::split(markov_list), naming["markov_chain_size"], 12)); + } std::vector height_conversion; @@ -1279,11 +1287,20 @@ std::string default_map_generator_job::default_generate_map(size_t width, size_t config naming_cfg = cfg.child_or_empty("village_naming"); // If the [village_naming] child is empty, we cannot provide good names. std::map* village_labels = naming_cfg.empty() ? nullptr : labels; - // HACK: dummy names to satisfy unit_race requirements - naming_cfg["id"] = "village_naming"; - naming_cfg["plural_name"] = "villages"; - - const unit_race village_names_generator(naming_cfg); + + // Specify "class" here because we also have a local variable with the same name + boost::shared_ptr village_names_generator; + if(naming_cfg.has_attribute("name_generator")) { + village_names_generator.reset(new context_free_grammar_generator(naming["name_generator"])); + if(!village_names_generator->is_valid()) { + village_names_generator.reset(); + } + } + config::attribute_value markov_list = naming_cfg.get_old_attribute("names", "male_names", + "[village_naming]male_names is deprecated, use names instead"); + if(!markov_list.blank()) { + village_names_generator.reset(new markov_generator(utils::split(markov_list), naming["markov_chain_size"], 12)); + } // First we work out the size of the x and y distance between villages const size_t tiles_per_village = ((width*height)/9)/nvillages; diff --git a/src/generators/default_map_generator_job.hpp b/src/generators/default_map_generator_job.hpp index 964770acff66..02972a1b53d0 100644 --- a/src/generators/default_map_generator_job.hpp +++ b/src/generators/default_map_generator_job.hpp @@ -24,12 +24,13 @@ class unit_race; #include "map/location.hpp" #include "terrain/translation.hpp" #include "serialization/string_utils.hpp" +#include "utils/name_generator.hpp" #include #include +#include #include - class default_map_generator_job { public: @@ -59,7 +60,7 @@ class default_map_generator_job bool generate_lake(t_translation::t_map& terrain, int x, int y, int lake_fall_off, std::set& locs_touched); map_location random_point_at_side(size_t width, size_t height); - std::string generate_name(const unit_race& name_generator, const std::string& id, + std::string generate_name(boost::shared_ptr& name_generator, const std::string& id, std::string* base_name=nullptr, utils::string_map* additional_symbols=nullptr); diff --git a/src/gui/dialogs/unit_create.hpp b/src/gui/dialogs/unit_create.hpp index da0c27c5547a..aa6445ff6087 100644 --- a/src/gui/dialogs/unit_create.hpp +++ b/src/gui/dialogs/unit_create.hpp @@ -17,7 +17,7 @@ #include "gui/dialogs/dialog.hpp" #include "gui/widgets/group.hpp" -#include "race.hpp" +#include "units/race.hpp" #include #include diff --git a/src/help/help_impl.cpp b/src/help/help_impl.cpp index d6088787c141..6fd7d7f10df2 100644 --- a/src/help/help_impl.cpp +++ b/src/help/help_impl.cpp @@ -28,7 +28,7 @@ #include "utils/make_enum.hpp" // for operator<< #include "map/map.hpp" // for gamemap #include "marked-up_text.hpp" // for is_cjk_char, word_wrap_text -#include "race.hpp" // for unit_race, etc +#include "units/race.hpp" // for unit_race, etc #include "resources.hpp" // for tod_manager, config_manager #include "sdl/utils.hpp" // for surface #include "serialization/string_utils.hpp" // for split, quoted_split, etc diff --git a/src/help/help_topic_generators.cpp b/src/help/help_topic_generators.cpp index db4b8b343fca..3acd6e03c4c2 100644 --- a/src/help/help_topic_generators.cpp +++ b/src/help/help_topic_generators.cpp @@ -20,7 +20,7 @@ #include "language.hpp" // for string_table, symbol_table #include "log.hpp" // for LOG_STREAM, logger, etc #include "movetype.hpp" // for movetype, movetype::effects, etc -#include "race.hpp" // for unit_race, etc +#include "units/race.hpp" // for unit_race, etc #include "terrain/terrain.hpp" // for terrain_type #include "terrain/translation.hpp" // for operator==, t_list, etc #include "terrain/type_data.hpp" // for terrain_type_data, etc diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index f8230f4b69b7..1fd63efa9dfc 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -104,6 +104,8 @@ #include "units/ptr.hpp" // for unit_const_ptr, unit_ptr #include "units/types.hpp" // for unit_type_data, unit_types, etc #include "util.hpp" // for lexical_cast +#include "utils/markov_generator.hpp" +#include "utils/context_free_grammar_generator.hpp" #include "variable.hpp" // for vconfig, etc #include "variable_info.hpp" #include "wml_exception.hpp" @@ -4368,6 +4370,69 @@ int game_lua_kernel::intf_toggle_fog(lua_State *L, const bool clear) return 0; } +static int intf_name_generator(lua_State *L) +{ + std::string type = luaL_checkstring(L, 1); + name_generator* gen = nullptr; + if(type == "markov" || type == "markov_chain") { + std::vector input; + if(lua_istable(L, 2)) { + input = lua_check>(L, 2); + } else { + input = utils::parenthetical_split(luaL_checkstring(L, 2)); + } + int chain_sz = luaL_optinteger(L, 3, 2); + int max_len = luaL_optinteger(L, 4, 12); + gen = new(lua_newuserdata(L, sizeof(markov_generator))) + markov_generator(input, chain_sz, max_len); + // Ensure the pointer didn't change when cast + assert(static_cast(gen) == dynamic_cast(gen)); + } else if(type == "context_free" || type == "cfg" || type == "CFG") { + void* buf = lua_newuserdata(L, sizeof(context_free_grammar_generator)); + if(lua_istable(L, 2)) { + std::map> data; + for(lua_pushnil(L); lua_next(L, 2); lua_pop(L, 1)) { + if(!lua_isstring(L, -2)) { + lua_pushstring(L, "CFG generator: invalid nonterminal name (must be a string)"); + return lua_error(L); + } + if(lua_isstring(L, -1)) { + data[lua_tostring(L,-2)] = utils::split(lua_tostring(L,-1),'|'); + } else if(lua_istable(L, -1)) { + data[lua_tostring(L,-2)] = lua_check>(L, -1); + } else { + lua_pushstring(L, "CFG generator: invalid noterminal value (must be a string or list of strings)"); + return lua_error(L); + } + } + if(!data.empty()) { + gen = new(buf) context_free_grammar_generator(data); + } + } else { + gen = new(buf) context_free_grammar_generator(luaL_checkstring(L, 2)); + } + if(gen) { + assert(static_cast(gen) == dynamic_cast(gen)); + } + } else { + return luaL_argerror(L, 1, "should be either 'markov_chain' or 'context_free'"); + } + static const char*const generic_err = "error initializing name generator"; + if(!gen) { + lua_pushstring(L, generic_err); + return lua_error(L); + } + // We set the metatable now, even if the generator is invalid, so that it + // will be properly collected if it was invalid. + luaL_getmetatable(L, "name generator"); + lua_setmetatable(L, -2); + if(!gen->is_valid()) { + lua_pushstring(L, generic_err); + return lua_error(L); + } + return 1; +} + // END CALLBACK IMPLEMENTATION game_board & game_lua_kernel::board() { @@ -4450,6 +4515,7 @@ game_lua_kernel::game_lua_kernel(CVideo * video, game_state & gs, play_controlle { "get_traits", &intf_get_traits }, { "get_viewing_side", &intf_get_viewing_side }, { "modify_ai", &intf_modify_ai }, + { "name_generator", &intf_name_generator }, { "set_music", &intf_set_music }, { "transform_unit", &intf_transform_unit }, { "unit_ability", &intf_unit_ability }, diff --git a/src/scripting/lua_race.cpp b/src/scripting/lua_race.cpp index 5eebd99e74c4..8d8e6a36d53f 100644 --- a/src/scripting/lua_race.cpp +++ b/src/scripting/lua_race.cpp @@ -14,9 +14,10 @@ #include "scripting/lua_race.hpp" -#include "race.hpp" +#include "units/race.hpp" #include "scripting/lua_common.hpp" #include "units/types.hpp" +#include "utils/name_generator.hpp" #include @@ -30,6 +31,7 @@ // Registry key static const char * Race = "race"; +static const char * Gen = "name generator"; /** * Gets some data on a race (__index metamethod). @@ -71,7 +73,35 @@ static int impl_race_get(lua_State* L) } return 1; } + if (strcmp(m, "male_name_gen") == 0) { + new(lua_newuserdata(L, sizeof(proxy_name_generator))) + proxy_name_generator(race.generator(unit_race::MALE)); + luaL_getmetatable(L, Gen); + lua_setmetatable(L, -2); + return 1; + } + if (strcmp(m, "female_name_gen") == 0) { + new(lua_newuserdata(L, sizeof(proxy_name_generator))) + proxy_name_generator(race.generator(unit_race::FEMALE)); + luaL_getmetatable(L, Gen); + lua_setmetatable(L, -2); + return 1; + } + + return 0; +} + +static int impl_name_generator_call(lua_State *L) +{ + name_generator* gen = static_cast(lua_touserdata(L, 1)); + lua_pushstring(L, gen->generate().c_str()); + return 1; +} +static int impl_name_generator_collect(lua_State *L) +{ + name_generator* gen = static_cast(lua_touserdata(L, 1)); + gen->~name_generator(); return 0; } @@ -89,6 +119,14 @@ namespace lua_race { lua_pushstring(L, "race"); lua_setfield(L, -2, "__metatable"); + + luaL_newmetatable(L, Gen); + static luaL_Reg const generator[] = { + { "__call", &impl_name_generator_call}, + { "__gc", &impl_name_generator_collect}, + { nullptr, nullptr} + }; + luaL_setfuncs(L, generator, 0); return "Adding getrace metatable...\n"; } diff --git a/src/units/race.cpp b/src/units/race.cpp new file mode 100644 index 000000000000..4f2a02400ccb --- /dev/null +++ b/src/units/race.cpp @@ -0,0 +1,168 @@ +/* + Copyright (C) 2003 - 2016 by David White + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +/** + * @file + * Generate race-specific unit-names. + */ + +#include "global.hpp" + +#include "units/race.hpp" + +#include "log.hpp" +#include "serialization/string_utils.hpp" +#include "serialization/unicode_cast.hpp" +#include "utils/markov_generator.hpp" +#include "utils/context_free_grammar_generator.hpp" + +/// Dummy race used when a race is not yet known. +const unit_race unit_race::null_race; +/// Standard string id (not translatable) for FEMALE +const std::string unit_race::s_female("female"); +/// Standard string id (not translatable) for MALE +const std::string unit_race::s_male("male"); + + +static const config &empty_traits() { + static config cfg; + return cfg; +} + +static const config &empty_topics() { + static config cfg; + return cfg; +} + +unit_race::unit_race() : + cfg_(), + id_(), + plural_name_(), + description_(), + ntraits_(0), + traits_(empty_traits().child_range("trait")), + topics_(empty_topics().child_range("topic")), + global_traits_(true), + undead_variation_() +{ + name_[MALE] = ""; + name_[FEMALE] = ""; +} + +unit_race::unit_race(const config& cfg) : + cfg_(cfg), + id_(cfg["id"]), + plural_name_(cfg["plural_name"].t_str()), + description_(cfg["description"].t_str()), + ntraits_(cfg["num_traits"]), + traits_(cfg.child_range("trait")), + topics_(cfg.child_range("topic")), + global_traits_(!cfg["ignore_global_traits"].to_bool()), + undead_variation_(cfg["undead_variation"]) + +{ + if (id_.empty()) { + lg::wml_error() << "[race] '" << cfg["name"] << "' is missing an id field."; + } + if (plural_name_.empty()) { + lg::wml_error() << "[race] '" << cfg["name"] << "' is missing a plural_name field."; + plural_name_ = (cfg["name"]); + } + // use "name" if "male_name" or "female_name" aren't available + name_[MALE] = cfg["male_name"]; + if(name_[MALE].empty()) { + name_[MALE] = (cfg["name"]); + } + name_[FEMALE] = cfg["female_name"]; + if(name_[FEMALE].empty()) { + name_[FEMALE] = (cfg["name"]); + } + + config::attribute_value male_generator = cfg["male_name_generator"]; + config::attribute_value female_generator = cfg["female_name_generator"]; + if(male_generator.blank()) { + male_generator = cfg["name_generator"]; + } + if(female_generator.blank()) { + female_generator = cfg["name_generator"]; + } + + if(!male_generator.blank()) { + name_generator_[MALE].reset(new context_free_grammar_generator(male_generator)); + if(!name_generator_[MALE]->is_valid()) { + name_generator_[MALE].reset(); + } + } + if(!female_generator.blank()) { + name_generator_[FEMALE].reset(new context_free_grammar_generator(female_generator)); + if(!name_generator_[FEMALE]->is_valid()) { + name_generator_[FEMALE].reset(); + } + } + + int chain_size = cfg["markov_chain_size"].to_int(2); + if(!name_generator_[MALE]) { + name_generator_[MALE].reset(new markov_generator(utils::split(cfg["male_names"]), chain_size, 12)); + } + if(!name_generator_[FEMALE]) { + name_generator_[FEMALE].reset(new markov_generator(utils::split(cfg["female_names"]), chain_size, 12)); + } +} + +std::string unit_race::generate_name(unit_race::GENDER gender) const +{ + return name_generator_[gender]->generate(); +} + +const name_generator& unit_race::generator(unit_race::GENDER gender) const +{ + return *name_generator_[gender]; +} + +bool unit_race::uses_global_traits() const +{ + return global_traits_; +} + +const config::const_child_itors &unit_race::additional_traits() const +{ + return traits_; +} + +const config::const_child_itors &unit_race::additional_topics() const +{ + return topics_; +} + +unsigned int unit_race::num_traits() const { return ntraits_; } + + +std::string const& gender_string(unit_race::GENDER gender) { + switch(gender) { + case unit_race::FEMALE: + return unit_race::s_female; + default: + case unit_race::MALE: + return unit_race::s_male; + } +} + +unit_race::GENDER string_gender(const std::string& str, unit_race::GENDER def) { + if ( str == unit_race::s_male ) { + return unit_race::MALE; + } else if ( str == unit_race::s_female ) { + return unit_race::FEMALE; + } + return def; +} diff --git a/src/race.hpp b/src/units/race.hpp similarity index 87% rename from src/race.hpp rename to src/units/race.hpp index 07b81491d1bc..0cf1bf7f4133 100644 --- a/src/race.hpp +++ b/src/units/race.hpp @@ -16,10 +16,8 @@ #define RACE_HPP_INCLUDED #include "config.hpp" -#include "serialization/unicode_types.hpp" -#include "utils/context_free_grammar_generator.hpp" - -typedef std::map markov_prefix_map; +#include "utils/name_generator.hpp" +#include class unit_race { @@ -38,6 +36,7 @@ class unit_race const t_string& description() const { return description_; } std::string generate_name(GENDER gender) const; + const name_generator& generator(GENDER gender) const; bool uses_global_traits() const; @@ -60,9 +59,7 @@ class unit_race t_string plural_name_; t_string description_; unsigned int ntraits_; - markov_prefix_map next_[NUM_GENDERS]; - int chain_size_; - context_free_grammar_generator name_generator_[NUM_GENDERS]; + boost::shared_ptr name_generator_[NUM_GENDERS]; config::const_child_itors traits_; config::const_child_itors topics_; diff --git a/src/units/types.hpp b/src/units/types.hpp index f9a9c86a6f33..fdbf229cd9a4 100644 --- a/src/units/types.hpp +++ b/src/units/types.hpp @@ -18,7 +18,7 @@ #include "utils/make_enum.hpp" #include "map/location.hpp" #include "movetype.hpp" -#include "race.hpp" +#include "units/race.hpp" #include "units/attack_type.hpp" #include "util.hpp" diff --git a/src/utils/context_free_grammar_generator.cpp b/src/utils/context_free_grammar_generator.cpp index f9733bb185ef..07ae12822067 100644 --- a/src/utils/context_free_grammar_generator.cpp +++ b/src/utils/context_free_grammar_generator.cpp @@ -19,21 +19,20 @@ */ #include "context_free_grammar_generator.hpp" -#include "../log.hpp" -#include "../random_new.hpp" -context_free_grammar_generator::context_free_grammar_generator() : - initialized_(false) -{ +#include "log.hpp" +#include "random_new.hpp" +#include "serialization/string_utils.hpp" -} +#include context_free_grammar_generator::~context_free_grammar_generator() { - } -bool context_free_grammar_generator::constructFromString(const std::string &source) { +context_free_grammar_generator::context_free_grammar_generator(const std::string& source) : + initialized_(false) +{ const char* reading = source.c_str(); nonterminal* current = nullptr; std::vector* filled = nullptr; @@ -53,7 +52,7 @@ bool context_free_grammar_generator::constructFromString(const std::string &sour } else if (*reading == '|') { if (!filled || !current) { lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced | symbol"; - return false; + return; } filled->push_back(buf); current->possibilities_.push_back(std::vector()); @@ -69,7 +68,7 @@ bool context_free_grammar_generator::constructFromString(const std::string &sour if (*reading == '{') { if (!filled) { lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced { symbol"; - return false; + return; } filled->push_back(buf); buf.clear(); @@ -77,7 +76,7 @@ bool context_free_grammar_generator::constructFromString(const std::string &sour if (*reading == '}') { if (!filled) { lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced } symbol"; - return false; + return; } filled->push_back(buf); buf.clear(); @@ -88,7 +87,43 @@ bool context_free_grammar_generator::constructFromString(const std::string &sour if (filled) filled->push_back(buf); initialized_ = true; - return true; +} + +context_free_grammar_generator::context_free_grammar_generator(const std::map>& source) : + initialized_(false) +{ + for(auto rule : source) { + std::string key = rule.first; // Need to do this because utils::strip is mutating + key = utils::strip(key); + std::string buf; + for(std::string str : rule.second) { + nonterminals_[key].possibilities_.emplace_back(); + std::vector* filled = &nonterminals_[key].possibilities_.back(); + // A little code duplication here... + for(char c : str) { + if (c == '{') { + if (!filled) { + lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced { symbol"; + return; + } + filled->push_back(buf); + buf.clear(); + } + else if (c == '}') { + if (!filled) { + lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced } symbol"; + return; + } + filled->push_back('{' + utils::strip(buf)); + buf.clear(); + } else buf.push_back(c); + } + if(!buf.empty()) { + filled->push_back(buf); + } + } + } + initialized_ = true; } std::string context_free_grammar_generator::print_nonterminal(const std::string& name, uint32_t* seed, short seed_pos) const { diff --git a/src/utils/context_free_grammar_generator.hpp b/src/utils/context_free_grammar_generator.hpp index a4465fbc8ac2..4eb73f0fe11e 100644 --- a/src/utils/context_free_grammar_generator.hpp +++ b/src/utils/context_free_grammar_generator.hpp @@ -15,12 +15,14 @@ #ifndef CONTEXT_FREE_GRAMMAR_GENERATOR_INCLUDED #define CONTEXT_FREE_GRAMMAR_GENERATOR_INCLUDED +#include "utils/name_generator.hpp" + #include #include #include #include -class context_free_grammar_generator +class context_free_grammar_generator : public name_generator { private: @@ -36,26 +38,27 @@ class context_free_grammar_generator static const short unsigned int seed_size = 20; public: - /** Default constructor */ - context_free_grammar_generator(); - /** Initialisation * @param source the definition of the context-free grammar to use - * @returns if the operation was successful */ - bool constructFromString(const std::string& source); + context_free_grammar_generator(const std::string& source); + + /** Initialisation + * @param source A map of nonterminals to lists of possibilities + */ + context_free_grammar_generator(const std::map>& source); /** Generates a possible word in the grammar set before - * @returns the word + * @return the word */ - std::string generate() const; + std::string generate() const override; ~context_free_grammar_generator(); /** Checks if the object is initialized - * @returns if it is initialized + * @return if it is initialized */ - bool is_initialized() const {return initialized_; } + bool is_valid() const override {return initialized_; } }; #endif diff --git a/src/race.cpp b/src/utils/markov_generator.cpp similarity index 52% rename from src/race.cpp rename to src/utils/markov_generator.cpp index bde33dfadab9..74df070eb62b 100644 --- a/src/race.cpp +++ b/src/utils/markov_generator.cpp @@ -17,33 +17,11 @@ * Generate race-specific unit-names. */ -#include "global.hpp" +#include "markov_generator.hpp" -#include "race.hpp" - -#include "log.hpp" -#include "serialization/string_utils.hpp" #include "serialization/unicode_cast.hpp" #include "random_new.hpp" -/// Dummy race used when a race is not yet known. -const unit_race unit_race::null_race; -/// Standard string id (not translatable) for FEMALE -const std::string unit_race::s_female("female"); -/// Standard string id (not translatable) for MALE -const std::string unit_race::s_male("male"); - - -static const config &empty_traits() { - static config cfg; - return cfg; -} - -static const config &empty_topics() { - static config cfg; - return cfg; -} - static void add_prefixes(const ucs4::string& str, size_t length, markov_prefix_map& res) { for(size_t i = 0; i <= str.size(); ++i) { @@ -145,118 +123,15 @@ static ucs4::string markov_generate_name(const markov_prefix_map& prefixes, return originalRes; } -unit_race::unit_race() : - cfg_(), - id_(), - plural_name_(), - description_(), - ntraits_(0), - chain_size_(0), - traits_(empty_traits().child_range("trait")), - topics_(empty_topics().child_range("topic")), - global_traits_(true), - undead_variation_() -{ - name_[MALE] = ""; - name_[FEMALE] = ""; -} - -unit_race::unit_race(const config& cfg) : - cfg_(cfg), - id_(cfg["id"]), - plural_name_(cfg["plural_name"].t_str()), - description_(cfg["description"].t_str()), - ntraits_(cfg["num_traits"]), - chain_size_(cfg["markov_chain_size"]), - traits_(cfg.child_range("trait")), - topics_(cfg.child_range("topic")), - global_traits_(!cfg["ignore_global_traits"].to_bool()), - undead_variation_(cfg["undead_variation"]) - -{ - if (id_.empty()) { - lg::wml_error() << "[race] '" << cfg["name"] << "' is missing an id field."; - } - if (plural_name_.empty()) { - lg::wml_error() << "[race] '" << cfg["name"] << "' is missing a plural_name field."; - plural_name_ = (cfg["name"]); - } - // use "name" if "male_name" or "female_name" aren't available - name_[MALE] = cfg["male_name"]; - if(name_[MALE].empty()) { - name_[MALE] = (cfg["name"]); - } - name_[FEMALE] = cfg["female_name"]; - if(name_[FEMALE].empty()) { - name_[FEMALE] = (cfg["name"]); - } - - if (cfg.has_attribute("male_name_generator")) { - name_generator_[MALE].constructFromString(cfg["male_name_generator"]); - } - if (cfg.has_attribute("female_name_generator")) { - name_generator_[FEMALE].constructFromString(cfg["female_name_generator"]); - } - if (cfg.has_attribute("name_generator")) { - if (!name_generator_[MALE].is_initialized()) { - name_generator_[MALE].constructFromString(cfg["name_generator"]); - } - if (!name_generator_[FEMALE].is_initialized()) { - name_generator_[FEMALE].constructFromString(cfg["name_generator"]); - } - } - - if(chain_size_ <= 0) - chain_size_ = 2; - - //std::vector names = ; - next_[MALE] = markov_prefixes(utils::split(cfg["male_names"]), chain_size_); - next_[FEMALE] = markov_prefixes(utils::split(cfg["female_names"]), chain_size_); -} - -std::string unit_race::generate_name( - unit_race::GENDER gender) const -{ - if (name_generator_[gender].is_initialized()) { - return name_generator_[gender].generate(); - } - return unicode_cast( - markov_generate_name(next_[gender], chain_size_, 12)); -} - -bool unit_race::uses_global_traits() const -{ - return global_traits_; -} - -const config::const_child_itors &unit_race::additional_traits() const +markov_generator::markov_generator(const std::vector& items, size_t chain_size, size_t max_len) + : prefixes_(markov_prefixes(items, chain_size)) + , chain_size_(chain_size) + , max_len_(max_len) { - return traits_; } -const config::const_child_itors &unit_race::additional_topics() const +std::string markov_generator::generate() const { - return topics_; -} - -unsigned int unit_race::num_traits() const { return ntraits_; } - - -std::string const& gender_string(unit_race::GENDER gender) { - switch(gender) { - case unit_race::FEMALE: - return unit_race::s_female; - default: - case unit_race::MALE: - return unit_race::s_male; - } -} - -unit_race::GENDER string_gender(const std::string& str, unit_race::GENDER def) { - if ( str == unit_race::s_male ) { - return unit_race::MALE; - } else if ( str == unit_race::s_female ) { - return unit_race::FEMALE; - } - return def; + ucs4::string name = markov_generate_name(prefixes_, chain_size_, max_len_); + return unicode_cast(name); } diff --git a/src/utils/markov_generator.hpp b/src/utils/markov_generator.hpp new file mode 100644 index 000000000000..ba58d1760f4b --- /dev/null +++ b/src/utils/markov_generator.hpp @@ -0,0 +1,32 @@ +/* + Copyright (C) 2003 - 2016 by David White + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +#ifndef MARKOV_GENERATOR_HPP_INCLUDED +#define MARKOV_GENERATOR_HPP_INCLUDED + +#include "serialization/unicode_types.hpp" +#include "utils/name_generator.hpp" +#include + +typedef std::map markov_prefix_map; + +class markov_generator : public name_generator { + markov_prefix_map prefixes_; + size_t chain_size_, max_len_; +public: + markov_generator(const std::vector& items, size_t chain_size, size_t max_len); + std::string generate() const override; +}; + +#endif diff --git a/src/utils/name_generator.hpp b/src/utils/name_generator.hpp new file mode 100644 index 000000000000..d82ca1ba3e1a --- /dev/null +++ b/src/utils/name_generator.hpp @@ -0,0 +1,35 @@ +/* + Copyright (C) 2003 - 2016 by David White + Part of the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +#ifndef NAME_GENERATOR_HPP_INCLUDED +#define NAME_GENERATOR_HPP_INCLUDED + +#include + +class name_generator { +public: + virtual std::string generate() const = 0; + virtual bool is_valid() const {return true;} + virtual ~name_generator() {} +}; + +class proxy_name_generator : public name_generator { + const name_generator& base; +public: + proxy_name_generator(const name_generator& b) : base(b) {} + std::string generate() const override {return base.generate();} + bool is_valid() const override {return base.is_valid();} +}; + +#endif From afb85a2000652e0bc16e8a825172c84bfc586d42 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 15 Apr 2016 14:16:40 -0400 Subject: [PATCH 229/240] Context-free generator: Strip whitespace in nonterminals This means that whitespace in the following positions is now ignored: - At the beginning of a line - Preceding the = or } character - Following the { character All other whitespace is still significant. --- src/utils/context_free_grammar_generator.cpp | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/src/utils/context_free_grammar_generator.cpp b/src/utils/context_free_grammar_generator.cpp index 07ae12822067..9304f95e5c55 100644 --- a/src/utils/context_free_grammar_generator.cpp +++ b/src/utils/context_free_grammar_generator.cpp @@ -40,11 +40,13 @@ context_free_grammar_generator::context_free_grammar_generator(const std::string while (*reading != 0) { if (*reading == '=') { - current = &nonterminals_[buf]; + // Leading and trailing whitespace is not significant, but internal whitespace is + current = &nonterminals_[utils::strip(buf)]; current->possibilities_.push_back(std::vector()); filled = ¤t->possibilities_.back(); buf.clear(); } else if (*reading == '\n') { + // All whitespace is significant after the = if (filled) filled->push_back(buf); filled = nullptr; current = nullptr; @@ -73,12 +75,12 @@ context_free_grammar_generator::context_free_grammar_generator(const std::string filled->push_back(buf); buf.clear(); } - if (*reading == '}') { + else if (*reading == '}') { if (!filled) { lg::wml_error() << "[context_free_grammar_generator] Parsing error: misplaced } symbol"; return; } - filled->push_back(buf); + filled->push_back('{' + utils::strip(buf)); buf.clear(); } else buf.push_back(*reading); } From c50e941af76fef4869803f69e24348f4e64354bd Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 15 Apr 2016 14:16:54 -0400 Subject: [PATCH 230/240] Use a mutable field instead of const_cast --- src/utils/context_free_grammar_generator.cpp | 2 +- src/utils/context_free_grammar_generator.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/utils/context_free_grammar_generator.cpp b/src/utils/context_free_grammar_generator.cpp index 9304f95e5c55..47538a394d7d 100644 --- a/src/utils/context_free_grammar_generator.cpp +++ b/src/utils/context_free_grammar_generator.cpp @@ -142,7 +142,7 @@ std::string context_free_grammar_generator::print_nonterminal(const std::string& picked = seed[seed_pos++] % got.possibilities_.size(); if (seed_pos >= seed_size) seed_pos = 0; } - const_cast(got.last_) = picked; /* The variable last_ can change, the rest must stay const */ + got.last_ = picked; const std::vector& used = got.possibilities_[picked]; for (unsigned int i = 0; i < used.size(); i++) { if (used[i][0] == '{') result += print_nonterminal(used[i].substr(1), seed, seed_pos); diff --git a/src/utils/context_free_grammar_generator.hpp b/src/utils/context_free_grammar_generator.hpp index 4eb73f0fe11e..8d860381c6e5 100644 --- a/src/utils/context_free_grammar_generator.hpp +++ b/src/utils/context_free_grammar_generator.hpp @@ -29,7 +29,7 @@ class context_free_grammar_generator : public name_generator struct nonterminal { nonterminal() : last_(1) {} std::vector > possibilities_; - unsigned int last_; + mutable unsigned int last_; }; std::map nonterminals_; From 6b8b83c90daf991421ff96021aa5709ecb39cbf0 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Fri, 15 Apr 2016 14:17:42 -0400 Subject: [PATCH 231/240] Female names grammar for the Khalifate (Loosely based on a list of female Arabic names from behindthename.com) --- data/core/macros/names.cfg | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/data/core/macros/names.cfg b/data/core/macros/names.cfg index a06301d8d2f9..029d6f5e446a 100644 --- a/data/core/macros/names.cfg +++ b/data/core/macros/names.cfg @@ -132,7 +132,7 @@ centre_v=na|lla|na|ry|li|ni|ri|rae|bry #define KHALIFATE_NAMES male_names=_ "Aban,Abbas,Abbud,Abdul-ʿAdl,Abdul-Ahad,Abdul-Alim,Abdul-Aliyy,Abdul-Azim,Abdul-Aziz,Abdul-Badi,Abdul-Baʿith,Abdul-Baqi,Abdul-Bari,Abdul-Barr,Abdul-Basir,Abdul-Basit,Abdul-Fattah,Abdul-Ghaffar,Abdul-Ghafur,Abdul-Ghani,Abdul-Hadi,Abdul-Hafiz,Abdul-Hakam,Abdul-Hakim,Abdul-Halim,Abdul-Hamid,Abdul-Haqq,Abdul-Hasib,Abdul-Hayy,Abdul-Jabbar,Abdul-Jalil,Abdul-Karim,Abdul-Khabir,Abdul-Khaliq,Abdul-Latif,Abdul-Malik,Abdul-Majid,Abdul-Matin,Abdul-Mubdiʾ,Abdul-Mughni,Abdul-Muhaimin,Abdul-Muhsi,Abdul-Muhyi,Abdul-Muʿid,Abdul-Muʿizz,Abdul-Mujib,Abdul-Mumin,Abdul-Muqaddim,Abdul-Muqtadir,Abdul-Musawwir,Abdul-Mutaʿal,Abdul-Nafi,Abdul-Nasser,Abdul-Nasir,Abdul-Nur,Abdul-Qadir,Abdul-Qahhar,Abdul-Qawi,Abdul-Qayyum,Abdul-Quddus,Abdul-Rafi,Abdul-Rahim,Abdul-Rahman,Abdul-Rashid,Abdul-Raʿuf,Abdul-Razzaq,Abdul-Shakur,Abdul-Tawwab,Abdul-Wadud,Abdul-Wahhab,Abdul-Wahid,Abdul-Wajid,Abdul-Wakil,Abdul-Wali,Abdul-Waliy,Abdul-Warith,Abdul-Zahir,Abdullah,ʿAbid,ʿAbidin,Abu Bakr,Aby al-Khayr,Adil,Adham,Adib,ʿAdli,ʿAdnan,ʿAfif,Ahmad,ʿAjib,ʿAkif,Akil,Akram,Alaʾ,Alaʾ al-Din,Alʿ Abbas,Aladdin,al-Bara,al-Hakam,al-Harith,Alhasan,Alhusain,Ali,Alim,Almahdi,al-Safi,Altaf,Altair,al-Tayyib,al-Tijani,al-Tufail,Amid,ʿAmid,Amin,Amir,ʿAmir,Amjad,ʿAmmar,ʿAmro,Anas,Anis,ʿAntarah,Anwar,ʿAqil,Arfan,Arif,ʿArif,Asad,Asʿad,Asadel,Ashraf,Asif,ʿAsim,Aswad,Ataʿ,Ataʿ Allah,Ataʿ al-Rahman,Athil,Athir,ʿAtif,ʿAwad,ʿAwf,Aws,Awwab,Ayham,Ayman,Ayser,Ayyub,Aza,ʿAzab,Azhar,Azim,ʿAziz,ʿAzzam,Badi,Badi al-Zaman,Badr,Badr al-Din,Badri,Bahaʿ,Bahiyy al-Din,Bahij,Bahir,Bakr,Bakri,Baligh,Bandar,Barakah,Barir,Bashshar,Basil,Basim,Bassam,Bayezid,Bayhas,Bilal,Bishr,Boulos,Budail,Burhan,Bushr,Butrus,Dabir,Dani,Darwish,Daʿud,Dhakir,Dhakiy,Dhakwan,Dhul Fiqar,Dirar,Diya,Diya al-Din,Duqaq,Fadi,Fadil,Fadl,Fadl Allah,Fahd,Fahad,Fahmi,Faisal,Faʿiz,Fakhir,Fakhr al-Din,Fakhri,Fakih,Falah,Falih,Faraj,Farhan,Farid,Fariq,Fariq,Faris,Faruq,Fath,Fathi,Fatih,Fatin,Fawwaz,Fawzan,Fawzi,Fayyad,Ferran,Fida,Fikri,Firas,Fuʿad,Fudail,Gamal,Ghayth,Ghali,Ghalib,Ghanim,Ghassan,Ghawth,Ghazwan,Ghiyath,Habbab,Habib,Haddad,Hadi,Hafiz,Hakem,Hakim,Halim,Hamal,Hamas,Hamdan,Hamdi,Hamid,Hamim,Hamzah,Hana,Hanaʾi,Hanbal,Hani,Hanif,Hannad,Haris,Harith,Harun,Hashim,Hassan,Hatim,Haydar,Haytham,Hayyan,Hazim,Hilal,Hilmi,Hisham,Hud,Hudad,Hudhafah,Hudhayfah,Humam,Hussein,Husam,Husam al-Din,Ibrahim,ʿId,Idris,Ihsan,Ihtisham,ʿIkrimah,Ilias,ʿImad,Imad al-Din,Imran,Imtiyaz,Inʿam,Iqbal,ʿIrfan,ʿIsa,ʿIsam,Ishaq,Ismaʿil,Iyad,Iyas,Izz al-Din,Jabbar,Jabr,Jabir,Jad Allah,Jaʿfar,Jal,Jalal,Jalal al-Din,Jalil,Jamal,Jamal al-Din,Jamil,Jarir,Jasim,Jaul,Jaun,Jawad,Jawdah,Jawhar,Jibran,Jibril,Jubair,Jul,Jumah,Junayd,Juwain,Kadar,Kadin,Kadir,Kahil,Kaliq,Kamal,Kamil,Karam,Kardal,Karif,Karim,Kasib,Kasim,Katib,Kazim,Khalaf,Khaldun,Khalid,Khalil,Khalil al-Allah,Khalis,Khatib,Khair al-Din,Khairi,Khoury,Khulus,Khuzaymah,Kutaiba,Labib,Lablab,Latif,Layth,LuʿayLubayd,Luqman,Lut,Lutfi,Maʿd,Madani,Mahbub,Mahdi,Mahfuz,Mahir,Mahjub,Mahmud,Mahrus,Maimun,Majd,Majdy,Majd al-Din,Majid,Makin,Malik,Mamduh,Maʿmun,Maʿin,Mandhur,Mansur,Marghub,Marid,Maʿruf,Marwan,Marzuq,Mashʿal,Mashhur,Masrur,Masʿud,Masun,Maysarah,Mazhar,Mazin,Mehmed,Mihran,Mihyar,Mikaʾil,Miqdad,Misbah,Mishʿal,Miyaz,Muʾadh,Muʾawiyah,Muʾayyad,Mubarak,Mubin,Mudar,Muddaththir,Mufid,Muflih,Muhab,Muhayr,Muhammad,Muhanna,Muhannad,Muhib,Muhibb,Muhsin,Muhtadi,Muhyi al-Din,Muʿin,Muʿizz,Mujab,Mujahid,Mukarram,Mukhlis,Mukhtar,Mulham,Mulhim,Muʿmmar,Muʿmin,Mumtaz,Munahid,Mundhir,Munib,Munif,Munir,Muʿnis,Munjid,Munsif,Muntasir,Murad,Murid,Murshid,Murtada,Musa,Musʿab,Musaʿid,Mushtaq,Muslih,Muslim,Mutafa,Mutaʾ,Muʿtasim,Mutawalli,Muʿtazz,Muthanna,Muti,Muwaffaq,Muyassar,Muzaffar,Mussammil,Nabhan,Nabighah,Nabih,Nabil,Nadhir,Nadim,Nadir,Nafiʾ,Nahid,Naʾil,Naʾim,Naji,Najib,Najid,Najjar,Najm al-Din,Naʿaman,Namir,Nashʿah,Nashʿat,Nashwan,Nasib,Nasih,Nasim,Nasir,Nasir al-Din,Nasr,Nasri,Nasuh,Nawaf,Nawfal,Nayif,Nazih,Nazim,Nazmi,Nibras,Nidal,Nijad,Nimr,Nizar,Nuʿaym,Nuh,Nuhayd,Numair,Nuʿman,Nur al-Din,Nuri,Nusrah,Nusrat,Omar,Orhan,Osman,Qasim,Qays,Qudamah,Qusay,Qatadah,Qutaybah,Qutb,Qutuz,Rabah,Rabi,Radi,Rafi,Rafid,Rafiq,Raghib,Rahman,Raʿid,Raʿif,Rais,Rajaa,Rajab,Raji,Rajih,Rakin,Rami,Ramih,Ramiz,Ramzi,Rani,Rashad,Rashid,Rasil,Rasin,Rasmi,Rasul,Ratib,Raʿuf,Rayhan,Rayyan,Razin,Ridha,Ridwan,Rihab,Riyad,Rizq,Ruhi,Rushd,Rushdi,Ruwayd,Saad,Saʿadah,Sab,Sabih,Sabir,Sabri,Saʿd,Saʿd al-Din,Sadad,Sadid,Sadiq,Saʿdun,Saʿid,Safi,Safiy,Safiy al-Din,Safuh,Safwah,Safwat,Safwan,Sahib,Sahir,Sahl,Saʾib,Saif,Saif al-Din,Sajid,Sajjad,Sakhr,Salah,Salah al-Din,Salamah,Salih,Salim,Salman,Sami,Samih,Samir,Samman,Saqr,Sariyah,Sati,Saud,Sayyid,Shaʿban,Shadi,Shadin,Shafi,Shafiq,Shahid,Shahin,Shahir,Shakib,Shakir,Shams al-Din,Shamal,Shamil,Shamim,Sharaf,Sharif,Shawqi,Shihab,Shihab al-Din,Shihad,Shuʿayb,Shukri,Shumayl,Siddiq,Sinan,Siraj,Siraj al-Din,Sofian,Subhi,Sufyan,Suhayb,Suhayl,Suhaym,Sulaiman,Sumrah,Suraqah,Suʿud,Tahir,Tahsin,Taym Allah,Taj,Taj al-Din,Talal,Talib,Tamim,Tamir,Tamam,Tammam,Taqiy,Tarif,Tariq,Taslim,Tawfiq,Tawhid,Taymullah,Taysir,Tayyib,Thabit,Thamir,Thaqib,Thawab,Thawban,ʿUbaidah,Ubaid,Ubayy,ʿUdayl,ʿUday,ʿUmar,Umarah,Umair,ʾaUrwah,Usaym,Usama,ʿUtbah,Uthal,Uthman,Waddah,Wadi,Wadid,Wafiq,Wahab,Wahhab,Wahid,Waʾil,Wajdi,Wajid,Wajih,Wakil,Walid,Walif,Waliy Allah,Waliy al-Din,Waqar,Waqqas,Ward,Wasif,Wasil,Wasim,Wazir,Yahya,Yaman,Yaʿqub,Yasar,Yasin,Yasir,Yazan,Yazid,Yunus,Yushua,Yusri,Yusuf,Zafar,Zafir,Zahid,Zahir,Zayd,Zaim,Zayn,Zarif,Zakarriya,Zaki,Zakwan,Ziyad,Zubayr,Zuhayr" - name_generator= _ << + male_name_generator= _ << main={name_long}|{prefix}{suffix}|{name_mid}{connector}{name_mid} name_mid={prefix}{suffix}|{name_short} name_long={prefix}{suffix}|{prefix}{centre}{suffix} @@ -140,8 +140,24 @@ name_short=Din|Sif|Din|Taj|Sud|Ali|Lut|Nuh|Qays|Nimr|Jad|Bushr|Lut|Maʿd|Nur|Fad prefix=Ab|Bas|Fat|Gha|Al|Ba|Ja|Ha|Mu|Ra|Raz|Abi|Am|La|ʿAj|Ala|ʿAk|Fa|Du|Im|Ju|Mun|Ma|Ni|Ji|Mu|Lab|Luf|Mih|Mi|Qu|Tal|Ta|Tha|Za|Zi|Yas|Wa|Su|Qa|ʿIkri|Lu|Su|Osa|Rag|Saf|Da|Fay|Nib|Nash suffix=af|al|lih|bair|sur|bi|lah|at|sim|ma|ih|yl|iq|raj|mam|man|ya|zid|riya|ail|air|ah|en|in|ayd|ud|rah|wah|nan|as|ir|ba|ni|yad|ras|zuq|hid|mal|kib connector= al-| bin | ibn -centre=ʿ|{centre_syllabe} -centre_syllabe=hi|sa|kar|da|na|ja|tay|ki|hai|saw +centre=ʿ|ʾ|hi|sa|kar|da|na|ja|tay|ki|hai|saw +>> + female_name_generator= _ << +main={name_long}|{prefix}{suffix}|{name_mid}{connector}{surname} +name_mid={prefix}{suffix}|{name_short} +surname={name_mid_male}|{name_mid}|{name_mid_male} +name_long={prefix}{suffix}|{prefix}{centre}{suffix} +name_short=Afaf|Aida|Alya|Arij|Arwa|Asma|Asra|Azra|Dua|Fajr|Hala|Hana|Hiba|Inas|Isra|Lina|Mona|Muna|Nida|Nima|Nur|Rana|Rim|Ruba|Ruya|Ruwa|Sana|Sara|Suha|Tuba|Uzma|Zara +prefix=Ab|Bas|Fat|Gha|Al|Ba|Ja|Ha|Mu|Ra|Raz|Abi|Am|La|ʿAj|Ala|ʿAk|Fa|Du|Im|Ju|Mun|Ma|Ni|Ji|Mu|Lab|Luf|Mih|Mi|Qu|Tal|Ta|Tha|Za|Zi|Yas|Wa|Su|Qa|ʿIkri|Lu|Su|Osa|Rag|Saf|Da|Fay|Nib|Nash +suffix=a|ab|ad|ah|af|aj|al|am|an|ar|as|at|ay|az|da|een|ia|ij|in|ir|la|ma|mas|n|na|nab|ni|r|ra|raa|ran|rat|ul|ur|uz|wa|ya|yah|yam|za|zi +connector= al-| ibna | bint +centre=ʿ|ʾ|hi|sa|kar|da|na|ja|tay|ki|hai|saw + +These nonterminals are literally copied from the male names. +name_mid_male={prefix_male}{suffix_male}|{name_short_male} +name_short_male=Din|Sif|Din|Taj|Sud|Ali|Lut|Nuh|Qays|Nimr|Jad|Bushr|Lut|Maʿd|Nur|Fadl +prefix_male=Ab|Bas|Fat|Gha|Al|Ba|Ja|Ha|Mu|Ra|Raz|Abi|Am|La|ʿAj|Ala|ʿAk|Fa|Du|Im|Ju|Mun|Ma|Ni|Ji|Mu|Lab|Luf|Mih|Mi|Qu|Tal|Ta|Tha|Za|Zi|Yas|Wa|Su|Qa|ʿIkri|Lu|Su|Osa|Rag|Saf|Da|Fay|Nib|Nash +suffix_male=af|al|lih|bair|sur|bi|lah|at|sim|ma|ih|yl|iq|raj|mam|man|ya|zid|riya|ail|air|ah|en|in|ayd|ud|rah|wah|nan|as|ir|ba|ni|yad|ras|zuq|hid|mal|kib >> #enddef From 7bcb4a587327876007b74fa0111e7ab52d652f96 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Sat, 16 Apr 2016 21:55:11 +0300 Subject: [PATCH 232/240] Updated generic portrait of Mermaid Initiate By Tet and eyerouge, from https://forums.wesnoth.org/viewtopic.php?f=23&t=29715 --- changelog | 2 ++ data/core/images/portraits/ARTISTS | 2 +- .../images/portraits/merfolk/initiate.png | Bin 221279 -> 180196 bytes 3 files changed, 3 insertions(+), 1 deletion(-) diff --git a/changelog b/changelog index 755c48c1382e..3c53486f0b41 100644 --- a/changelog +++ b/changelog @@ -1,4 +1,6 @@ Version 1.13.4+dev: + * Graphics: + * Updated generic portrait of Mermaid Initiate. * Language and i18n: * Updated translations: * Removed support for SDL 1.2. SDL 2 is now the only supported version. diff --git a/data/core/images/portraits/ARTISTS b/data/core/images/portraits/ARTISTS index e9a0cd28d1c2..b1934086bd62 100644 --- a/data/core/images/portraits/ARTISTS +++ b/data/core/images/portraits/ARTISTS @@ -143,7 +143,7 @@ Other Sleepwalker/Marcus Rosén - Mermaid Initiate + Mermaid Initiate (update by Tet and eyerouge) DUHH/Kim Holm Dwarf Fighter alternate diff --git a/data/core/images/portraits/merfolk/initiate.png b/data/core/images/portraits/merfolk/initiate.png index 7eb760b68d220d864779e334db4ab42b742419b3..6455e7e7ddf09a573884511a356fed8ff58eb5b7 100644 GIT binary patch literal 180196 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≪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 z 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 P00000NkvXXu0mjf_7!u# From 8e78bebb02081cee8b91bb701a56a44cdf02d8a3 Mon Sep 17 00:00:00 2001 From: mattsc Date: Sun, 17 Apr 2016 19:42:26 -0700 Subject: [PATCH 233/240] Fix the AI's move-to-targets CA ignoring tunnels --- changelog | 1 + src/ai/default/ca_move_to_targets.cpp | 10 +++++++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/changelog b/changelog index 3c53486f0b41..f2f3e1f61e48 100644 --- a/changelog +++ b/changelog @@ -289,6 +289,7 @@ Version 1.13.4+dev: * Ported the "hexometer" tool from Bash to Python 3 * Recognize hotkey release events * Allow changing keybindings for scrolling the map. + * Fix the move-to-targets candidate action of the default AI ignoring tunnels Version 1.13.4: * Language and i18n: diff --git a/src/ai/default/ca_move_to_targets.cpp b/src/ai/default/ca_move_to_targets.cpp index 0cd5c1b35ff6..b057537b9dd9 100644 --- a/src/ai/default/ca_move_to_targets.cpp +++ b/src/ai/default/ca_move_to_targets.cpp @@ -28,6 +28,7 @@ #include "units/unit.hpp" #include "terrain/filter.hpp" #include "pathfind/pathfind.hpp" +#include "pathfind/teleport.hpp" #include @@ -336,7 +337,8 @@ std::pair move_to_targets_phase::choose_move(std::vec // to it seeming futile. Be very cautious about changing this value, // as it can cause the AI to give up on searches and just do nothing. const double locStopValue = 500.0; - pathfind::plain_route real_route = a_star_search(u->get_location(), tg.loc, locStopValue, &cost_calc, map_.w(), map_.h()); + const pathfind::teleport_map allowed_teleports = pathfind::get_teleport_locations(*u, current_team()); + pathfind::plain_route real_route = a_star_search(u->get_location(), tg.loc, locStopValue, &cost_calc, map_.w(), map_.h(), &allowed_teleports); if(real_route.steps.empty()) { LOG_AI << "Can't reach target: " << locStopValue << " = " << tg.value << "/" << best_rating << "\n"; @@ -402,7 +404,8 @@ std::pair move_to_targets_phase::choose_move(std::vec //const double locStopValue = std::min(best_target->value / best_rating, (double) 100.0); const double locStopValue = 500.0; - pathfind::plain_route cur_route = pathfind::a_star_search(u->get_location(), best_target->loc, locStopValue, &calc, map_.w(), map_.h()); + const pathfind::teleport_map allowed_teleports = pathfind::get_teleport_locations(*u, current_team()); + pathfind::plain_route cur_route = pathfind::a_star_search(u->get_location(), best_target->loc, locStopValue, &calc, map_.w(), map_.h(), &allowed_teleports); if(cur_route.steps.empty()) { continue; @@ -634,7 +637,8 @@ void move_to_targets_phase::access_points(const move_map& srcdst, const map_loca const map_location& loc = i->second; if (int(distance_between(loc,dst)) <= u_it->total_movement()) { pathfind::shortest_path_calculator calc(*u_it, current_team(), *resources::teams, map_); - pathfind::plain_route rt = a_star_search(loc, dst, u_it->total_movement(), &calc, map_.w(), map_.h()); + const pathfind::teleport_map allowed_teleports = pathfind::get_teleport_locations(*u_it, current_team()); + pathfind::plain_route rt = a_star_search(loc, dst, u_it->total_movement(), &calc, map_.w(), map_.h(), &allowed_teleports); if(rt.steps.empty() == false) { out.push_back(loc); } From 6bc34aea7c1d367bd208cf733dafbded75ff14fd Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Mon, 18 Apr 2016 10:39:36 +0300 Subject: [PATCH 234/240] Added melee and defend animations for Naga Hunter --- .../images/units/nagas/hunter-attack-melee-1.png | Bin 0 -> 1064 bytes .../images/units/nagas/hunter-attack-melee-2.png | Bin 0 -> 1115 bytes .../images/units/nagas/hunter-attack-melee-3.png | Bin 0 -> 1095 bytes .../images/units/nagas/hunter-attack-melee-4.png | Bin 0 -> 3192 bytes .../images/units/nagas/hunter-defend.png | Bin 0 -> 980 bytes .../images/units/nagas/hunter-melee-defend.png | Bin 0 -> 1039 bytes .../units/nagas/Naga_Hunter.cfg | 9 +++++++-- 7 files changed, 7 insertions(+), 2 deletions(-) create mode 100644 data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-1.png create mode 100644 data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-2.png create mode 100644 data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-3.png create mode 100644 data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-4.png create mode 100644 data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-defend.png create mode 100644 data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-melee-defend.png diff --git a/data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-1.png b/data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-1.png new file mode 100644 index 0000000000000000000000000000000000000000..1487aac47e42acc6d6fd7558de772adef12bc34c GIT binary patch literal 1064 zcmV+@1lRkCP)6ytSWQ-zJ)YZMy0n;zhIJeq96clw4h|0g006Ns zFF`IhTTLi3WMU+BJfo|sct|*qc3gF&*Ui!Y!KZ%u^T}2%92NjHI5aR-04hWx5!L{I z?^~g}W&r=pL_Yu)_N~o#GZA|LMe%a1LYS4q0CemCjALVC7&KC1c}+ne7s2v=Lz)XEY@hoNab_f0GYI;`uOw$EYR z#4;of?`am^XUO`|iLN7Zp@WJqjUTTFD|b^%aj`RH56DCeHs0kvb5b9=&f72)fCU>c z2@->?Vp(z+`EIAm-S7W!rR?rD_?4av><@=ph{(5{NbmpR(13!{{lq_$+*;${|7;|L zI3N-Ik7Mn}zcdQ=!C_$LVGu#Q#hLoi?WqhAMI0XaZ;(l4a7hOsh;4(phh-bTm%m6CojSxJRhwP7#>tXPbUSF5;vVCL1gNu zzHSlm5D1upfIvl({bgcC`JuBcVifk1XJ7^)u8u^Co0C$`NF2m9NJdGOh+!b(XgH2z zx=T52k{|^lX@NG&q`>>4nDk$N88H=Xf35&E~Praj0U0BUF*_D z$@AFF-TXspeS1Hj&&3=B2H=2##z4v`qZnn<+#S2_I9rb6b?0(^FJ*mON5O40?>(rd z9CMPz*>!f__pjZadAvH-ds){v`;%B_3L+mL(=>Un5VI^Mxp|s;_c_;6<9xNyd$CgI zwJehJ*I~Ocy+0gw?68>Rr?GdI&+)U?xhm~Yy(&?^0wM)eHOzm1RBN$6a~ihHxpG?mCe!r|Ns9F4-XFv3kfV6b)?t2yq*#g66*M#5>6ytSWQ-zJ)YZMy0n;zhIJeq z96clw4h{}?GZDLH0RI30u`e(G%tS#hH$);4TTLh=bv&c1s(45^kak?br+)hL$yO~K zI5aR805nwqD%Jph?^~fi02cPG&3gbv@p7!g0CemCjALVCVtGwLK|#RfX=MNa048)& zPE!E?|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsA)oUZZ60009{NklB1qOyCg}B7#+k4J2-GaORvpIo4QDHpajyq-6PNyh6+k4ysb4v198G}gM?biEB5mBF_2x5Dq zP74J~J3jjDZok_y>k2MnN_`S-0K;jOHY&|?-yfc&L`ao$65C*WqK2s)3#PW)dKQWy zDa9J;G^^YmkGHcnR#?PyOw@zwPO7<-ay%Aw$XW)(Nms3pCsFh5-QjR3aF{HS^(+jA zVvd=mnSygX+?6ul&I{o>HRl|q6m!T?Hu`t&oEsXZbysGDDzgL@VJ~ujKTVT!i9!~1 z57aa@Kz9Y94s+Q^&JWAFI|sL1K4HrZ%1w)*snZq0014^AGaJt-0dtS{YHe`W-~j5n za-6#g<;3hc)FlgHfL3!2o5ptE0jp956%vdPBU&URGC1v1n^cP4KS`i+j5(2J%3@V% zhB`nmk_1q?^iD&;QUVr6zUB)(Rq>DbF@?cje#OS hC1YSgGHk&p000#=Y%l-;P8t9J002ovPDHLkV1j!;{7nD= literal 0 HcmV?d00001 diff --git a/data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-3.png b/data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-3.png new file mode 100644 index 0000000000000000000000000000000000000000..923874254b7643e46528c12a4e2b48487229faa2 GIT binary patch literal 1095 zcmV-N1i1T&P)iC`#P9(c#0CzJHU06+4mOcN> zM4sDT4h{|^bv(MXn2LsV92^`yBohAs0I@GGK`u92O(>(Qs(45^kak?br+)hL$yO~K zI5aR-04f#$G}Zur?^~fi02cPG&3gbv@p7!g0CemCjALVCVtGwLK|$8vu}lB}04H=( zPE!E?|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0|NsC0nf+DlKL7v&IY~r8 zRCodG(piGTAP5Fvn%IO9sZg+c?|;oPo%OL!qa7 zc8f^s5SFQ_sZzU))Gkz0(=9fpZ&XtMEX}=5eZaSa>zX-Gf0G_&9vt>DP+ckUI&_;& z9xV{j%@GL^fi!7XOWKZyAQ=&g^b$i4oRoZabebj-EED zT21nVA`$uKB=fNj&=3($Y$(Xez$HzZH8`1(I-kyXW@b~Z(7hwNT;4lM?CjxWXLaYI z_d9TXgTP&xiB&ZzIoH4P-32`|PA5x_gD@C??Ov&hbf6G7Vo>Nfqy(vSIwImG7eoRJrels|5;COV zRlW2v0n>C-B9Bmle>g1J=gldlR_=1550E@0On4vA;eH%n%1fzblcWb?3XxIKBnsPv z;(;;tQL5!qtnJ$6b~#5DDp`$U>4m=iwcEPh7CTzPB9RM%ff{-W z%3e!rZC#r=6aoWcwMBaw&Ogfnq}7}~lF8&s7!a^99KX9vytg3|+8I$)br zL1l%JOHs-~A}-0?=?tyedzV1fQmT^mR3$*^bx?r5N|Hg@($ltPaQY$C@)ZK*Y8ADn z4C#0NaEwJDRgupl+ZaT-A_4?RrjTzEs-Gw~ih&}4Yz*ZlF$`NU3IOIgZk3Q#njHWD N002ovPDHLkV1j(M0XhHx literal 0 HcmV?d00001 diff --git a/data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-4.png b/data/campaigns/Under_the_Burning_Suns/images/units/nagas/hunter-attack-melee-4.png new file mode 100644 index 0000000000000000000000000000000000000000..a79a234b4d9fccc58d0e046cf7e70b5fcf7b8b97 GIT binary patch literal 3192 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 JPDHLkV1gje?T`Qf literal 0 HcmV?d00001 diff --git a/data/campaigns/Under_the_Burning_Suns/units/nagas/Naga_Hunter.cfg b/data/campaigns/Under_the_Burning_Suns/units/nagas/Naga_Hunter.cfg index 84e3879550de..39a886d97e6b 100644 --- a/data/campaigns/Under_the_Burning_Suns/units/nagas/Naga_Hunter.cfg +++ b/data/campaigns/Under_the_Burning_Suns/units/nagas/Naga_Hunter.cfg @@ -18,7 +18,8 @@ usage=archer description= _ "Naga Hunters are Naga who are skilled at hunting with a bow. Since the naga are naturally resistant to poison, they have no qualms about hunting with poisoned arrows. These two foot long shafts, tipped with a potent poison, have been known to slay many kinds of prey."+{SPECIAL_NOTES}+{SPECIAL_NOTES_POISON} die_sound=naga-die.ogg - {DEFENSE_ANIM "units/nagas/hunter-attack-ranged-1.png" "units/nagas/hunter.png" {SOUND_LIST:NAGA_HIT} } + {DEFENSE_ANIM_RANGE "units/nagas/hunter-melee-defend.png" "units/nagas/hunter-attack-melee-1.png" {SOUND_LIST:NAGA_HIT} melee} + {DEFENSE_ANIM_RANGE "units/nagas/hunter-defend.png" "units/nagas/hunter.png" {SOUND_LIST:NAGA_HIT} ranged} [attack] name=sword description= _"sword" @@ -63,7 +64,11 @@ offset=0.0~0.3,0.3~0.5,0.5~0.60,0.60~0.3,0.3~0.0 start_time=-450 [frame] - image="units/nagas/hunter.png:570" + image="units/nagas/hunter-attack-melee-[1~4].png:[100*2,150,200]" + [/frame] + [frame] + duration=100 + image="units/nagas/hunter-attack-melee-1.png" [/frame] {SOUND:HIT_AND_MISS {SOUND_LIST:SWORD_SWISH} {SOUND_LIST:MISS} -100} [/attack_anim] From 20f67bf4a0c5a3849d6fe862fb13a5e48e6a998c Mon Sep 17 00:00:00 2001 From: "Ignacio R. Morelle" Date: Mon, 18 Apr 2016 21:56:55 -0300 Subject: [PATCH 235/240] cmake: Disable -Wno-old-style-cast on Lua unit tests Otherwise strict compilation fails due to code using macros such as lua_number2int() which contain C-style casts. --- src/CMakeLists.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 5025bf6d8916..e60f160bf816 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -393,6 +393,7 @@ set_source_files_properties( desktop/notifications.cpp network.cpp network_worker.cpp + tests/test_lua.cpp PROPERTIES COMPILE_FLAGS "${CXX_FLAG_NO_OLD_STYLE_CAST}" ) From 8d290fc5b7c661a0d414e9225e92cc52ad567946 Mon Sep 17 00:00:00 2001 From: "Ignacio R. Morelle" Date: Mon, 18 Apr 2016 21:57:46 -0300 Subject: [PATCH 236/240] cmake: Fix linking issues with wesnoth and test targets The GUI2 combobox widget code is linked into a separate .a library that does not include one of its dependencies, gui2::tdrop_down_list. This causes link order issues and renders the wesnoth and test targets unlinkable with GCC 5.3.1 and binutils 2.26 at least. --- src/CMakeLists.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e60f160bf816..8c3c04fdcad7 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -547,6 +547,7 @@ add_library(wesnoth-gui_tooltip # behavior of the widgets. It also contains the builder code # for the widgets since the code has inter dependencies. set(wesnoth-gui_widget_SRC + gui/dialogs/drop_down_list.cpp gui/widgets/button.cpp gui/widgets/combobox.cpp gui/widgets/container.cpp @@ -819,7 +820,6 @@ set(wesnoth-main_SRC gui/dialogs/depcheck_confirm_change.cpp gui/dialogs/depcheck_select_new.cpp gui/dialogs/dialog.cpp - gui/dialogs/drop_down_list.cpp gui/dialogs/edit_label.cpp gui/dialogs/editor/custom_tod.cpp gui/dialogs/editor/edit_label.cpp From 9b931a574c09c9f5ebd6c63d6b5c9ac83beea280 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Wed, 20 Apr 2016 01:47:47 +0300 Subject: [PATCH 237/240] Removed the red tents from top of drake villages --- .../scenarios/19c_Cliffs_of_Thoria.cfg | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/data/campaigns/Heir_To_The_Throne/scenarios/19c_Cliffs_of_Thoria.cfg b/data/campaigns/Heir_To_The_Throne/scenarios/19c_Cliffs_of_Thoria.cfg index 6fae2e5fae3c..9046faa5658b 100644 --- a/data/campaigns/Heir_To_The_Throne/scenarios/19c_Cliffs_of_Thoria.cfg +++ b/data/campaigns/Heir_To_The_Throne/scenarios/19c_Cliffs_of_Thoria.cfg @@ -554,10 +554,6 @@ Soooo... It is you who sent your subordinates to attack us. Now when we’ve des x,y=41,12 [/value] [/set_variables] - - {FOREACH drake_bases i} - {PLACE_IMAGE scenery/tent-fancy-red.png $drake_bases[$i].x $drake_bases[$i].y} - {NEXT i} [/event] [event] @@ -585,13 +581,6 @@ Soooo... It is you who sent your subordinates to attack us. Now when we’ve des image=items/gold-coins-medium.png [/message] - [remove_item] - x,y=$x1,$y1 - image=scenery/tent-fancy-red.png - [/remove_item] - - {PLACE_IMAGE scenery/village-human-burned4.png $x1 $y1} - # Remove the current location from the array {FOREACH drake_bases i} [if] From 9d95682b82552cb51780dd2790b301bae246b6be Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Wed, 20 Apr 2016 02:01:41 +0300 Subject: [PATCH 238/240] Made the scenario able to cope with lack of potential escapees --- .../scenarios/11_Captured.cfg | 73 +++++++++++++------ 1 file changed, 50 insertions(+), 23 deletions(-) diff --git a/data/campaigns/Eastern_Invasion/scenarios/11_Captured.cfg b/data/campaigns/Eastern_Invasion/scenarios/11_Captured.cfg index 97f3bf6c4500..90ce9bf14f0f 100644 --- a/data/campaigns/Eastern_Invasion/scenarios/11_Captured.cfg +++ b/data/campaigns/Eastern_Invasion/scenarios/11_Captured.cfg @@ -120,56 +120,83 @@ [role] side=1 - type=Royal Guard,Halberdier,Great Mage,Master Bowman,Arch Mage,Silver Mage,Mage of Light,Javelineer,Swordsman,Pikeman,Longbowman,Red Mage,White Mage,Mage,Spearman,Cavalryman,Horseman,Iron Mauler,Shock Trooper,Heavy Infantryman + type=Royal Guard,Halberdier,Great Mage,Master Bowman,Arch Mage,Silver Mage,Mage of Light,Javelineer,Swordsman,Pikeman,Longbowman,Red Mage,White Mage,Mage,Spearman,Bowman,Iron Mauler,Shock Trooper,Heavy Infantryman,Cavalryman,Horseman role=escapee leader [not] id=Dacyn [/not] [/role] + [if] + [have_unit] + role=escapee leader + search_recall_list=yes + [/have_unit] + [else] + {GENERIC_UNIT 1 "Mage" "recall" "recall"} + [+unit] + role=escapee leader + [/unit] + [/else] + [/if] + [recall] + role=escapee leader + x,y=25,3 + [/recall] [role] side=1 - type=White Mage,Red Mage,Longbowman,Pikeman,Swordsman,Javelineer,Mage,Spearman,Cavalryman,Horseman,Mage of Light,Arch Mage,Silver Mage,Master Bowman,Halberdier,Royal Guard,Great Mage,Iron Mauler,Shock Trooper,Heavy Infantryman + type=White Mage,Red Mage,Longbowman,Pikeman,Swordsman,Javelineer,Mage,Spearman,Bowman,Mage of Light,Arch Mage,Silver Mage,Master Bowman,Halberdier,Royal Guard,Great Mage,Iron Mauler,Shock Trooper,Heavy Infantryman,Cavalryman,Horseman role=escapee sidekick 1 [not] id=Dacyn [/not] [not] - [and] - role=escapee leader - [/and] + role=escapee leader [/not] [/role] + [if] + [have_unit] + role=escapee sidekick 1 + search_recall_list=yes + [/have_unit] + [else] + {GENERIC_UNIT 1 "Spearman" "recall" "recall"} + [+unit] + role=escapee sidekick 1 + [/unit] + [/else] + [/if] + [recall] + role=escapee sidekick 1 + x,y=24,3 + [/recall] [role] side=1 - type=Spearman,Mage,Bowman,Mage,Red Mage,Longbowman,Pikeman,Swordsman,Javelineer,Cavalryman,Horseman,Mage of Light,Arch Mage,Silver Mage,Master Bowman,Halberdier,Royal Guard,Great Mage,Iron Mauler,Shock Trooper,Heavy Infantryman + type=Spearman,Mage,Bowman,Mage,Red Mage,Longbowman,Pikeman,Swordsman,Javelineer,Mage of Light,Arch Mage,Silver Mage,Master Bowman,Halberdier,Royal Guard,Great Mage,Iron Mauler,Shock Trooper,Heavy Infantryman,Cavalryman,Horseman role=escapee sidekick 2 [not] id=Dacyn [/not] [not] - [and] - role=escapee leader - [/and] + role=escapee leader [/not] [not] - [and] - role=escapee sidekick 1 - [/and] + role=escapee sidekick 1 [/not] [/role] - - [recall] - role=escapee leader - x,y=25,3 - [/recall] - - [recall] - role=escapee sidekick 1 - x,y=24,3 - [/recall] - + [if] + [have_unit] + role=escapee sidekick 2 + search_recall_list=yes + [/have_unit] + [else] + {GENERIC_UNIT 1 "Bowman" "recall" "recall"} + [+unit] + role=escapee sidekick 2 + [/unit] + [/else] + [/if] [recall] role=escapee sidekick 2 x,y=25,4 From a58dee4daf91d82bdcf9b8f3297943b657bf2f57 Mon Sep 17 00:00:00 2001 From: aquileia Date: Fri, 15 Apr 2016 02:04:06 +0200 Subject: [PATCH 239/240] travis: Reorder before_install instructions --- .travis.yml | 67 +++++++++++++++++++++-------------------------------- 1 file changed, 26 insertions(+), 41 deletions(-) diff --git a/.travis.yml b/.travis.yml index 7c82a2392d45..bf567a2d8a7c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,65 +9,50 @@ compiler: - clang env: - - BUILD="-O0" - - BUILD="-O2" - - BUILD="translations" + - OPT=-O0 NLS=false + - OPT=-O2 NLS=false + - NLS=true matrix: exclude: - compiler: gcc - env: BUILD="-O2" + env: OPT=-O2 NLS=false - compiler: gcc - env: BUILD="C++14 -O2" - - compiler: gcc - env: BUILD="translations" + env: NLS=true before_install: - export TARGETS="wesnoth wesnothd campaignd test" - - export WML_TESTS=true - - export CPP_TESTS=true - - export PLAY_TEST=true - - export MP_TEST=true - - export STRICT_COMPILATION=true - - export EXTRA_FLAGS_ALL="-pipe" - - export EXTRA_FLAGS_RELEASE="-O0" - - export WML_TEST_TIME=20 - - export NLS=false + - export STRICT_COMPILATION=false + - export EXTRA_FLAGS_RELEASE="" + - export WML_TESTS=true CPP_TESTS=true PLAY_TEST=true MP_TEST=true + - export WML_TEST_TIME=15 - export CXXSTD=11 - - if [ "$CXX" == "g++" ]; then export CXX=g++-4.7; fi - - - if [ "$BUILD" == "-O2" ]; then export STRICT_COMPILATION=false; fi - - if [ "$BUILD" == "-O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi - - if [ "$BUILD" == "-O2" ]; then export WML_TEST_TIME=15; fi - - - if [ "$BUILD" == "C++14 -O2" ]; then export STRICT_COMPILATION=false; fi - - if [ "$BUILD" == "C++14 -O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi - - if [ "$BUILD" == "C++14 -O2" ]; then export WML_TEST_TIME=15; fi - - if [ "$BUILD" == "C++14 -O2" ]; then export CXXSTD="1y"; fi - - - if [ "$BUILD" == "-O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-deprecated-declarations"; fi - - if [[ "$BUILD" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations -Wno-deprecated-register"; fi - - if [ "$BUILD" == "-O0" ]; then export PLAY_TEST=false; fi - - if [ "$BUILD" == "-O0" ]; then export MP_TEST=false; fi - - - if [ "$BUILD" == "translations" ]; then export NLS=true; fi - - if [ "$BUILD" == "translations" ]; then export TARGETS="translations"; fi - - if [ "$BUILD" == "translations" ]; then export WML_TESTS=false; fi - - if [ "$BUILD" == "translations" ]; then export CPP_TESTS=false; fi - - if [ "$BUILD" == "translations" ]; then export PLAY_TEST=false; fi - - if [ "$BUILD" == "translations" ]; then export MP_TEST=false; fi + - if $NLS; then + export TARGETS="translations"; + export WML_TESTS=false CPP_TESTS=false PLAY_TEST=false MP_TEST=false; + fi + - if [ "$OPT" == "-O0" ]; then + export STRICT_COMPILATION=true; + export EXTRA_FLAGS_RELEASE="-O0 -Wno-deprecated-declarations"; + export PLAY_TEST=false MP_TEST=false WML_TEST_TIME=20; + fi + - if [[ "$OPT" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-deprecated-declarations -Wno-literal-suffix -Wno-deprecated-register"; fi install: - travis_wait sudo apt-get update -qq - - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libboost-thread-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb g++-4.7 + - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libboost-thread-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb + + - if [ "$CXX" == "g++" ]; then + sudo apt-get install -qq g++-4.7; + export CXX=g++-4.7; + fi script: - ./utils/travis/check_utf8.sh - ./utils/travis/utf8_bom_dog.sh - $CXX --version - - echo "*Params* --- " "cxxtool=$CXX --debug=time build=release extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx_std=$CXXSTD nls=$NLS jobs=2" - - scons cxxtool=$CXX --debug=time build=release extra_flags_config="$EXTRA_FLAGS_ALL" extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx_std=$CXXSTD nls=$NLS jobs=2 + - scons cxxtool=$CXX --debug=time build=release extra_flags_config=-pipe extra_flags_release="$EXTRA_FLAGS_RELEASE" strict=$STRICT_COMPILATION $TARGETS cxx_std=$CXXSTD nls=$NLS jobs=2 - "export DISPLAY=:99.0" - "/sbin/start-stop-daemon --start --quiet --pidfile /tmp/custom_xvfb_99.pid --make-pidfile --background --exec /usr/bin/Xvfb -- :99 -ac -screen 0 1024x768x24" - if [ "$CPP_TESTS" = true ]; then ./utils/travis/test_wrapper.sh; fi From 23abf97f362cee0774700d8b3e256e2c6ff7bcc2 Mon Sep 17 00:00:00 2001 From: aquileia Date: Wed, 20 Apr 2016 03:38:01 +0200 Subject: [PATCH 240/240] travis: Add C++14 build with g++-5 For now, C++14 builds are allowed to fail. --- .travis.yml | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/.travis.yml b/.travis.yml index bf567a2d8a7c..dd9ad2791e2a 100644 --- a/.travis.yml +++ b/.travis.yml @@ -9,16 +9,21 @@ compiler: - clang env: - - OPT=-O0 NLS=false - - OPT=-O2 NLS=false + - OPT=-O0 CXXSTD=11 NLS=false + - OPT=-O2 CXXSTD=11 NLS=false + - OPT=-O2 CXXSTD=1y NLS=false - NLS=true matrix: exclude: - compiler: gcc - env: OPT=-O2 NLS=false + env: OPT=-O2 CXXSTD=11 NLS=false - compiler: gcc env: NLS=true + - compiler: clang + env: OPT=-O2 CXXSTD=1y NLS=false + allow_failures: + - env: OPT=-O2 CXXSTD=1y NLS=false before_install: - export TARGETS="wesnoth wesnothd campaignd test" @@ -26,10 +31,9 @@ before_install: - export EXTRA_FLAGS_RELEASE="" - export WML_TESTS=true CPP_TESTS=true PLAY_TEST=true MP_TEST=true - export WML_TEST_TIME=15 - - export CXXSTD=11 - if $NLS; then - export TARGETS="translations"; + export TARGETS="translations" CXXSTD=11; export WML_TESTS=false CPP_TESTS=false PLAY_TEST=false MP_TEST=false; fi - if [ "$OPT" == "-O0" ]; then @@ -40,10 +44,14 @@ before_install: - if [[ "$OPT" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-deprecated-declarations -Wno-literal-suffix -Wno-deprecated-register"; fi install: + - if [ "$CXXSTD" == "1y" ]; then sudo add-apt-repository ppa:ubuntu-toolchain-r/test -y; fi - travis_wait sudo apt-get update -qq - travis_wait sudo apt-get install -qq libboost-filesystem-dev libboost-iostreams-dev libboost-random-dev libboost-program-options-dev libboost-regex-dev libboost-system-dev libboost-test-dev libboost-locale-dev libboost-thread-dev libcairo2-dev libfribidi-dev libpango1.0-dev libsdl-image1.2-dev libsdl-mixer1.2-dev libsdl-net1.2-dev libsdl-ttf2.0-dev libsdl2-image-dev libsdl2-mixer-dev libsdl2-net-dev libsdl2-ttf-dev gdb moreutils scons xvfb - - if [ "$CXX" == "g++" ]; then + - if [ "$CXXSTD" == "1y" ]; then + sudo apt-get install -qq g++-5; + export CXX=g++-5; + elif [ "$CXX" == "g++" ]; then sudo apt-get install -qq g++-4.7; export CXX=g++-4.7; fi

o`|K;bPmfzQS7}dqz(A*x*<|chEc3Z=ID$ zXQ3-fRdb{Yt`5#&vDyPR=F?+X0C){ZPa~2AfU^S`*)vk;{}1M+*1mmRCF%#CeNffX zY8KWny=y{tF^l?p+INr0KKIVLfp+0dWCjVy2jWl@^HENT%#>8N3Y!y4T_!Dc=&M9s zqMU^XWDzhG2?-+=4mFX(3s`>`kk)`T|5GeKS-td6sgvEJw&G-J>7S}kc8NOveC~R| z&(E@-K6L8RFX7MpuKXf+9gbzS4m-R$sLsl$8cAvdNC+^u3L!aJ9-~~I_hMt%7`_(O zF9n4_;LrEDbT(_mJ#j9Mir=vi%BO><11&D7B9~_f^ zSbQ(MW`)r%+=e=NN^aZL?v@fqb%8L|S&zjTQa*pOq8v9bIYF;J^u=jIGB3+(K}l}C zo$-gf-)y`<8AX_^0`P?;Lw-gg7`fW)yxUyJixe)sf&H)nzHAkCB~Y}KP>%y0OCQT$ zAnS`9i!1=oag;t`G$7p%B}f#IIAC>QT7rl!0ys<7D?!AB*%7%`rgv#C3aJ|$Zg~=g znN&XeP5iH(;jcw0lqP?m$)3AEcfoG{hkr1*@N#fE0{$l>jvW~oSVpsOovM_OglGc} zvIRBT0|c3Tfhk?@S+-kGVLZRHGvdRR1kxog@nWb=4PSix1$K1puXb0 z7^1?haJ&?LUGo&w8d`Y(BX(VR`IR4lMUig=3J4W72q$-l=eBH~o*Y}(-!sl#T_gOWza>m+XpK~708g&ma#P66n(rf`9@Zx~v#p-#FAOq)n;V$o0bFIn$O z{%q^^!CKwI=LX6SeS5hxE>44Luqt&uM#iVS>!cWa;LHyD}__A zmRDluBK9M^K~Q19?S+(=m5igpc}ED_2=~6%u>@R373TH09A+aNag}_fl+sm5HIfiH zYg3but%SALApD(P-Q4y3iOu)ztRK7Ut4DS`R@z9m0o+SUV!sHj);Ll`WRC$yd^lC<`%$RlI$9Y#rNi68;N0j}zb+-3*%FO?BWHO-mf3cW&B! zF;%_HPdZlTCVo<|OJ09&nVr<86|aeaXEfHoy}5p-zm9lD+e(}Fj8=8mcY&MK>vC5T zH)-5;Y|j*9CMAMgS`(N4BR9`)$2g0SGcf=SIHcst=m01CK_sxnJ{n=0MWezsqFIj4 zA*DgfvsAwPq(jkeKKJaox16yWk0a(WIijf&itrQ7LGC;GaJ{p%mcsVs^j`kbYnOh@ zzl--;h`S6%=t~HMu^e0c1hzcy05aqKQVua2bwa2~3`c9e06vYSye^~Ku$RdE!K(w%CTptHRj|1UhP?JX7==OSFc?e&<4FD^Tvsb{Nm(oThrD>pLXwQ;X&43 zwr8J5d%ZMD@Ht7jL!|xWvq$sle*}3Uktid)W5`NUb(V8krDRc1L$vS$=EGK|F4q18XYA|c zcih3>y6(6`-OK+hcj(Ark7|GJCCH98$m-uR4vHApE_vsWtSvbsU~8_x**uiQz4mj4 zA0(LDvPi>{DS#mJAh%_dp7>h`isRcJ+uuBK&o_>3ee7V%Cqq38Z6h~rt`B!Fw2$7n zIW4qa|HCJydrm*S?FN#wXP(~HcXT4re)OrG{YS?VZAVGq@t6L9HfIax3owK-;EjsU z7XbC8^M!=V)e0rxe0jg?7<3Ki3qfg|c8du`1M=rfrq)@;1a<+l#uVQ|h6hU^!(yB_ zYAx|pOSI?Qmd0RqQ&VQNF=Ei`<;m_(Y@dH{cjL(IUpad0@%n!APjxo0UDI;pslEM2 z$H6b`)~ZHZy1Pz2wQ%E)o}3vQ>eHd$0(}1^GL85X;17M={P1U}FgMK!+YaoIVP+E% zu}M&U3wAbhvlOl&rfS0fV|WB$*B}w6F~fA1$d6$+g`?6;TGt4H2&KgVUrc+eW9;77 z&+Pc{q2{rBzkO!MlZTqc!KWYj`nNy+$k$)vzi|B<_pEC^@F!cY{|@{4m*?+z<=LC> zcm?vflY3OA7ylj{TXmm{y95qp9w@-4r3ocmHRu35Srabg_-Xt}ed4*X*_Q&oasi?# zQilY?ypBj7O3IlrBJx{UYm`D0i;7yKr`&6J;=?;0+MX&cRms)URjILizI~S3yJf0R z^_JP_&UB8}+;Csrwhv6!&W5ylm0mf}@WA9v-@R+Nao?lc?);1K0g{NPIE!pd`~%EA z6IaKb&brGnT6F=F5*RiI)|EIE=fweVRG}l%MBsZ8tC$E3FlFXT<#x#a#HPmd30u)I z=^9dSKs$jhiio7r9Inc;d$}r65yhTDu7@=09lVrT06bF}^4^#qmNr^L21vmU-dR|A z_`Y}Ky_}WRDsZ3qB&a6h*^AmkvI7mZMT_t>Z?tz={ z$PQ25dj5_Q_tF<_&8409clTosx9~s$9J}_)irwOxkXjmhtMN&iPyl2%)-uEiD1-*8V z;B8nxwyvYCDN|il95<(6Y%%wZyy)17;UV$R0-JHK-MnS=cc{k1NO@yy5_-#C+;?uz$a|CxQ=2iBFV zlQTC=SZbO(1E7kq3jbf-V724ev4dw?cHTVj^wP64J2%bk3Uy4^mydL}q@sFQ5wTPZ zCju>;1ms;BXMz=8!VOu?a9^ra1BJQ((6!1%fgqBw**S@!l$O_JpGw*?qwblojkh+( zB1G3i_Pb;*0Op+^G>HUZS-+7adLDoaLTv}^dm3DX2{H}QShOL{pReA~9`>bsBUKY^ z;nJFJ{woGuq+?@sq^q_pv**Dr<7d|=5(8W7LTyQp%H%SivTC&kho`DF80)U{iGbHC ztlrbE^k{vwITf?olg-05<*hNRc+T13ZkzAVIPA6A_4T9I&!#ATHL!2A$!SZr3?@rc z6>$`5_O_RV8Y&}ZOL=`)g|otJqudv6j(=PHSLlFt4!LI_dBTD`Mgz)dGZT9JJ-zAP#k#u1dr2vhY!K9af@{Xf)n=>7g9AHC zT!iQmuUYik4zlrTteFy(b1 z#LJ)~P{twvr-CzaP1DAVXJ(eaa4z?zM0v8Q*=u?A!Aj#(Dp$#9?RkDXV>}rWkD|_5 z=cdLy;|YILF!!9r$UjW$tO4zfqPPu;iJ!zX+@wWNJk~<4JxPGD%|RtCr1Al4zhUXdYd@4qTEHt| zvl=K6;pW})yjUSWeSSfc#~u>-D|J)Z3gz&{VePFTY~;Wk(=lMJ&*rutrE@CW)sA$up5!Qs`px+r_7~s_g5hj{W5~mcHZ= z>T~7eCr5Lg;zRsQmrB|G(cOi$J$1lu){m|0O~NQz{8#pj4pE)tm}&VbvaZD+x{bzIQ-wP$z7peX9wJ zuqJ^-T=VypJIZ%i{N+wZ+-I@);tprI-;yCDwzIs<0+S9ueU`ty@>mGpb;irg=CZic zg}d;S+_5zupibkJMhhcx=>xKU+4EeKJ4Dn=*l?2Z7lcO>0t?>M1&jjmH!R?k|NIfT>O22y=?y!`y02Ah9(*(xwhQ$wbL~O7_G6Fd(stSN zb8QMm^M|(VyUx(^@ojhCF7lt@g~p-D`=b1(c};0ebjux4{*$y4QSpou{}TJoLgx{9 zlOPqbbZO_|YY8!K;miSM)T#Lpga;^-ki`d)2eFqH|1zg}cM9lPF%n1A21wZpcvm?W&4xlYXrDx64kA<>0FcD_*Ohbe)_{u< zn9~dMIm~O{+=8O&`NV5NPsuOj79TzX!&I)7=f3~&(|6cC!W39+RAvpYR|IS|cDMW> z=m|`Q|5OB7`-H#Nl^Ttux}{3-ExTpuoIO=iQe#8;Sa|K0&e@VB^)cZVlM`cf=~oz| z4BD;Fd(aBv4d1bpWPZeKGh3OtNr}Or6eKh!Bwb2oTY8Cq3qe4YXaRyaU>05wKkq47 zlHc0patiOjTTjpb{iWXtuy~P=epKRDwqRKmlveUNf^{4WW-uywq@t~aC08Bef5dg{ zWGDLnDz3^NkJyq@0F!XfMSi1(Vmp#?FJvNtjPP5fXfWm8?Az7tZ`pn4#J)dm>o7+x z>OfU!=>CJE0Pg6e{NSnZ)0A*gS^ZJM!efe9goMb~FwT447@&5~nHLK2hmw zs&IFkJqC(a&>D1rE9Do^iP})Xpd|%xGd~0g#t*_JOFI!gCpmQphD;%$DX%a=^4HZ; zv^g9qSCGOaDT|V~zS!H^vEt2NT}M#Ke?7fzsLGb;tZG=-SZ*oR`rALfZ}`|)ym97G zy*@S78J!$W_SMIXc5PYfhZhD84aaK7cfggSb4A-yp4zC>8}ycRp+-yBT>Z#GTg1Fq zYxC8XH}pC^4o7>YJ=8Ik?w`&CDE5iD{%80A9};umS4(8$l`b`Tk%rK-L&J>HU&`ah zMB(BZE>#r?M~KNklE-i{Gl7R&h53qCaywbH0oK3xkW__W`p+i!{PkQg2w;!e9~hn7 zl#FGQ?)shg%#9o$izi0*w1(G>4*8E~4Ni+@thaYeV{sa?n$lFPYH|OOrqNrrHB<~P zHuv3e%bEH}vV_&^T=A32Id>MxFr0uQbELcFk9iX#0$``S@ax?C0nnulLT$JkJBPpY zzp#fWmS-Uy0cIGsKD#-;@6A`EEl7(S?siJjg(wyNLglwz$N%nOyIHu;(-{hNdX^4L zVLB`l@^urBD$_&Au9c_*NF#wHE9fDGK)Kle@q@Vzv{KaPTS;qi07rN`o)IBmFkqZm ziwKxuHG*JX363LXOtTJS03ux2?2dq&MT%t`koX#cO#%f21_@~v#2gQcgd~)#y;9qI zG%^Y>MuviHfr%D~u&R$A$o(PE-8VS8zH&ycuXNXEnp@iZLRLKb zYVOU~&h@$ddu<)3zQOxmrxn4)#0P}0C=Or_>|7>WC&g?j+IbZEoWLK$Sqjg>B-sGM z9Ih8eVQAP0vaE)V4OcjnG^84W!3jyut3tPYt_D0BHuC}g{@rGqSeE;Bx7=;s!!O(} zyZE2xggYJjkKDhT^$$IywF*CGZ3&7Gh~Gk6;8MU= zS~9W`xZXL1OFGMI!PA3$40?iP&Ob7-pyUe*BD zmF)npGWLjyN2yW98byu8t|1l(32L)TK4P_~VKMp3EQmj-&1#cQBUw$9TUW4}lvd?( zsEs^SO8mpZJp8=_ZFP-jN;*om_6*cD=+Er$89p2B+nvo_nibz2YKm69V3CFOB z!iKvF5ktfa%i~d3mAmRn5yLzlun;j^=>|mtmir+E3_lUB^Be0L&T96l_i4IHw{{Pu z8+5JHnUbF2Gm-vX=#yhkHP<5kr!!XXjnz%`P70;}+TWF|+2TsHM_KP`r#r%*>*arn z>A+ZHK13bnLkFAHOZx|EJP+*{b44DtLx`GzBYoM$T!@+>z9|LGbS-=CnZ!u)Lf_%h zirY6&p37dBne7P5Q*)0VY7>53z47?q_M=OeDn^MllV|gPJKm>d_#+v-QA|b0SD1I0 z6QU$+FONVK79mBTrriIc{}(qO*5{^X`A-=X9IY~1VF-O=eQjsYr^t(xBaX*nMTx=! zwSY7kI6PTs%fw;|&|qkA@ozv-<)-v}ggrj@cLx5G;sg7?xBCrRx_I^l@ebjV;y9@l z*$N9DNV1)tEi%Iz#sfB+#Mup|T5BBD8>KhE4#OUod^x08lKPv3_#vy6h@NoJK?G#@ zKm07*bp6JzgQJP&eGklTI2KN7y(XhKnD91i>I!>OJr(7xUh_CeN#tDa$K{clsgr&4 zk6+VKU(pT>r^aGbC&mut$DnN9h9Y*xK*GoR7g+9UPRPSj5RCy5}y$a^H*HI(uuBPsJ1mmSTK+ z?(4#jbKl}|Z1LR9;sZR*kI1>QcKprplhlk^`fi=s#K?3}&4O3oI(Gq62?2+IyLbox z2JW$u?k>f&peTt)X;L8j!3fKZScCSWU=*}=!o^}_aYpg?sbZZojkPt%6_b~!+?Kjl zZSw`$L#Wst(c9uSx3X_N|F?J#?F9qg93F+B!xt zsj#1|pmZ%1FL)Y2V#9i>ygm8+-F3et#H#skv z^ttbObh<$9QwANcH)wOOO0q}VD`jX;KF5_DTBM8+`U)!;zc1&w@=}g#nIU(4_QJ4C zI4t~l2`-C#pT3M|1h~3vO^F`c0E-q~gQ9s2G%@@Tr|GB2&0@YqaHVp%)^Bz+ESFZo zU=mFq{Iql$U~*U8k?D| zf*`eL zHo|FVb|G@gD4F0`2G*<4HgZ$ZLhLbFRk?q`U}a9s_L)s85WEXQ12smY=l|L0)#tLp zk5z`8+l=_&m+=1Mn12;}KR8f|-!B}+d%3;rwKj9C@LH%l8N3(HGTPuuW+$pNVI7J%*r}|Aj$CG8l42Y=&I1a-plp;AlQL zwARs}lsFSvbO;EB=9azpPC^cs*a0}GU~(0?vKtDX>@u;)k-f`@l7zNk(v6_HvxncRR=E=> zDpVP?#YYbIHqW;C%F&&*B$+rgSgyf@R zz??`;0;&hrsnfe z%T9L8HF@SHoW`3@2lRUt7E5jD!kpYR)|IULPk!E$>W*)`zQjL=y5flHC4t7Lt*jsK38R-v_Ava*}*2q7KgSnR5 z`%;7ztCJ$pA@oa>bD|W6AOdmF6UpT)p@Bi3cTtuW_;m7>fv<3NzKR_#1p9y^911%k zQ3l2?xEl}vrZ6Z|xs8H^XU3mCo@M$GIs#_~uS)k+Sjt?%I*%+qly2gf%JTbl!&bwR=DSEobT-C+Lyd<%!M|=QcQ=oqUQpWo@s44qOcorg=@|=m&eT^m*feUF++Jck zbgZq>=j9JCz2m3}RUY2acWNr-_j=)911th^zFYn=$P*hk!5gF~ys3}Zh*7_w0E!}u z(;4Md=_7UVM?mgSz`mvcQ6+S!fn;7WHZ?!1giOs#X@*bD=d(!o)S?@)86`9-?kfOO zulR^7qg(T@zw%R7wE>V+Sn(6%Ljyfs?X682s)8F15^B(5(l8uz*huIu7IT9poW~l# zF1|V(H62)v9!o^~w7v4{Px<$#E9`Sscj(Tt^;S~ZqcZ4*J&`iD#!Sg=jrHvY|Hk@A zTf!w*>(#uqzS>{zv1%-e(&WLK)Pys1u%)BFtncKEY?nJ3ws&?63+9rLz0}jucVaL2 zg!Srpd3gn#ao+lo>e7%!A@A?e0|#1>3fI&%q_VBS?uHOV9@ga{tjnbQBbf6_t}WXP z|G5l_n8?ROY#ypLZHE$o5H;6Y!0deh1K7g1<=vl!*}Twg3{7*5}G- z#Qs)P+Jf#>mm&Ah&bmy4yK1Dt7wcPS*|0;dM$&4yDebB7xwS^rrF2#Ltu3v;b_HxI zU(0kRduSrLcZ(-rksJH^3}!MPAcOZp_x?TF-+;UcO9N;+NDiZ>6i#;tj6(1L7n0MK z%pjJyiQX`#s(j)MOn3s7Ld}GtNN&!x7q480@*c@(C=>{TBYL@Fkraz$rN{HCPBH5k zQDqmPru>i8Is@u}10x4Si;F#^cRYxI*+rChtwFt&29n4UWB-9DvnPS&g z@2LoP)_5B#{GQUxcwJ`L6;SC_DwD&{`dP1Ts7uE}o`}bej>^~7ppagDpr*%SY4G?P zE8Sslwbaeh65m8T>Ip%D()40|jtCd|O8K8aI$25U*3leEX00G@CD0<7X51o=HHq!I zf>-n)CZd!|59F~O$FgTSK5BIN&EBZd*@ktc!1gG0 zdfonA9sM+ORka~s)5f|kl#Pb+&2zWP9v1duOyNo}8MRY+LM$MEVxnXx(2Y-X(04J-qV#yd}z(cH#NK zJeDILaZWSR*o?4ERn?CNZ)k8Ruh&*JH+5=d54Ugci9~v~w{M)9+DOmeExsU}lOKbY zec&ZX5ypN;dBzTmusBQbB{sxtbYbcvJnq4_R@{mIwys=65IZ+6&pUhQ>tZ~cg!Vw) zV1y*uP!yuiwh(!OQ4u5wgG@CWNs`e>W6J}k zgLxn)gS#A&8H&{-WXpD4QDkOC?iPeuS||tlUF&jG&qh-_Qw|3zc*rgO@d|IyQ`1`> z%tUSN>A+x__^(wOvrZWe1foivSySZ>R4&xU`_f)Vq^_*v`UXGLCCH{N!q0^<#WDC} z(loL$NDCwZLr;Rl#m7>ZdJz{ggADsmIzIujPe!7saX}{tVz?ATT84(xuWSb}g|*Od zX)nflEI4j#+|b3@AFhOm$hxRS*Dt5W_!w$KVWNQxA1Sm9{CfTufS{S1gA9# z6Eyx9J13Zjg9%z(R2H^7*cvUwS|oCK5`T!ZKoAOhESa9+Na>jpUSC=jFw4b~aCK+g z%sZk1k5*yV%O7nzed=iXpZ>1r_5(dtwvyUSH;six$40|WrY|4H8W>O~l+-Lw7Jmtazw*d&J5F$>wJa{nYA7on;$I^>iAYB9Lk2Z~R2h=r_UTl|P=a z`kj$XM=-QfHI7t$Wx&;#$Zil7Dr5=Kx;rZTn`o1N1h!NP)mNhIkQ)9B(HDB*0}y4q z3+MVGIO?gZWO3(5f_wy5`5LxUs@iOJ!FEzoPG~!{7D7%cz*x;rHd=*JWR29BjMJfj zqnHr4{LiKq=uCBnwyAX8{BV=C#t@K|EOd2EKp#m;p9Lm7W1ml2!M+fL0RrL3>U6phqpwNwnz)Yli!n)%YXH^Am%TR+7e+4 zJJJcCg-()loaCQTa;G6KM(dqG7(NV>D<$&N3rA$ zntd5WY+;R3gu>Wm`ZIgN;PgD;Yusf)HcO3tn? zE7^afqq(oEeyTm-Z{Ap!y=G&|+zH_}J|QZ_b(fC)Ki0kjJg)Le`&#^ z_nHT;J#;HT?rIkIc&@am48anStA>Uxf-Wjx_hC7O?Nr^#kE)eeP2vQFWwS)$6$)Zf zmElw$b|tt}DTq+`I%@tavkS>ed(u}D>FQ_>8RuCu`=)nwwzXu^$#^(uvrqvYRYCDc zi$KWH*^nmYN@bOu^L7Q>6tb1UbY-z1ok0aGX~mlz8;6^XcfYX4Z>(s{Umst!a$%rv zQ*TA~ma$j(ombQhwxq&-qt>WSrU5F>P2aUFr=R=Nos5xS@Yz8_q1|cQVew%7;=R3= z+NREsIqJ8yHuuL3iLSYk&TWf2tw?_!K4$d=eO8USAu~|th|a!Z_B{_$YZ2kPv3*zW zs9%0$7_lN+2da!UATn19H2eOXJqpJ!20}uv*6S)oHz6xB_~c0u=?}rMFp1O|lS1>z zY>?SNOCgu+uukuh^Dd%~ab*EELMahk2oRQDudmnFheB3ISq018lc~&NvW~DEFs~A$ zh`{0BkU=my#=F59D2gub0~tePXt1{|yK4E$4F7TCb(cp^#o9Kl-_X?jYT2v0n}5Hq$wueSRF|g+O!3LnqvF8qGvIw0ZSE2 z)j>=V=@5~)$b=4J$0Qo6s=h@@XVB+0Hnu7SgLQ?{S3kQ+5F6Lsx@hHX)d`K=X!O_0 zE!X1RBXM7}%wzT@%E8pjE>6#CRHRp2KYz)M0D=^Gsp5?>zeQuvNgdUtwwlrYv_|JB zosNELJ=yN@?rX`Wn9rm&>(wBlc9hs^7WSpJ7LQB=!HH+@%-<${4D)J$QL%*kd`{a5 z3#yL?lL2-dQ6G@3kO1df%_(68ib`njLJkuyjat2d;u4JKbOYlip>pRcP7Rp@9)OG8 zI_WMv;{$IHInaqvaRzgxwz8%a4wG?o;rw}nGp6MlGA@U)9DL?jK6}E#C^gs?hFY`~ zP`}K)i^v5jXorWEc;jM2tcWsrX`#h&(d8oGTK>8(?r+__t#ixFg!c1Uq)bO=W#=~f z7Ua7$T4zP9!ePPTw(y;MKDlMV&1+FmwC9G8bZc}LM|4?h^V-2=X5F1Dvn!+d->apd zFk;u$%uMzTRJ6=YcvAUw)iYPrE?k_Pu{=GxJipuBHq+u5g45nl{!0f}2BYd@?MgHUXPMI-~d zFLKdlGMg^)Ilcs1Qy)gm25KBOk-_oC6m^Fun#b%yKeA5HV8>mIGUj{os=f_oDTeERev2z>fg{Qdb=^nW() z;MsQ+sDefveH~>-3PUFBSaHa(kO(z`(bUz(=}klEuPIx>84|*j zDO9S`{51XA6^YTI4pY8P_@5)5wFhn=96dBIpew!FaCQ30H2*3razqJ2<|_z;p-^1M zZ`*kwIQPiv!=K$*pILo;^b+>oR#d0-^!NGw9$$BNhdntr0xa2Q@|TP2q(`_W?jN$o z)z+W_#)7~*V|=aw>7o1sEL>tpsQ`wG0mYS*`Yo=JTkz6QQOS$dB|%z=ok5N$h$Aj^ zM{zsIH;}HcK@eC{$&|6@-dJ>I0bwg_Bf2k_=2U8hTE$vc0;mo}C_fVa1t4NMgh$T;3$i)IEN~*sBTocNg_I2m(L(J$B(92o zSyX9j=UzDn;i_N@YXFR{a(&_Mg*7E=1FsQ1dR?;Oc8_M5^&OPk?v{eo=^hXNyt{#@ z@RrR%`yUY1nA2#vypvj8{$N13f1(fO53oKz!TL~*MLS=b(}LMc>4QUAG*@dmv{?oD zKPet0GgYfGU=64&H5v$^@&1nE>@;Mh%d7a$+_;UUhnO0YZ=^M99DgFd6}#Kr zAtK1!gUkosiU5(Ipv5}(-Kk6rt3@S??OeMp5^{t=cxYqI@L+yShA*GLcmng3Q+7@kN*Qa*03MESTd zp=rRRBEX5H*bV*#gO;+86xl1LJOZIuI3$O8CwoidQ5uSaQ#V@zTOi8InG?ZmTXo!3 zW#>KZsme}7?VDz%(p@g2)-jM9uuF4#GPZbxlY^fQvI~cnR&OkPsET~d zG8R>feX@$P!Y?5)vl_d+kYHq`N){Xw0^~BukI9+*DFOr+xCvVv1xvwz%YmNN2Hqei z@1Y&4Acj~a7ov8utyaX$Ie?T!kulPP)b_Lk*(V2!kMPr7)e)asTU+Hv(4+pBv8qV_ z#;)Xyj4zxU%`B`ID}w9IN=<3Z6GVQ_QZ*c0Y?U-R@prbGfowSAO0@->b3#dS_ni4R ztg44qQJY=Sm&nx*c&Ej54wXZvlf15k+V5(P>1-;De+W6CH?gmqxLmFcs8y*H&KrP5 zV4+65jJjXTDAt1f#eC3y$D|+!R9BOXS4M*YyA>Oq_$sr0HbiBg(V~ff<3Ogn`K~ZY@_h;~fdVyF@58 z1$|O^tFG0#+u5qv_g+Oy%B}6xN&eV-3txU2dy(g^5&jD@<0SANkQm4_GN_uoub7c3 zjFO232ZgY20Dxg!MUdJ!(JN8YvADS~citXPd3P$>6fBV{cgK`|mivL3JN$+(;7j)< zDJ+h3kBi@hacvZD32;lY@SM^W)U71_X$JH-fkdNZ-{& zB#KtkEbR9I7mVg0usm)Tp{%VIv&krLdxl;fM;Oq4hgA;SoPkl(2^E3Hk2A97C z^XA*_ZPB$j_DH{s`^ zB%J)z-y=LoCay^a&W_IpHq-nD?-kxgO{3=uPlICTFMm1xjW^)mz9+oS--&h8A)C>} z&CJcnq|gt}q=9DPU2+E;Dg#7gIWz|-NOBV0BDHeCUJ?cqar9-XjW;El!XdA_v_zKT zv^W;zUq~cT%4<$ifjmnKtO?TlJEIQEOK z@x=z^gYYUpq&$E;9D1)2g#dE1P}x|am245Yfc{ z1%eam>4UMZ{6|aj|Ix7{E&gqlAmx|JdliMY1JXx{jbty8JtWLRpf36_{zhgw|JN_Wg+TATXW= zF38Q7>$1x50hx#^v9|JtEEvnUg<*g^;}YMghUo#3tf2hQZr7#a+rp;hT{8vYk`+CJ0{;RZXd9{T z-a0G6KlBhEXdTIPZ=03)78Y%$@N;0B9z?WnLr&idoEPj_DGbq19ps2{JpdyKKP|`1 z72Tl8%?M%MQtdw)l)yNGi*SK!k@(4JQz1vp?mG|MRgC+Qi$^*HTeAorE&8>TF-CY- zj=l5WmQY?`wwKw$vGP58v3ik0*9dSbqeaw`qYlOc$|peL zg5)681Hl?2+3}9#PIe?LmXO~nnN*SycDdDAssbONGu~NaGgK2kY7 z0|pmfGy=UuHfedX-p$`vzp%3sCcB_fXZ2cTeVpXmKIrzZC>ywH?$I2YoGHLLD5n7_ ztsMmqf=aoL1T!pIq8ulMNnHX9Jj^6ffCfP{#f!_)Xiud?3xN;2Iv4+t3o&y@GO(|v zAeG4!g&GbAWHrq8LD6&>*T1kXlw`TGULhh{kyBk5?^KvA7OOgIR@h;3*ur*TiB)Qo z-sY4fvpL(K4pnPQ1m&!R($QhPN_Uka==7M5`CF^KYF!=lZ6Fen2D|t`X-Qq_aofWS z@lMPqI4T^3Y*j|W4nL7!p3wgR#)Sg%lW5`yQI2f!5_+h=;pd5lm7Pkq? z8yZHDst77B1Zl}dVs6sQ&q%U&^7$t3fKxH94x~D5ookQ#lxvTxNpVG#e3kjXvRC?n zTkA_i=Y1Q0@Sa#(@wjjVHg`SOl*^{H*oHwC&m6B-Lac=#3d}>tGNK(QU_I17yHv;3 z^Yz5q$s=^kPzQ*xz>Q<`Ucg$C45ES!NFIb>WY3(RQ!}fv+#b#PL*>)dg46V@$p$mE zwaS-{I^t!WIzQ zrV#DRTAP-2MQA+7fK8cS)M=P=9$JKq1y*|U&*A>(B^s2G9T8=ubxuu9U$upPP{qV| zTeApjeY<9Mv)|u5y9WRMP8JY1Jo6x)*)2T?q!HB(;(WkfA$t){iwxwHCyyVrr<^gC z)h{S`Ssx)ONQuNKrU{v9m@E@>hht6i#;TO(CIWm zkGnqZc3MhIfa&tmt!kww*;qFJ##Qx87G^f(ysdt#-Wb$HbB%S*`s!f!+Rl_)R2OW3 zt*`;+WBn&_ThNd$7vT-?GNK6F7IHU47=SFUTi~{!7=$o?Z0r8DDA7%W5M6E3?U5`c z(p_WkBUh`-|K3^ca8x^atFDyI(=6dzf)CG%aNtN}ne74s58*K^6AV$tCCU#vY}8kt zfjo-#k=%hD)gCOCnKmejqTV6+TrnHOwMwDLzo!&*$e{e9gx^H}%D?v(_OU{e^v+Va zQLv1Dq0{)PTmAlewNuAWUr}G`Qs-Yvsg&W$UK1F1Y7x9h{9rgl@as@2oWjjPlhqjsX$b%~9=jtf9C~sf zZWkm1jPdb|Lp=ClbEGoqYOHlsb*IWKh}Bi2Vdrm@f`wQ8Qpayr(Xh^ZD_LhSg2!I` zOYO9Xp*0?8Nw|8A8d2p)SnDlLzIVAivWl`&OR}C86huP&FEOStw;g$N-T(a(R7$Nex^<817IxMz?Tw>~)r9cm z+`eQ()LQZ)%n6Y@ju_;X(5Gtb;0p5HU~p0NRalLrKM0_hMOg@_!Hl$8h_uS0MCT}3vS`<4zU#J|wtiwq+Z{J;`NR&nPsFEj&JHVg!d3)Q+K2LQ zaL7=EjMA=D#tgGZCWJ&(Ar`TGphpw56ha3@y$=e2^(<6XQA$`&_y*pLt9nnnf*{P* zZt`dh8bFx4N(5<*H^5-a%$xBz^GEpq4j|rHre%)fG86X6X7L98RVF`&pVKJ`ng<(> z68A3BN|q3&Hb;=l;zu~f!eaIbp-AZ9Bia@Sh6BXW0SN+emZ3vEiS(6! zwWH5c!uzIG28|Z@U!Ib1jWtS1Wxc5}Rc~Bslv0)aG<+4$T?Jd@ER!LaM+50A2wUcC ztzZXo^5bomKya#?C7ko*G<@`NLBgMP#=VjHGMz%HcDJGa+Nv1nl1w&4 z$yEjtB5E&;ymUvR)_`|Q#`vzhp)C@S9V>x*2D$gWm_s#i6WJUn-_B*HE$Ac${Ue=J z?qlISGla`Id~T`+Vyz`TLCFg$?+2wMu$H4$$zUjM{&%B05_6>IHs9Z|)8Q&DRj$^S zZ4}>0#oeLX|Jz$)?u>_W)gD3moKkl?EfUWg#UBa>l_=Yx8fuEFA@IZVm!Q#@lG7j) zN9vr2Iaq0`&>M7_f2(wwX1uH%sHqqm)7gb9@HN;K_#W{O?0Zmon)9PZirhCMu;4Gz zfxrNOe~Zo{f2myGS^Uz#g}$EudC+D0t!nC%CZ5Q1Tf{H&BT5mNQ{|^jC45Z+VSF3` z7{ElVStXD#wdnNaR$bVw77f|lprb4<{YVwC*KfOIiC^Q@Rx}*H`#y+pp8LIG6aNM2 z4SW|k|Hvpcflq(nj+&ZUqxgZ=Z9?5W2)$o^MQKzt(1|#kYqHdU!X@C)jpT?`FqF=4rR$V=-$?wSw z)|TxFuV2wv?~VIiI-^oqRul4MW~FOJXEYiA%vT$>Eo^N=T@VETs7%vB0v^GtoTU`@*{oyiGekZ&br!!DF*D5 z%@^_Z^_#-YmEk>#!`>_UI@kAv)KutP|(q%$g>+cOdYP zi^Q}*B%6{la}S9xqT50YgiZ(wS>|14vPs)Cr3#Dp1-09~hZntlDLn~vCQkil@g&H{ zyM=WYJ@EMnN0poJ*Q2Td-ppP6H#kb3;Aec64=nR$d` z1@2k=hwwT`L2}d)o6t8{1eP~pF?#?4&1N(B&A_shMR*Er@Tgx1-(yN>7v{gi8%#;f z0=_2i^W}xV`*`nJJQ5Gg^VbX2!o&F9DSQnmR71SjY+`&3N)$^5_tLe+1tk z-+K$+ChQb`j~Een1BvUkyfO9^$E{A7fiYUj^C;7ah#YF7%mPxB=1}*su%~ zZwqA7rnE`enfE+%h(EPs2j7yX6cWB@;+fOrXFBjpJRvQ!MnC8kP`(bM5TjJU2W4NO26 zm28o4tb)JBC#!`D)?+7>b1g!0N zZ-ILWvDQbR|4V=)!bz%)`Aev90EdZIWH}igIIc-gD$G`ag}rZ2eHr~ zQbdQWfD%vh>-7czU!6M5B7KQD)DZT?J*6tW-B5AU+7h#(M=2tIzF(;?S@RoSJmm&V z$z5LI3zoYgbvA!f(q#$6owkZV*xAhQ)N9|e7&T_~Tfm7QWv};9nl`+b_*-diu34wF8Z_>N%CkNF@Cu@d$?IZzW{Grrs9 z?=emK9`V(~{B&IU|Kq!a8x9LM{(t%|zWcEFovGi&@;Pip$vLFMUYMr|?h=|Mj4nT2 zo}|MPRd(IVT`N2#UIw`n&Q(CG@GwirT^XV8qOTDEYG*-YS>A?i0g?z$js5!YfA19D z89Oxo9hYLQz~=#nf)^kFFllr`VGiJg3haayXj?JQX;VOWD!=LQVg7dhi=eIfQ~oQ! z+5hsah5slY1Lm~@IQ#1hIQ#2moc-Cea0IG=4S7O{aG&}6LtIp9ID3fu6O7F!?rYqi zIM*qT|IFEkaP=vkf96m0w;=yb>$eeB_v_NbT!71+M)w(Jsxw+xD!`Ii^3nvsO%nXe zJn_p+;g_S&hwU(sB^CI#YEceNj=aPy{Yq^|EhN{47 zJBOZ73a*dXfLP+@7bm z4qdyru5<6xTZRrSuD#p1@ZiUn-}qlotekoMXEz`C`C}VP^WVofcM5y!lja?SF* zTd$p`{Kc+G0%_Y*w_ckcHoDIIb+Uj&#`G5Eto$r56I$3JTmzCJH zI(sSq3vG!CCm-Wli@E%h^l`2h{hy3_|Qgnz5h$Q3bvj97{S$i(w?{DZBV()HJm?0#*H zKcuhiJ$n4)yqjLTbw+ID(9+AyHlUsKP`Rune@VM=%orQnDfXNR*4t7wZ7oLL zF`DX1IY#b%{m3QX{r+p)Om2|F-TwTKb_KhF|8s!9VSZ137mYc8pW9RP;Wg1Ii^b)#~v4hYRM_2z7d z!F;ir;hTy!T z5MGJV;W2YztqX+HGb9U4oS&0A76BjZI4 z6t@A~?>~_qLp9C!*!rSBg4m6~Z7ugH*(TCjA>}a%D0uMX@B@a+et61V$-L|mltP-uEzYSlo#p}wX!&CS<)J8CUHHRKeQew&L0CUPvnT@ ztPum#5xXCil+jc|5@rsSXX@&_mp!_J+MPEU`2X~G zuIUQYMaoL;KJizY61Af9ijOWk_KSOlC9P4{?z3agPJMKjYWn4Kl9)-8kM?8J*}o`W zk{&@$8Ps*yX*T?9QwYer&Cgj976ju!cnKJ6H9D98W>7eZ)Jld$Eik&mX=Jl;f!|kC zNKO+D`pbflH|Q=6CQ}GbO4#t^OGEk)QaGA5w=+5?WF<%f;ddlj6}F+3H40Cno=P}A6NqH17U^u@l*M+)7#taTS`kE?c1I`^HgfCdu;dO zQ@r@;OAEiTz=5NJ%;nYSjHXss zF&!bdB&nAMgTY{bu+M?EskTa2NQ>jZ7pfa*;i3UnA0l^;BYY9YO97-J9w1sgI$4C} zA$17_<8Q2tE*?y)N{yN^v!^OxE~{$xMsu|l+VGPV!auZPx#tsRN7s&f7iNcB0q|_@ z8?Eo&Hajt+@kbiI#Nq}uUB@LeD&y;(yf!*Cv#-2r<>r0;BbW8~!d=Un_*DK+!u+|8 z@}6T|H~!+j`IMAP^ws-Xw%)tq;F}xzvf(` z1y?Ty7(B_&jXWDQ#Gg{f;Oi8(4M8};w8A+-t*8ZG^}Xs-T&0Ofx|VtrLQZu z`>D+{w)6%o=N(v>ADXwl%cr$OvK6(p4VBu|`p5Sv_$PKfx3|4z+e7R2{OF-&(_2xW zbSL`xei3tOg``5(Gm5QMV3B3g93y9{n@uk}S@l#QP@`nTpO#o9i2K>7p`ItqITSsP zt80o9G0stj$NYyS-Pr0IALg>b2JKT5L%I6t^#cd1UH2I7F+OG7YuL*xLfHya_f^ks zD-KIl9KcntKe}Ri>vwitcik><@t@_|^N)kd{Ur3)+e}^v7*{XkZw=QlrRn!NoYrJ8*W(;G;9&N!`U%*%mureu|IKF0-=w+sPjflv4 zB3~6jm;Bv&lqOEM1 zWGf?vIC1!jwz4!~E5E|`W!I)+8#@<$YED_Ww6b;QuKhjRKXG|;c;>F*HOy3YG`F`_ zm+_&|Z2t9DL01wO`!oN@UxKZURJys*;Fz75matO?we8>d>NmEVTz*4f?#j!qJux>j zJNT1L{N9ny{55P1rsY2^Zc>1jo@+mC(U*$UXN*iCBX%f;P&htSL^p$96YGL@`CkpL?Mu6?sk(-;ftv=h=6F?&%Z%Q>C9d4+TQ1r4%CVWjgtuhbNX>FY zbcC}n9$688^MeIrQ77EQBldibesG%+rN67{4`qJ|HadYqv&6{O@3PFU%gEp8!-ST zWk8imP$4o_Sh))?8r_piT;Otr;?fJOGnJPX{^WGlCTjyUWCim`${_yRfxBZ8SJwUH z+o2CM^rLKZbx=rz&}^hAsJ0LU5|K^W`Xz&{mG=3wYE~_o?W>3^Sg|2{;FgMx(Jj|Z zAG|7Fu8B1E#dUU*PEfjnPJ{HgCf3qlsk584y!?wdGO6Ui+ROL0Ub(MzOEVgH3E}b!ek#bHLhq8t?1!nvNEVoyWk)2*@FPs2LiWSm zp^}k{Uq_ll2Af{|I{Eu3=yLJvO7thGt2sjZ#YX!j1!^k(d153VXYQKdpvZF*s| z%`22*u_R+q*@$5hN6T&9sF}=u&!CQnSHy(^aXUhwe^1v>C`QCcT=FdukD-^dy zGJc@UH|2*Su^N-hr192v$MD?(w=(~*v_(0F`i(4iNt#Onf9;;_PbvvVY>@(VW-myaFYzVyshMSGqV}+K*BO0$aeA~>{HZfAjd&bQy$x^PA zr7KNpCD^G%dIRESP9yd%D4WszDgWu=mxjM%`p%%}GfPrFd3UJ;fX1Q_Jth|P-l$hg2D$9KXfBpVu2 z!Ec@W+2wN&EUKP=^85R$R>X~>)2g<4f{q0zHnsVhMjC3Cj12gik&y72#~u(qvUp9y zj!*A?x^i5 z%kQ;!RPN_r4b85Jq;2_codBOGuXHrW56nC@^V-U3=}+{R*qUxL=reJlqs*PxrM$uwV>fzJ{NLQjIK(r0LtC2dqlYCM z<|D#^#ThVWB_c;MBhnfwz;Lm?m6!$09knjTR8V*DDCU6HbLt#`;{bCod7!L)xT5vh zj3Vsbo|x;c(C7c4wRuC%d*{6P%!@ORRJH~9TTChM{rOb=%$hcLVI*Zf!DR6o)ni+L zi@niP$)9nQkDcmq>RYlTuU8@u*@wL!lrbxMve}^|>v?s@o z@=f`#E4)GejMGPBMc*jt39L_)P;nH=WA(wnX{r_CDxl>6LL*XY8XQJMgNxDv(Vu8U zOD{dq!kw>@SBM(002hZ`CHY12YyX(dKc9Pi${HQaf7`^TA^n~EpY~0i?LfL z779}E_1BN*|0XXMwhP{D8%kGrygM+#xj5dP^}NFGsbB?YV9@v}6yvWQ4%E^stCT33 zyWlHlCT%Q5)dgSozWgBzzjyM!y1<)C+)2K;spR)09lZ_v$xLSe8E^r;P*=$>N1B)i zdBH8rEOVk_-%=w%o*#R^U^af%@$so{o;Lv z%`MzKb}1J68sVDv-Y+~KTL00a&YT`(h~5AsyPyP=O7$p$r7l*EbwS0EI8PUxbI%mb z5j*edg65cd6H^^1P=W5K!2j6kyO8cc?b11_1B(z)JUjQZ%Sd^Q-1WWvq&yT3t1**e zs-tnFp?b;4jI!p>-9NVL{+FHs66V&$tEVatQ&DwHz>OE^=XzT}XY}V^~9#qyTSN;Rfjb^S_v`&(&SzQe@}k zR|pb8S>c~DbBcb!NCKf{)v*QB*L9XhdRDfEdpr#@91fq5+w)+04sU)sH9Rev+4#}1 zHAX`)8i_1<^w&3jhOd8PpPZ>nVcwQJ^*{G)eP+)zov!C=M{fG@tpm+#jts8-^t}h` z4LV~v_1V~(e^_x8@=Z_jjd6pq3J2N5o2)XibM%}ZyE$l5DG6>-G#xAu#VX-@H+`8I z0`Y&pH^0!V&{-5`-oI1U>54P=-G{q@;l_bHi%sa|DsvGF$IJi*vLXhfK?zfLiqTN8mo&1aRMeupBK}BLj6j6;S?$XF&sDnoP-(gO1)(Yb%;Q!w zq6m^!$#2%#3}4FY3Ubv^DqLpLk3D5I3S+{(di~g28iY3fZqScWpE9hKGJ^RtQ=FGz zJ>sYm2nW}I8bo3e_2T+a36EZESgin)@XAPo5P?ba{#*Cv4_m}jmi*zP!u9uk?*78d zK*^kZ{{#sRJo^gF(-U~Mn{+tx3Y47_L^S!4wi5~sD@PBfMPy+OS;@FLx5H*J0c-D? zP%%g%qKpxg5@kR(;BUnfvZDF!%&q_S$)k&-`o_;SmoyxE>w)1Hi*F)qFAE8Y6?bpv zzn@R8-Cbi(3J)^HgBon?sUvtV54Sm|bs$uOMN<^*r~r&8Xd>#-j3RQBhA0L0s*>cP zt<9{c3i+A|BI5He0-y(1dpM8Df&!(2tHTH|A*hu_E>Q=@g0;6Oj=(Bx*_N$1_3 z`ji2~F>bgjdN^9Utz(#QCj#Qg>iq9`wIaOyfh%Z82d@!PO7M!>X%Zg9T*Ee0%)po| zgh_@BWyU;@E;yKCxKs|CS)l}Iq#fjEx1KzkSR{7melxu>bk91fTy4sfmdJX zA#_u&YW#X|E8z}GS%Q7`gKi*JEKtUFO>1jO*HxzyaetZHrIa|LjD;V~C}XoBnM$sZ z69!fSqMz_63=beGm=vebJMf}%+%if*Au8Ncn76!ebiU?YzV$PG;l530uCSJ>wd%%n z$*!;P!tGlg-_ce!=h*A{uYJGt8=qKwWKECLXj9fS9XNVx|K(piKB5*g%lqQaa!EJu zo}V2tbg$amo1EPm%s-@XfNk0vvem}LM|j)Uw>Pi8ZbsYA&C3Srb>IC?sv%XPo!&fL z@0xkywHqwevshuDwB$Bi*OUMIIj*oc!&+Xds#*K7Js-`VJ-yQ7ZS)weN~Lnz zwO={7`S1+4>?SfltBm$9aV$P8)iF7~ST;O;c>hAQiFpt_ipwVS8xGa-||ThVC30G zHYYyJgRR2Od_EpNAEE$-_h(Jg&GN&t-OsR_2fahz#($?XYgis-x*6NO>_VM*rm8 zWTq4h+o0?Wr%}u^*-}wl|IF8d6zghzzU5p?h17cf7YJbej(`1pQ>8E;N~&Lo61u6( zs0Q4REGPwGZngsl2j*&iYtihS*ynh;C>Koz9NEbmm`qIIYv7kqIESW44$;X-Sc-Hj zAHi(hc~Hf!g5%8dSkbDA)@D zf};O37Y3>OgOvljR#h?_^ten0JW3l|WkSMyRy z#qfc-%kJGZ&wl34rUN(L(!cwg9~oNrLjJu6wmf@vkIq(R5pNZQ%$gHRN3UDeHqFhtMjrnC9iPg7=Z&lSZ~WTTxxrY8quO=(v%5Q>go#%P82__p z|Ez#L4qj~9PoOC~`)BDU>2U-&T&N(Y?vDsXQuur&_M8Ijj|v5w5ta=Mpud$HZPJ78 zlqcnKTFn#}iOS3I-&)H(E>BfyZLGqr z;FMa#ipiXq^s|h-rTO#`;+8F>+^gY&!LSg-62sk|ckz@c7!+^;o-0Sc&b^wc9UWX| zBv`|RNc#omg@o7#Inasco$46Us*&!=xhNTmf)+0vJgQE!Qufp%j7d+{;}|;O0uW|q^eN2IcXFi&}9`9 z4mfCXU>cO$;w*mPu_^D(|9AdbGruPP&2wV`Nq)p6d~9sVq?i8KF=4~xV8F>^cn5(C zz)!TYbLydp03;9+Sj06+YK{@PETPj%eJc@l^^|(tPVgR-a5_+cgH9cp9>T*x(qPvz zuclo`E{@9kx-22|T_10;}g|*og2WJ8x7m~E^ZD?3? zZ2tDo-8fSqd5HI^IQy=&2JeHeg?txlKlywJ?1c)PXAk?AN{jzIj@;b=z?a+DM(xZqVfDt){XJ;UPIz<4*M3CVCj-e1Bi6I+6 z9ZuK)wBlfy6Q%>94GUEhm}qRF8C-v^9sG`g7;;s}Cl|(#kyF+Od_og(a?A?RsT4eQ zxnnfxOccw=(;{`_WwJ}JozuN#FeZ4~*Yw|MezJYztfaqfadYpcSs4@9>ncWnxO3U< z8?up}RjmzkGESpE=^bV>6!i;h3Nw;iadOM>rPIsruIOCeMl^sGl@$iV!k)p}`BzTQ zZC~1Fw{)&Pyr6qDV;`R=3?}uE!4xFNL_70NM)3O$kYA5m_2hpx!`? z9nC)=XKJQ~@oKr+5M~5L#ZwYB*~oblGIc({j-YVKx!IpoS$7^gZGMW4zI}1?j7@`S zlUrXg@4Ne#-LbwQ(6+E)-Fj1bA?(NRc;wcJp~fqG3;PCY7hKufzGZ2jGydtDDB%Nt z?d+eGJvi&N+_vW`vCPQ14m?8#&`)bEB7;Ee0)<#IGSeXKrraJKs9gL4m*DUhu8^s+ z3m3~i9AK5GSOiBGLm4Qo4EaHEw+nc3%t&OLAd*chdw5avxsUg6@AH*h{sGS2^=e&N zweLYA0a+^LRsY6oiP57g#78dZ@4f$Y+w5xdd+toCLLH3KI{3~5(F}j+rLxqb?8%2-%7j+*gPzSyy}}8_ zl_afzUL}_#LIw}$yJ$~N9McK^k;1z;jpOTZ7+N*6^x$y+rG4I#@L2Z{%P77$>!rhL zZCQ2MgGOM8c+CDrzt00fd*Sp*a~qqb{`9WK*k_YKrk?}xG(m35D7a}$$(BS8KM}!MJ`Q~ zvppzP8&{VkXi)~y0lh8<1y^7GZ@lA?;Un8d!>#&Chdnc}abWMOC+4>8cx1!kJ1?72 znt#<|5lRJ4XW8_z*RDGG_WeV`y3g|I*Y|kqx?{6!T779{*t6`Df4}q6PwnrjUw3ki z&A4&yJ-@ws=8{L>#&9v-t!MwLxQXQ{o_)?P)8EK@3`NTL7%e0S052gSz|tthKZ+wo zZkIeS7rhKl7cQf{b0h0|KVy4uv zXBreYS@Mf^PMpI^{|cA^o0?> zHBkKv+HygLNV2p4T3Tl zhxpr?9S3gepMTem?$q#(-o{zA_8B*RWq0otD~J4PgIjBgPv0_k){enQbo!e1ADiA@ zaByKNIIn_YjRxH}8s}u(>6OP9^&Qwe*JaLj4@T$SacP&mvN_ae(*>e|c<-`w zbziOP`po>T&DkYA(TY?`X8_8c$>{tEDaGuu_hcVS=AHDM#@}*GihP0~^bezK1PYB( zwIVt#h~hbsMmZ)IhkaRuVqWMLoU~%d5&Ma}u?(QHAopb8%_(<~N9mRy$POp$qDeQy zi!0tIhqKOo$MbHdWINhMV%$kCNdZ4{%CrRUxq#1cA-y4`TnxfF$=7JqssH%FA;E7> zaWOtPI4E$#umf~ByAH0AyE~_?;MH*FB{gNKs9#7mPB4Q^f)|752@8mtnt>9npjJyu z=sdgS9~4V43k*k@zTh1YafK_DOJG+8r`|Q1D`SAlMkl&7)K(`Gk&wU4=OIXCMJQTY zgjC{879f>!M3AC{3?P<4Sp^xPEOl3i7N$jUsaY>5Q-kX}uDV($*i9>S>A`R|Y?pZb zda>Mb$FsBfBGwQA99Z^x;P(p?qSx}m1Booi4|IAj4+>3hG+ zkGQ=2(%fgSJv7l1uWre~AwhrUIEGAhx`)9x1&m9PO#nS+ih#<393(s?%kGT}Kx&Y8 z(TiBjiGUg=8<3_9s1YU;d&1gOQFWl46k-u4P>IUz3cw@UqwJrNT{Vy__0@!`m(R|s zeC304=Ebt}Tm7MFi?-~W*0*7rTh)25;a>eG^-mg}e50i3TC!g3_a2 z0u(+W3MH8zyJEaBBS0l57rP)x1t{pZ+TGdF77aV?+yFnIqy!lWIe=_Ml|uy)Sg0c= z@>vlPMA{1ItwE*f(FXKf9A}4O_3Qjw^(zMJ)Dm`Kx})N>KL3l~v|T_m^k;6NYkAFxQfCdbd=&Gug(nXx8C#sttYKR5=yg zG@&<{4>eLr?o>{T9_&(tSE8hrd8q)7OUS_xqzmCB5-r$3Wc#Sl*j8pP_9;n2l0-|; zQ596k7hm`ugq+HKOD{h%@A{wKHP>wFHJG7A__Kcl=HLrBb325U z1J6(yfMu0d&~aN@>#^UaCnKU#WLO~*Wb~0Be^fH*BXXbFM|yVG#78+h-BA2(1kO+r zp&$j&Lrg8p@cTajY*->rSPbC6hvYjhY2qlWGoI)cgG+Q~a?`y=ZI)vyxWB@du|GO`l zG!B~iX%~GHPOtY2$gcy&22Adx=^X!}T+hGu9SC-~i(iCzWAS^itoW02?znuzy5&n3 zEgYIP&>!`H!#WlWM+_7^ZI>vKQSk02TT?6nFKZ%HzcJ!m*5ulvmx|jzD@V+WxGfcn z4^UYu^@nR0J9vk9Ph!KRJGZTir$*v&uoS8-PM^7YQE$Rfmh`zQ{Z5V6qKqzq+S<6J zGPZGFI9RoO;S87Rjt<h%7rtWsyp~whVMJNb6$0M za0XfjYgB_beEzb|#Z4}x%Ou@k{s1)HBJIih*M4?R_Q+k2j`Rta4Bvm#j*;rJ;0%+F zS83FPH{ymxbc2ysY6rbhr}nP<*M4SB!}a%keEu|K7rEyA!{U#`zrzPdHFLs@b}C3I z;XgnyZAS=`^RQOaELty6B+w@eLcc}Bp>m(s?XZU^3Wx$q#@ozFumI>rwrv~{E>?kn znkC>!%nR3**VMHp2Fwaqu+nzB!CMxzH}yKNI<;Qub!=Rks;buCW@?Xb%s#RAiG~H% zGM8N^4kbHcmL>L5t=0QgtKWfRbgkRNgS_@(7OzCD_@=5ylT@?a^_8teud6JnY^ zjH!xSmn#VekQA3ZC<-VddXN>Sboqv&@MT$F50F{~G*6lQ`GjQ50~XCtHS)lbA_fNnXu`y_0%;74+tmHu|M15Mv6 zHu^VaFzUuj$~Jj@mDXFGRhelC@$ZF!SEh6{?2R;FONFbH&;OoR8uI<(yZLPC-`-Yv z-QTWkj~D8Aau~l|9{+P8_<6ut75zLYf05sS=q`}ckcq2ctrL)m;s^}MzeT7uHVf-c9+}jQkIc zQF#kvB-r%hYdOA&*=ow$ciZ8^`B&r(TpSG98xKQuy?Z_$n>H)ucPZ9abe1rZ55;3E zc-f$Sp*cU$^5p&}>(GPqsVxU(lbQcnK8)?OiNF2K&GK9}AsBEao{ugS%)FVvV^eyd z@Dc!%u|EZ*C7BlNxC139ZO9L9d2-UTgcahYXKtQ&kZe;)*WeiphYekGe*F%Moa2S$ zVw?gz+Vj7_VHfYgHYkEIiLKxRDtM+oXc7(^oe`(vuo(`dU_MPT_zQCp5U+07+tszE ztD;~%*%daEF6wSt(G5eZG30H^)|jJDZq5&Ed2&A_=Qmo;v7yGztVpIj{|ZeZCXD$q ze+IaYcns!HU04JMx_^2TQcp$vbrJ78p5m-H2T479W-La)@=37ei4^!bu;q4wurb97 zkv^U;m;_md&Q-zV$u{6J;fhpz`pgn%&>5%?TKHq0?nuX$n#Lp-gY^u~&&xFa-e zY2JWVq8_)e^|FW8ANcu4muPe#df-)AGQ|Ww))(RL|X-+x_YQI@8#_ z6#Hs{4eG&MRdbi-bODsY#3}?05_Gcr>?b5_!2*QFBOjWq5Ac02#?E6fsSxuC={gmf zIjK|?7rIRDp;^sUhe83?CN8LhO)_2?QRsq>eKGN`V(W9ejm&Wn9V#b>OD!jvo5@^J97WOiu@I!jG|itW@J!BDb5vXnE%DVxWLci}2$K z;qx$eo@{0&y{#HwMyyG?vXRGcy8E zhXv?kqSUsC-y_MoaoK*WL-l!0N&fdbr}-ZKuD?EDH7h@%)BoD&elUOMw+d@zHSl-X z%=ugNRw2OuK&Q_?Y`5{%-h3jz8jHkpS;+nG;$1`B-kcUy=_2|eGDIyI^bv}zp(2J! z;7N56g+SQEhK*0YkmZBe)r_7dD9eH3#j;WlaUnD|q#hzc7W66_aT8G+Qh-6$=#c8} z0lWULtWVZW1ZZ0GKQRig8voWhDNIusb}=Ty=b`L`D|d`XWoXRPu|A)`nEll81i)NU z+dy0c+O&qoft^CDgQSnlkcOR#sq%Av^rS{wOUC8NMrWb%DT^`5_B{Pl{KR?%ovJT1 zbv&}Bb6KNVlX^BKseS24a$bM4HFoNfq8faC)}q>lyZiZ_`J>UUT5oytoH~98u_L@A z06H7l9zxBe4;capo$Dz$T%<&h?dDZ5lSL|7Vy|6H_hUbqZIB6*px@L|X;MIp;=g!P zWc)4S#@)|0h32QtiwuTxvj#(~7cH+=6W`Iy*MbZ8qNh z!WzFZ*f_SzT&mG(x?61vuYG*&%@8E>mD!ppm*4%=lE9&|5 zNPAFOYBP!l>zC~9wbV9uhRjjFZN6mHs_kWAdpa#FfAYX!vU_g0bK7XA6-_J-AG4y{ zlhxFa8K`qKZ#ub5=hPv1HNDQ2tg3}$!X+UaeV*r3LJa!%^ zhW8ox2Tj}ypr68gr3*1UN_9qYk_kG7v@@kBw#w?^1H*V#=UiTl(@nZF~QVL!B7WQZYdOyTnBIkU729wjLFu|#kvxviHKNOV^ zv&D;-$BX1%iM6)z9vIVRJzRh+Bd~hgRP6-K(<(%i84X2X|cksY~mbQzXZL zzlyO{a96TeF6F@(MteLTMgiWb7;Px8^Dx?QsLp|B<8b4DGU!^qgBsUSs+^Ew(96MS zn5D`^Ho79{x~SrcUYGdQ-KEpkTt6?;5mag>QyL{dGm&m(6%Vkrx zs^~eppWuRI29c!-cMORa`l($oQzNx0#=IykVT-Z!>4gILjt8|KlgsE(zM;@ahO%JX zs|k5GMtVCMokz_f)vGErwlQe=y@s&)_Tn)SzG$s+j8*8(NZexq>EVLWq`I0sY6L+w`ptS)?tVV{rXPY8d){!$9RQWEyL1)qNv zZoUrIN`l)U+X%n{O+i4zHdMeoKxkqdk8$x!m}P(_*d@qC1Ov{5D^cPoaac@vj1C71 z{m`j-6HC>hKMvqevv2ysw!+{1 z%lPJ-KT^MFPwx(`ReSSC>K5*r&VQ?E^L?wYe)AKnLG`!hnm0eOitP_a{^9>e-FwH! zQC z1X2ir07)Q)Bu_};dBQIVq&~rD{QI7nRk1DG@Vhgu*L6-{mN1co-FD;7r(o@|C1GI3ptd>?t?1f{>kQ}cjn*g$o3T;Sr-U;2e%a(WM z=C%zk8*Iz%YYoq-D=;C=Q3g44S1gZ=7Bz32m7UiHTeU5ZPUNaWQ%>ZPN@kZ7^|v=v zS60>fb8C`3N$_xreemjTcRGF1o^bK}SxwQ(iYm`Jr*LE|6k^_-Mc*xCei^r%I1iin z%;u&U)$*aH8ewZJ2Ya{zAm)o*RN#I=d#1lYz2OVv?Ct-lFHi-9|9wZSG%Z(bZ0&_^gFPf%}G{fbyzrLQ? zv&u^g!v%R+890Sq$QF{iaH&&Rd8?f8Udd@LFL^BcUzb0Yb!mbPfTcG9aUHKWWP->_ zZx|W<&z#ggKNT{uDD$$%wvz3Clkg?%BYE7{VmSBQpeI40hWQ3Xk8tjj-{r_T8e|W= zJYWJ+3-E=LkDTVg1&9_J+>D8Wa5PKMmZ=qJf0}S2`7bCM+x4f^Ao!EC?Zb@(4+J6K zCDi7HBPE?QT*M#or8sS7{esE@oaL$$_4>?IjDcq1rM(khYuwlsvfCOQW(xrCm-13T z$AiHBF8VZ$%Zuj3BW7AH?agpYz|La|PKw1RH#;^sxQK%i&|O0CBN5a&4M!eB+0zsA zr9_0`-~9JI=d^V2UuLHI*;HT3%YS0;idmCQWbf`~Cnh~9l#Pq$N`UWcRepoBaE;tM zQ9~GZQB_(T7@WsXf@nA(Po$tSA`XC)ndE9ZJVKDhQYJcrKE#aG%NGU=0)^@9_H*7D z7BJ+&hRHim(*nX)(2Rfz*l2C=+cPq918_hCGdb>um60_56n+8^CuxWf*f43a>&JkU z$oEwUf(aP-f-11Gq;q$Feov=FlE}}8KE*4F2ljT>EUZrEgNs&esoqbViEH-EXx)+B z@Yn&3A|Vo-)dk?Uz=CN)d~x=|Tb}RVx~p>K&3)ZT6(tb|0l&lZ_jPvc8;HF0^z4(j z?ps(~QOt+V{JdtgHER;pjG*GPA1ju_7u&!ch?>Xo-qirTN}C@YoChah-xNGS+7Kb_ zB!P_WFXjW1aKIsyR3pfm0OGu$<|zT?#mmbJtAVS}8%Kzv8^Ko_v-&TK5XV6<>Dx%0 zRsz(#Vi}H?2p>MHc125&xxyW#eWn$~eN`T3PJM2;qde1KFl$n49$YwUTW3aGWKPwW z0S#o8Hn`ZpnYM zAQ~`#+SqLZSePMB`vD;f{TC)oxCfZr_TpM zU%K2R3i{IJr1^E}A~K*^iV?2lDgrP^ix7S{HR_E z17=d=+7^$#fnCB%<>#n%so}IaeH4U&wa71v#TaDw?(O9f(RZQkI@XJ%!_LVih&fb- zK5j%G2f4Q;ytxE^ran#v3rh=yLg$&zP)%E`99=txp*16 zPc-d$ib%RtDfwPRo^+{FbgxSmz-WR-H*5A8)PO{>X~k?>lsb&9qSJfB)IP3*W|k_HjRd zHkn-W6PO1K0L&@`iIF8O#hyyu6=?+I{-7zHdZ}V^=StZ2OBIvvCb2GDs+iQhmwaBV zeA)B$*Fir0@)tYIzsN<1w$ZCpw4G#dP^*fmqUYEc$2-Fp%K;76E zrEI+rt#|>a29=Cjw+?5Az|O;)Jp|G+DMoB1DZ09TPNzebPC83OzYI&H>6G)Mc)TKj z5lCEz>g2RWZjZ~+J!P%kc<-V;Kf9-YMn$_umynuJz2Uwk&Fed} zG&=S$`K6YhwJ1JOjo^K3$cXyms690fT4`pQ4bfOac_ChwoHoS29R}`Rqfsw|5{ke) zKu%!{2@L02$Rn>9LAOg8S18C?7B>a(cV5*D5G)5>3kNb^|?07@G;r~=NYvx=tRMOqT&#xQJYSK8&dRJOj@`o)O z$~88PMHlV-&fb8K;)v!oMl?%>H|SdB8*8GPPE1V#JlEz-Pr-;Dytpyz6dya`+^R zfA6})du;A+;4t7eo16CRQP?44i2thOW=3b^VT>$hofaWbZU-SiDE1V|A{D>^VnV}F z0JOGD8z?Ox$y2k62P1A_I6KpmniwBYQ6_j82(Y-qP8>P9)B!N_&`BdvKgBl27&X** z=h94OnR(qC8v16JT79$o7Zs#zeW={kGF+Ew)*2MG3;*%JzSoboZhD>B?rGb(Y__ik zU1-Z_T-~?%wVQkR)x!^L2b%c@r9Ymvsow0oC;#yeUeV>{`_;;>W$On{{qFD!toYYE z62mjHJ9Ng3yo?2p{gdQ5bPrB(LU|jwzH#18zu*lARRmzCu>C3e;N|sV);V~ z1&G67bL06tm8ZFSvSFYwDe{?4%Y!rzRv@~Yn4&p7(`Y%31gNJ#G<3UGtD6tGHLPo^ zud6643=>=d6dzWL0W!lLp$trzdpPoul@C=QrhJ$YW=H?SAkaU6V@B{-@OmUPpSSV> z+XHGo#kJmH=-l_@>h2wL%WSQQ*ar@2+(7 zk863O%WeIv!sIQ>N>;_46%#hb>HL2AdhAy3Jw|luo-* zfNHMfmKanHoTBNq2>k_*-k_D4%|pN|X*9!{Hitu}b5uAg%F7U>Qv|x^5CL`rexElT zDLax9;+$ra&ZsjY?WH9SS(%x~1*{WDB^zE7AF02y?u6lf%Y90m z^R8>SH6hOU7VBuZv*Cn6&>kKZzk?Od$`2p@Kdd7$949_`xX9)n`<=zcJ{|iVpFDiH z(B|fI434qC^EqQbCX9@LWUidze#~DbxCs1QQ?vnu=SV`uVY?9o?R?CXp;js77vHZ# z2lCkJRH|VW&b|F!z{e8eU9jbC2!YY5RRA9-LG~i0uP=r-%8ra}2#sc5lgtw=&2Ea^ zNk+f0Gk3h`7QLPjd;j|TuH}Drz}k1@>)Wo4KDl9sVMmzZ#B^;DJH+2`^;P00Y=eF0 zF7eo++egdB&ItDov0Dlj9hs-GXlTp@ZULCMOSfM3ObMjRo6*`Z#s?!PcHA)~)hUr+K>WkDR zn9VTVLE59%YH;}IB^vp8b7wX+)KyjFWCi@`NQsyjulE|fGMT(d>NARQLVpQ%Il75g z!{;P(L(>ehGie8pZP^MrZ(1zeL_WL(Gy{n~swI3OAL>B><28pLsQ>qd)2j;$mt525 zaf+wI_MaKj{VQ5tctTlca)RSD>`RUK9O0I}mT*qbj*gCf!CXz8#ggPN&I*+JZQ+)= zE#a)rjV*0k0{jR0z1x~ruN(Un|7`x;-5q_mZtZqBGsa%c;1vnZF)$8~sfm-(mYNms zMatFO=CZ1louSg48oeP^|TCWE97ZZRH4B)q~ zMok@FUSo^1YgGz8)~)Of44bv81ehcygAT!@2$dL&bMQ9XP%FqZ)PfRfK|gU^Dm0p9 ztwyHT59={_`SMS(B22?Ax!7G|Rr;f4!JyF?oEx0m*W1%QtFvw9jK;cXO_eMO3bEsZ zyFDi}LxwxstVWB`k^m`?G$93$Z`*~<9t3#6CgBS(i6ug$#N&?y!Qu|VshkiDBozek zX9s1eAiHoq5F-^xtKdTRS4j(qsFk0Hf3&{oIqBjx3S+YIpVr4J9)8fq3)Xbg;3uqQ$VfDcl&MvF)+ zD7PGxX#}|dJbiGP@_*`?Tf|4ET&;>(|@6?@O%3ll~D8v^LF zuy=N$jhiv|(#iJ@_DY3L3rI7dT}u$8s2q~e{KMlMGj=J;-s<;CYBdx)66sL)q@_uc z4RSn2evacN0NlOVNo@H8zBIjf!km#ktLufXZ&_Y#|5|%rek%JUE+^&QvHwm>X2-1j z&Gv$^CmasG8jENZfAe+3tFQ3$o_NRD*S*&3&{VYbW(cV#(N;H?8_l-c%qE;_VlKl! zf_UnfJr21wo}Jsxxvj~`N^~6)pu?yUc}xCAuU%QyvTdr5Kb zcp}p(1`9#{4TlOO++|G{d8uW13er*k{joF0{27@K{#yLsBVtCv;Qr9{hN8%_)9&7; zpA9~H=T?u$x#PnpYx>)obJKE^v*H(4l#VW#=}O3K4d>49s&hP-xcJ}$3+G%rHz74? z)%6d}ZC&l%{1xRLBQJ^nd*X!nzb}sTtDk?CuguRM8{YU}e)k>k9X$A}`{zMq=cKMU zv%0mhbo7qF6}K$N&g$OLr5|~4b4|nkuV1m|r6ZlyrD6f{l>J%Ut4LRV2*tLMn-R4( zMk_O&IB`b=R83)IO7=C(V4R9599vFyR)(y0%9&^qNaeDcp>k=Vzv%H8rQJb&hF=Grh?kG0^d?ain3kGyVgyoQq3}Kt7RO2S0J5iY-+<)LGDC~pP=*662Z6OrK?)6Kg1f@+WOTW zUFkrcZ!(ArNA6!+zVa1jK9$O+!am;jOl^%hGtLpJ=`Q~3LnlkUPIglMlGyJ7L z9eeUGxx8uYm+c)q|FqrxkHj_id~eg!Eaw+{RL5-YZ|MhG<~Z~wgV&p^I&+l}3bF<# z0nQ*3v$4ncV){)M*Ai_4)Y-sVj8JM|K43oZ+!6$$!UsjZR(Q7!1}NOveukBx3NvOI zCykCYD`J9>49aS;NS+-K7mTYDOfo%UMh1 ztSI=d`LTt^5>kYjV)|nmfBdmG9<=Wff!ajzrssBw zRmjYKo4CT7#9rC?+)glz{#@cGTnyVk6+9oUgrc><;%secn$g%m^Oa^RGb@0kBBU}# z8aCGiL>ZkU4KoHjb|48KPDL59L*qD2g^kOuoD8ACn@ut*VHT-n9cnTZ{v6i;1T4kD zvl9PX>>rWpgh+d&dO>5J#bi@^JHEMg{xu8oOLA{Y|6xXNh|NhCt8+Um(zmZ_UE5XS zFga8?J-^+%_?Bfw?!uQ)M7M zEivA1#TtPCpfv)w$vHkJX>S?#I#Em>X2-efM)0rw`jL)|naiVW`^fRKCXL--(Sd(Gp!d_d2`@XbwqpHvk^4P`)(wc`7Jccjw+`I7WtL6JS>`ps zhm?|$p*wST!|h*XMZem~ZXmA_);s3~uHaLw4J~BF3}_7h zikj-7(^P{e$_v>=mKz0_o%qoO;Cf=!NVv6KrfJkU){8hDH>3An{b8s-uE5y|_AvR0qu z+Ii-vKH0uU@g<90pXkj`i`L~gbvNZ_wy$oOxi1)2+w>Tsl3+tq9)8XXHjmWSul0V` zQ=rrc4(lp*yw)hmV&FqqG4F3aIQe#}M_&C_G`{{M-p5EQC zIkNb0Pw&->Bb)gv7CySat!@9K3&*bHujsgPu%u-0%8s!su{4jeIE7YGh)-(l?#NSt zbxkg6JfHSaklr zR#u|;ho}}6!aok3Vf-E@>|`6n>&A3K)n`@0E9}S6w4^a$ON0;j-=I6IWmkI~I*(%` zcqGU7Ko8^k>GADJQ7102jpzT~{|xpYf$RzooLwH_M`OLI>+^&}e&J_q5873U81f2L zFOa8I-~z)Pu!srVMKo088zoh5lypBQhKPq~LzzCh2F;LTo&C=^iv!Z_W1t&J3pUY^ zvC5=^hVF%7Z)=KP&^po*%I8(3JtF*N=ZlBu6@!$uO>b23nJb^W?$b74A3hXUvOg%_ z;hf+k0}@d>N6tb!EOUSsfj*n zq93VcXv>w{r10HXBkT_q%dTqkwon7@X^Bz;-+tlGhYJmsHiJ>csCDqI;f815!D|$^BLD}wa~~iPmxDu`u8_fQQo};zw=Lt1|d^*5_Mcr2aG<-T+DGR z@PEXbTP3v_Gh4{qqB{AnN>A=QzdqvTSeNz;z##CW1Eo;Q}XMVQaK&-_JkmDEmp zCfX_2#|=U)D)*Q4?n=%Vg$qC)EL@O!4V2I9yxUM?&=sGZ z;(xC?d1m_-1<_HV)FE+HeFW>OoB5y3_3=p5hY3n}ja-1-1*I~ZauUHK0pnB3I6v_b zD}!cCKFyu5w5`x__l33cNQ0GY;p2t1XfecUg(jbMxmsb=%AvK0&Kr_jdePc)`%oMc zL|VU>ts`e*joR>j-CVaH@-icHi*K`DO(e=Pri(07AaFqULHJ&k$U; zX;<~)qdjiRx);_O?BxShmFov;4J%$;p*IxZd~ea*&a@5Scz=2M@fC$CjY=EmPj)&Y zZ3Xf8l3cT_IfTWy!EIE?cpo7Y3N?-^riQ$b=O_cdDgwX#b2w z8?xiG_!H=_L2*>dhm+5}BEva-aNr`#7zkz6YBXD=$^p{}g(g8vFsv3q2uqBHG5Udt zvY5UXElaaKW8%KRYePSVeT>miVgpgDV|8Qqo>COP!Hw85r!P-b;m{?lNuGeulWC*u z*wDNvZ;#|@Id_K3SkP(m`Gob+jSp?8Sdi~6@YocY$>zACd5z%(#m!5i>6!wAf7?$_ zOR0W>DPD#&No&P*^RFK&H0a_3$#IU1nI&n4#EOABcEjQwMfSW{`XBUb!`Y98FT;+i z=iuK8GLn2_cRFF(F=_O71niou=xb`Dl-UMbl>7MpDU+`KeWF}Q30uEENAJ>kx>G{&^Z zWooeqn?p-$s&+4{&7HM2y5gqgO_gPB%iET$9yfc679W~5d}OGxqO5&Id+R(;$qavD z!0pgj>{`45d_||R-kw&ThA8uJ15vHVj>&@YiY>T!oLlk&^lm|jzySzxN4ic9Wt5w8 zspyaFm?T!Je4Yu1d^*%-;U)3cVo>lPLC(gTm)l6sfmk(}!;XvcyqaPjF{^H*HnRkAC z+TGeU+Z(CRa43Wm<*V-=nsaDD0g=77?dr?tXD3<bF3yJxN87=cFtE zr!ORR8ckf;(wV*xrYLq$$n`I%1mr_L2{Cs{)6rKwCS{)^TlaZ9XHK7{y#ncNG{ zWu{Fmut{#1+_X?Iu4h)FLOwmOD!3JR z>&DMjhoF*@WjB+XiDT4CuiY2)27F$>ajKRQnCug9Ba-g}N(xpyxrp(vq?g1*dkoDF zXOUg`&>B<8(&HOy7qm76%UVJXMR|%Tv1!lJtcJSgQ1ftIK`$nKh1msAZhfyJxt9tmqeH$f6V0maHvCE*!Yy13<$ja#nX zdo5T*_=96RiDzWzEZ#SEsB&((JAdFnH}JyJm=K4#2bP3#=fS@NV3fv+G{IQ8ITjeR#)G_38&%ILjnVS?YHh8j^YGvAd2e9Z7I-NN5L z{W4$Vat3A}T(IfIgUt$|KGjk+ysx2lpd#7F-;aIZ4a6wE2ZkLpH;em&oMOw|jC90y zqEacv`8}8nqx6e*$}f0dnwpt9NK&b7@|E7|S6(*lfMpb7a(8l#`hgNw1z;lBiNv-?_MPS%W9L zXZP&h8%k70m0E9#v+<`Yii;~v?b-H+XGEQRgFt#U{{MY78KVw({mGC=~|No=hSDPhLQcYa2E2)O-L`d zHKw;rDlEn4XeEfF#wqrBDhcqPQ&bXw*>Ex#3CA=N{(pWUJ}KDF{Fc{hJ#!=Z2BEk9 zicGDs>e~7qg&{ApB4WCR{Yp%~hX19bY38ET=3cwKw>fpu%qEAVhx`>Tr?;@48o2$> zq+z2cJ%miu4B(km8p)%kLf|WDBDg3iBDvr zs)}%az?Ynu-~yNhb6ro`mpqB($sRYM1jr%5GOP@vj%lCES2039!htV&s@d;acl8%6 z?CUtVxOf#mXfrqpx}%}))TV8Vnq2Ag*X(YHu9_7}uN~NYq@(@NP}$5QukX+73#W&Y zOv2W_>z-b)eP`GHQ$0tIDf{D$nKfB)>WYIux{b1=WcOdSVAef1?3iCzyyc~<*!yhp zKM$x?rUbHjDHiBq;i$CtKRC|u7u)-#9Ur?tbT^8Wm!wAigaaUTTtz^!kc1expqPYr zpHeJ)x?*5^pM2hQH~O49fUrw^`Q|U(v@}?p?obrD%*M#lzLmv~6|-7l;h9#&Gg?>B zooLOUk>_I1ibP?9xzlyFO08A?lS|@?xO6lGQyorCcU&B zO7c(B04hoxwm6bnz#iq|2a}?!YTey0zrS_s`!7SCoBDai&i7dA$<^Qg@(m-Ur6V_d z`TMK!`PfJ)e+SCmLuKzduii=VH}CB%9XU2pRQinZT6y+k^+DJXvpHba0>JWB*^umk zZ$bV62OHlOzw*aj19RpKblv{*!yA77$^%>LY-ypy0gDy^U`xLy{_BA^-fxMr zPeoOzOP_Olz1=`b4M)N+a5TFti!x(>VKJABT#L24$l0pr13xq}ar7G!kQfe^CZbe0{7OWDJNor+9u7<0r zuBxmE_yR$z!|(SQ#|L2?o=%gA$HP2CED&=nk))Ua0fR1wG+|&2?n>J8)&D+t^|$Nk z^hzJ^$*Jlpns;K~JSV@*3idy0d5G3q^K)PuVI524S z@;OjMnAMN8;3=l3`S)*)PgY)YZR=Ost`h%8>x;jY|J76cCu~#6oUG;~c=*i;cD`op z7JlW}H?2u%4Nqqwsz2kChD+ywy@DpGVJ%uckI}_qM#~7{iu6uOX!CO0fJcCt-{zE{zk!?-CQEh#_9P-&1>6`q-U2r zP8!MyVE}TzJX#{ZBMwc}(C_h*1f^bi` zzFIuYqxdhIJI*3#6Vo#2mBEACxmJ4Rc(<}gdgUs5@X6q_b~|qr&%*lWCA0it37(N)v_fCf_S5`K53xB7GM! zQX}pUFbqNpO3HegbYQ53Od_db0L)X)=H+hXjK)+WS=@ALTzB#M5NYGpp_Gn)oc2z1 zG*o^5olp{f9-|(fl!-Rso)V-UaxR9O#;5W2kUz8b{JUTR0I9DV;tYDu(8o=4%kytE zZg5e5U+xxyqOY8Q%yeq9B%V#euvF9`w)vU`aX${$(?tF1HIpEU4 zce8%Y!E2GrIJaw6P2rsKDQUs7(oN=AvaBn{vnYlTX3*Jw#H86j~+zv7%LsD=VsTPtkP4N^`z>j1A#KBb|%pQ5u)lTe(8UXE;znzmNmtfnPwV&?2p$iyn9=xCB+xy_na0#_~|uve{RTUUjD#)yB}t0 zKfA`}4dwXEqbJ{^btp)>)FEK7oLmmK2V9xklAup@Gou>56EopbG)9fuxX#85Mxf5j z>p1LTX44wfB$f)qm0(jrd=FLwM>*t&tjuVHIgU*xt<}OzCV7QMC)$)<0 zLks55?d@!*eDMA_UxpJ%2#cL&AnXCz6sE`%MFfWyFnpz+lxC#tON3~r$@v8|wTR>k zI#*9qDf;%0&M!c$+Ddg+-Q1#_))@`0J%u>$OilHwlm=B+dL%m|%auDL|0#EEYhQT9 zEsG?LZtF93y+7DGa^IRVcg4V-`ajxD7#JnzK&pqRSb~o;o_5!OQXJCrC^3tT^8c9(D50XkHXV;*!EkGN`iKqQ@bTpLDsAZaoDZ{s7@y+63FwP^6_ z)8AUrwsUDWMYmb>37$~2uY42Y+sa0+>&Yz-CR>WigtWL(uz}1w`N82`zkKnQ<)yKp zHc9nGSlb}mJ3FG#R0282R4`!&`6S6u@iD~BGy_i zniI%Ql=2U!K*vz9phlZoU)^l70eXX0gI+u%N)^d#S#*gfO3z|UKOf0h(rG=)Po>I;bh>y;&#R}=Kud|GyhL4^ zf;K6nHQyQtB3|C%O_wxGc`A;ZW8>3L23^X|I+$XlTq6jAgmauraY}13nbUIX!zGK` zOHJ%Pi?}4Eth=zVwK!raP(erXaAyGiiDYZz02(i zb#HFo?E>>zmfPpn=}Xg!GhLNy?^~*|YQ!q=>$fjCwXLC{nrww{VH0~6^HYO~2s;e+ z&iQuOI2SqDVTf5f$HtNDFnN~BXu6moCM_)%;jgGx>6OML{bs)OP+YunXt3b!f(0+B zQ{xWt!Fze_2d*lwugdkCv41(OY^AuC9TRUc#iKPmxKTN97gD<}VTXar^K;r^7i;5q zq5u|Aq*tq{t%gl}$)Pxxa%ge*c)`LK)gI@epNnr6pqne%Ql`IXtI_tg=vpWH2BP zw`ed@@aY0oq=oky5ob{Bv^<$#ntn2srwkFrf?8pH(R;ciuaOk#^?BZNiuENtni^DD zO0&K(_78g1QhHT~{HldMkMybn3#3GHGVF)csm?=>IBGM*D@rkb#k^O1kKQ=1E(6KR zq_?f?F1q;JW|iB;3XJJY_8iIbv#*GQ{9hDf+-ClosC5(LOe=>LD-;IK#B_QB+!7S3 z1|x3d490b2;~4d85UY-(4TA|9o}SZb^txdRYnBln9*NIQb}YjJQz}y@Lh--IZDh8; z3vNS#_lw--BCVmV{)^n^BCR0>;EUYmBCU~Qm_C0OU!*l;npRzQqyVLW&tEC1h9<`h zYKJ^d(H_oZhBgm?)49#z%rxNU$pJ?Itf13nK-2p&)_-=)8d2%r;xe#YBjVn93mkfj>;LC8a|FS=omz zDKV+Xlp;Erlx@<$^ww!fP}-m3T;O7q%rBRk|51X^ydlySNpR+OlxEdrI!cz_FgL3? zF{hxh$`L_6J=m8HXG*>@(ww&_yL_-Im{v8fBDK~-#^ut{QM1HK78hy&MOO(Zx-6R1 z!o&S1hV2QOF0Dpy?st`^*;7n9#eIp^-NwAC8GcZ5m0QiBvN|up(sZG`++3&+ahWAB zKTET9$)&T3BE3yPA(=}wb|aVepXHceQOSdS{?Ok zJF^d(=kC3?XVsxZPiC&))VJ?G`s~fhXU}ea=hSMmKR4HJs2jb0?xuH6tuY7l3xbCF z71xuE+Hm$C$T9p8a5h=oMm{BKN`Q^p3LCY8X-y=!$N>3&W2&Z~YpTMFM8fAkbw{t3 z{8A)`{!@2^IgLA#r|dsvpZ%s z)l`+0c*%{Bet{bSrv;aABhXd25lrwoOgZnF#5~B}uGnc$B!$j;C`6z1VCkgiTapK% zvQ4wfba-^af56hx$bX>DOb_P-v&nz3J9~9&+p31t@^ud^pR*^w=IETZO&!6|(4A{q z2R$Jj2(}$b0e9K_X!^k1rjg*TxH-+0Lrod&t?ul!cpZqk6e4*I8rJQa;xh>HygxCc zurTDGQIysg2-mE-q3hU3r{`6bl~t9mx?|C{|N7EMIM8j?qs% z?5;i6;3tiQ$Vc9~`-MTE=JHroRA+>jJqPC(zK`OX3)>%kGI%%41A=*n>fSr_pZ zNY=>(HOL3>dGAi^@QdA@ya1QH`?%pvjL*|MIi@swys$j`!1|n>2_#l3aX#aeB#$9= z9rA+8ruv0*M?SZTS?UC=VGqo`YJOh(H7~DUdUd2!ZPlBSa%v-uR}2)nOJ*0R6a?Z` zb;XopCDReGm?~G_F|gx<$Co!X)JvR7t^2>SEIKkXgADYh1UKsy;Eseo9%9b|N=0!g zsnKK{IpMb+{27lZKp9~?MnLT;;W>+l7{9{ZyXp5|Ld%b+cH$H9g*V9|+LQwiZca8x zP#QT8^$^8vkegKcolatSp$~t6C_*8D??lRW`s-2rfS4N7B!h2m=^m`U+obz3JM|zh| z)!W!70?1!DB)>}{v>;v}f+v0hXmNn_(}0hd=IHBP17?G((Pj55 z#e>2F!7Q}#3#@$pq@iAHu%5P5lTB711ysAQzATmU1Ha|>v}eyD9Ev;+Pp<=rjr<>>b&H-DB7H1FMSLH+N<_g5`m{!Tye<-kN32 z!RF%1#H6&OuEsTStYX)$@W7sqhQoW-cIC~endSSe5sp6ov+{7uwp-f@W>O;;v^ z|L$eWWbr?|Y?&PX`Ke{5ZBHiugmZBO8H+$Y4pf7$y4`B$fw5vF_hZ2s-3Wu|Sj zPk4%Z4gKwBS4@<(jQ97G{Iu`jSER=3ygs##T=q#eZJi9^Thl$~l6A6#*S>I_90BkA z1>YxAcxSpgmuy==cxk#iavxu$-$KGyr>k?x=LCi4rmG{5_mjf3eVr}5J6)Yiw#^4G zA@y4Ze5BI4!TRor7u9lGNkOd7D{|c(Wk!rl=7RO*3j0m z4e?K7z{1$M2p0ioS1bYwcjM`VSuq651GNc7yh;H3T%^G7O-hipFcmZq8E`sou%+-2 zXcxqqKz>P~_Pn}jTVFwXb$?0ImY)37in&$xbZfzen&w>tMV;5Yv}WG*Lq&E3LLJSL!leG-0wBeW@bWC6dxn{Jqu9jxoiFJ0YNoL1TYM(uFDH?E+gq<(3=Co$4q zw{m^kq32i4zj=At-M7r`Z`gKfN%z48;RDRA#kT z`0{40tjKOJ^NfAhd;6x*N47>I3l4Ujcr!C_{ovd?H`Er++dkva%jgFsxA5#=lt+N? zp?)X;LcE^?wwC-0L39NN1st(_;J#6V`vx9&iEUveVFi@{+DZf{vCTaDQpHh_>PP`i ztLXSE?}E}ad!#48U5N*rR|DI>sdo;{7HT$M!7z%L;VZ&ug^1m)$ zytB4+LA}3t!LAvl3+w$?I(-Gn8BIm04qt&g*i@X#Z`CKecAYt*OLpv5@)e7B#ES2v z;(@EESVmJ}tawqXV%yN2qa}ct%^13CWoc%|y5?|mZd`iH#;$_Kkkiw&p7rRhpB{qJ ze3X(RWVWwC!Buj>rd(%w%Z9Fk87SCHvEw{fAU?#dfxcqoJaoE?Df4=LaZAK>Xk-|O}88gm(;4dTsvUdiJ^3dBR!Ou z6iT;?5Ai9Xp5B3?qJiF?(AWoxUnl0$)m-T+O5>r}!-Q3(_H^9>JO+EqW&pv^)%OS#N-sfQx;^8^L{)sh;pU;%ZQ77 zi2okGYq3K;&%ZqJJaE|oOCguXWvP6*RQ^H!JJXckjQhKk_e%FC4K~P5b4z0PfB*dQ zIA{A*yoJy{@&?iRpIFd(rZ&KcJy!x4agwf_uT$|;Wx&L$p0L#P|rjgg#PA*j|#)*xvJ1W<<;Qvog@6;5!qizFUFVgp*LZUbUG z1qK+0K$XTwV`ea=AhjSl3A9Nzty||tfR=`7WCm6+?BFy>jm+!VJk^p<1O7cgSJd7l zCOLnnXc*@^b>0dEJ>D#Hw5c*L$D}H6u&QzuI(?F@Ij^Q{Sz9Qzv@^d{`rEOsd~imv zbm6W>I$reVIrGPDp&#?3!YllTNc}exV3BjLUCECs z7x5pWUQ68h*VeKk_O4&8RzHv?BOvxp@27E6U9CB`EF9MTo6?6>YF1E~hM7Tom8| zwzECu7DH8D38Xw(^3kmvV-TUd(7Ce4^ImE)`(bk<>?*f0UvAKHo?`M7N4e45E!g<%Y z1!pt(8&x#^v(CSE_5)l?kgjz(∾vYdfTCvoCnwA8^eqUF$x--q|N$Z2TMX2Ws{> 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]qwNi)mF*41Rq6pP}98dO85s!vqe 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±Nc=T+8(HA%3sU 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

tp*| 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 diff --git a/data/core/images/terrain/water/waves-convex-A13.png b/data/core/images/terrain/water/waves-convex-A13.png index 149529adc37366e72e1bdae3a52fe7f129756286..a013e4709357b0862b28a1ebaeda41a250a0a73f 100644 GIT binary patch literal 34576 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 literal 10156 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 A-v9sr diff --git a/data/core/terrain-graphics.cfg b/data/core/terrain-graphics.cfg index 0d6a20fe4757..2fcf8b383efb 100644 --- a/data/core/terrain-graphics.cfg +++ b/data/core/terrain-graphics.cfg @@ -828,8 +828,7 @@ {NEW:TRANSITION Aa,Ha,Ms,Ai (W*,Ss) -1001 frozen/ice-to-water} -# Beaches (light for sand, dark for everything else) -{NEW:BEACH D*,Hd W* sand/shore} +# Beaches {NEW:BEACH !,D*,Hd,Chw,Khw,Khs,W*,S*,Xv,Qx*,A*,_* W* flat/shore} From 576a88ea7d1c78c63a2ec492d10f7dd278915e1c Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Tue, 29 Mar 2016 20:20:24 +1100 Subject: [PATCH 018/240] Properly rendering background fill color when creating SDL windows --- src/sdl/window.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/sdl/window.cpp b/src/sdl/window.cpp index 8b0f138b8826..af83419ad608 100644 --- a/src/sdl/window.cpp +++ b/src/sdl/window.cpp @@ -55,6 +55,8 @@ twindow::twindow(const std::string& title, pixel_format_ = info.texture_formats[0]; fill(0,0,0); + + render(); } twindow::~twindow() From 60910506c620a3fb325c63a5d7f37d20a4b1d383 Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Tue, 29 Mar 2016 20:21:24 +1100 Subject: [PATCH 019/240] GUI2: call events pump when showing non-modal dialogs This allows the dialog to actually show --- src/gui/widgets/window.cpp | 2 ++ 1 file changed, 2 insertions(+) diff --git a/src/gui/widgets/window.cpp b/src/gui/widgets/window.cpp index e0c845e26644..9706630ab4c9 100644 --- a/src/gui/widgets/window.cpp +++ b/src/gui/widgets/window.cpp @@ -586,6 +586,8 @@ void twindow::show_non_modal(/*const unsigned auto_close_timeout*/) */ invalidate_layout(); suspend_drawing_ = false; + + events::pump(); } int twindow::show(const bool restore, const unsigned auto_close_timeout) From 465f5eece176258b63e9138d1b30f0adeb9083eb Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Tue, 29 Mar 2016 20:22:09 +1100 Subject: [PATCH 020/240] Implement new GUI2 loadscreen --- data/gui/window/loadscreen.cfg | 143 +++++++++ images/misc/loadscreen_decor.png | Bin 0 -> 662 bytes projectfiles/CodeBlocks/wesnoth.cbp | 4 +- projectfiles/CodeBlocks/wesnothd.cbp | 1 - src/CMakeLists.txt | 10 +- src/SConscript | 5 +- src/filesystem_common.cpp | 2 - src/game_config_manager.cpp | 8 +- src/game_launcher.cpp | 6 +- src/game_state.cpp | 2 - src/gui/dialogs/loadscreen.cpp | 67 +++++ src/gui/dialogs/loadscreen.hpp | 66 +++++ src/loadscreen.cpp | 420 --------------------------- src/loadscreen.hpp | 91 ------ src/loadscreen_empty.cpp | 23 -- src/play_controller.cpp | 20 +- src/serialization/parser.cpp | 2 - src/terrain/builder.cpp | 3 - src/units/types.cpp | 7 - src/wesnoth.cpp | 19 +- 20 files changed, 294 insertions(+), 605 deletions(-) create mode 100644 data/gui/window/loadscreen.cfg create mode 100644 images/misc/loadscreen_decor.png create mode 100644 src/gui/dialogs/loadscreen.cpp create mode 100644 src/gui/dialogs/loadscreen.hpp delete mode 100644 src/loadscreen.cpp delete mode 100644 src/loadscreen.hpp delete mode 100644 src/loadscreen_empty.cpp diff --git a/data/gui/window/loadscreen.cfg b/data/gui/window/loadscreen.cfg new file mode 100644 index 000000000000..a57c8bc700f0 --- /dev/null +++ b/data/gui/window/loadscreen.cfg @@ -0,0 +1,143 @@ +#textdomain wesnoth-lib +### +### Definition of the loadscreen +### + +[window_definition] + + id = "loadscreen" + description = "The window definition for the loading screen." + + [resolution] + + [background] + + [draw] + + [rectangle] + x = 0 + y = 0 + w = "(width)" + h = "(height)" + + fill_color = "0, 0, 0, 255" + [/rectangle] + + [/draw] + + [/background] + + [foreground] + + [draw] + + [/draw] + + [/foreground] + + [/resolution] + +[/window_definition] + +#define _GUI_PADDING + [row] + + [column] + + [spacer] + height = "(screen_height / 4)" + [/spacer] + + [/column] + + [/row] +#enddef + +[window] + id = "loadscreen" + description = "Loadscreen." + + [resolution] + definition = "loadscreen" + + {GUI_WINDOW_FULLSCREEN} + + [tooltip] + id = "tooltip" + [/tooltip] + + [helptip] + id = "tooltip" + [/helptip] + + [grid] + + {_GUI_PADDING} + + [row] + grow_factor = 1 + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "center" + vertical_alignment = "center" + + [image] + definition = "logo" + label = "misc/logo-bg.png~BLIT(misc/logo.png)" + [/image] + + [/column] + + [/row] + + [row] + grow_factor = 0 + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "center" + vertical_alignment = "center" + + [label] + definition = "default_large" + id = "status" + label = _ "Loading..." + [/label] + + [/column] + + [/row] + + [row] + grow_factor = 1 + + [column] + grow_factor = 1 + border = "all" + border_size = 5 + horizontal_alignment = "center" + vertical_alignment = "center" + + [image] + definition = "decoration" + label = "misc/loadscreen_decor.png" + [/image] + + [/column] + + [/row] + + {_GUI_PADDING} + + [/grid] + + [/resolution] + +[/window] + +#undef _GUI_PADDING diff --git a/images/misc/loadscreen_decor.png b/images/misc/loadscreen_decor.png new file mode 100644 index 0000000000000000000000000000000000000000..0ef7a14239679b0d9b65be42ae181b717ba44f34 GIT binary patch literal 662 zcmV;H0%`q;P)X1^@s6A9r|Y00006VoOIv0OSDV z0OT#3gna-2010qNS#tmY3ljhU3ljkVnw%H_000McNliru-~${GJ2;PN*8>0m03B&m zSad^gZEa<4bN~PV002XBWnpw>WFU8GbZ8()Nlj2>E@cM*00H_*L_t(|+U?z4j@mF3 z2G9%bTeslNbY*0A*2QEMl}h@OOg*k0$1tkYaE^q?pD)2dd@>;r0W{6?e4FR_rY8Ux z4Uc8L2@xnnlkM;_TSBM|_`!b6Av@E!!C;c+xX_S(YPTy+62 z7#>skMxUSaNGUbX4QA`6GDKRn;jF&u0$wdVQc7?0JipIxfzS(&JVdgvh^+mG+DB>u z@E?RnWyFwwO?P>)=CW5?&jXw+JjxJwvi9yd6-NL-cnA>y;qf`)Aw+m(m-PjHU8lEO zIsawd{#w~)ukE!mAC!ba(_k2gT z?H%Xd>2DG7Bc=4c_GTY(?1cGfh_vcv-}3qy5lckei~H8HZN9dw*S@xHX{@{N ztm{2yZ-4J=H{3h>d33vx{fdKidi!v6KeqP2iaJZNtkpjw$FpqHs#Df@=2(~0U<6_W z0>D2H5#a$KM1%(na3wmYx1N)zT{(WsgW!?ysMX5mCl?cPW?tO9)JP=$TrIwx)SlMW zQx-NO;gPrhP+NEaoGe6YA1xjEA;qFb?dtQz$5sI6ABohK`!!ww9u61(2Liz7g^2Kg wzd6YVjSva{i4MTCBM~DH03Hbu;Q + + @@ -764,8 +766,6 @@ - - diff --git a/projectfiles/CodeBlocks/wesnothd.cbp b/projectfiles/CodeBlocks/wesnothd.cbp index 73d2a716c6d7..c23ae9bfddfd 100644 --- a/projectfiles/CodeBlocks/wesnothd.cbp +++ b/projectfiles/CodeBlocks/wesnothd.cbp @@ -72,7 +72,6 @@ - diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 443f70daf234..f6164b877761 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -837,6 +837,7 @@ set(wesnoth-main_SRC gui/dialogs/gamestate_inspector.cpp gui/dialogs/label_settings.cpp gui/dialogs/language_selection.cpp + gui/dialogs/loadscreen.cpp.cpp gui/dialogs/lobby/data.cpp gui/dialogs/lobby/info.cpp gui/dialogs/lobby/lobby.cpp @@ -1026,7 +1027,6 @@ set(libwesnoth-game_STAT_SRC game_end_exceptions.cpp key.cpp language.cpp - loadscreen.cpp lobby_preferences.cpp utils/make_enum.cpp map/label.cpp @@ -1177,7 +1177,6 @@ set(wesnothd_SRC server/forum_user_handler.cpp server/sample_user_handler.cpp ${network_implementation_files} - loadscreen_empty.cpp ) add_executable(wesnothd WIN32 @@ -1202,7 +1201,6 @@ set(campaignd_SRC campaign_server/campaign_server.cpp server/input_stream.cpp ${network_implementation_files} - loadscreen_empty.cpp ) check_library_exists(rt clock_gettime "time.h" HAVE_CLOCK_GETTIME_RT) @@ -1236,7 +1234,6 @@ set(exploder_SRC tools/dummy_video.cpp sdl/utils.cpp tracer.cpp - loadscreen_empty.cpp ) add_executable(exploder ${exploder_SRC}) @@ -1257,7 +1254,6 @@ set(cutter_SRC tools/dummy_video.cpp sdl/utils.cpp tracer.cpp - loadscreen_empty.cpp ) add_executable(cutter ${cutter_SRC}) @@ -1279,7 +1275,6 @@ set(schema_generator_SRC tools/schema/tag.cpp filesystem_boost.cpp filesystem_common.cpp - loadscreen_empty.cpp ) add_executable(schema_generator ${schema_generator_SRC}) @@ -1303,7 +1298,6 @@ set(schema_validator_SRC filesystem_common.cpp config_cache.cpp utils/sha1.cpp - loadscreen_empty.cpp ) add_executable(schema_validator ${schema_validator_SRC}) @@ -1328,7 +1322,6 @@ set(wesmage_SRC tools/exploder_utils.cpp sdl/utils.cpp tracer.cpp - loadscreen_empty.cpp ) add_executable(wesmage ${wesmage_SRC}) @@ -1482,7 +1475,6 @@ if(ENABLE_TESTS) tools/exploder_utils.cpp sdl/utils.cpp tracer.cpp - loadscreen_empty.cpp ) add_executable(create_images ${create_images_SRC}) diff --git a/src/SConscript b/src/SConscript index aa5261599e87..925921bf7552 100644 --- a/src/SConscript +++ b/src/SConscript @@ -113,7 +113,6 @@ libwesnoth_sources = Split(""" generators/lua_map_generator.cpp key.cpp language.cpp - loadscreen.cpp utils/make_enum.cpp map/label.cpp marked-up_text.cpp @@ -154,7 +153,6 @@ libwesnoth_sources = Split(""" libwesnoth = client_env.Library("wesnoth", libwesnoth_sources) libwesnothd_sources = Split(""" - loadscreen_empty.cpp tools/dummy_video.cpp """) libwesnothd = env.Library("wesnothd", libwesnothd_sources) @@ -375,6 +373,7 @@ wesnoth_sources = Split(""" gui/dialogs/gamestate_inspector.cpp gui/dialogs/label_settings.cpp gui/dialogs/language_selection.cpp + gui/dialogs/loadscreen.cpp.cpp gui/dialogs/lobby/data.cpp gui/dialogs/lobby/info.cpp gui/dialogs/lobby/lobby.cpp @@ -686,7 +685,6 @@ wesmage_sources = Split(""" sdl/alpha.cpp sdl/window.cpp tracer.cpp - loadscreen_empty.cpp """) client_env.WesnothProgram("wesmage", wesmage_sources + [libwesnoth_core], have_client_prereqs, OBJPREFIX = "wesmage_", LIBS = ["$LIBS", "png"]) @@ -738,7 +736,6 @@ create_images_sources = Split(""" sdl/alpha.cpp sdl/window.cpp tracer.cpp - loadscreen_empty.cpp """) env.WesnothProgram("create_images", create_images_sources + [libwesnoth_core], have_server_prereqs, OBJPREFIX = "create_images_", LIBS = ["$LIBS", "png"]) diff --git a/src/filesystem_common.cpp b/src/filesystem_common.cpp index 0d321f066e86..d6def85106c7 100644 --- a/src/filesystem_common.cpp +++ b/src/filesystem_common.cpp @@ -7,7 +7,6 @@ #include "config.hpp" #include "game_config.hpp" -#include "loadscreen.hpp" #include "log.hpp" #include "serialization/string_utils.hpp" #include "serialization/unicode.hpp" @@ -178,7 +177,6 @@ static void get_file_tree_checksum_internal(const std::string& path, file_tree_c std::vector dirs; get_files_in_dir(path,NULL,&dirs, ENTIRE_FILE_PATH, SKIP_MEDIA_DIR, DONT_REORDER, &res); - loadscreen::increment_progress(); for(std::vector::const_iterator j = dirs.begin(); j != dirs.end(); ++j) { get_file_tree_checksum_internal(*j,res); diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index 0e0452f833cf..a028c7b9b44c 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -20,11 +20,11 @@ #include "game_config.hpp" #include "gettext.hpp" #include "game_classification.hpp" +#include "gui/dialogs/loadscreen.hpp" #include "gui/dialogs/wml_error.hpp" #include "hotkey/hotkey_item.hpp" #include "hotkey/hotkey_command.hpp" #include "language.hpp" -#include "loadscreen.hpp" #include "log.hpp" #include "preferences.hpp" #include "scripting/game_lua_kernel.hpp" @@ -138,8 +138,7 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, } } - loadscreen::global_loadscreen_manager loadscreen_manager(video_); - cursor::setter cur(cursor::WAIT); + gui2::tloadscreen::display(video_); // The loadscreen will erase the titlescreen. // NOTE: even without loadscreen, needed after MP lobby. @@ -151,9 +150,7 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, // Load the selected core. // Handle terrains so that they are last loaded from the core. // Load every compatible addon. - loadscreen::start_stage("verify cache"); filesystem::data_tree_checksum(); - loadscreen::start_stage("create cache"); // Start transaction so macros are shared. game_config::config_cache_transaction main_transaction; @@ -473,7 +470,6 @@ void game_config_manager::set_color_info() void game_config_manager::set_unit_data() { game_config_.merge_children("units"); - loadscreen::start_stage("load unit types"); if(config &units = game_config_.child("units")) { unit_types.set_config(units); } diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index 95f4f5c2ee9d..b09c50194cc1 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -30,6 +30,7 @@ #include "generators/map_generator.hpp" // for mapgen_exception #include "gettext.hpp" // for _ #include "gui/dialogs/language_selection.hpp" // for tlanguage_selection +#include "gui/dialogs/loadscreen.hpp" #include "gui/dialogs/message.hpp" //for show error message #include "gui/dialogs/multiplayer/mp_host_game_prompt.hpp" //for host game prompt #include "gui/dialogs/multiplayer/mp_method_selection.hpp" @@ -39,7 +40,6 @@ #include "gui/widgets/window.hpp" // for twindow, etc #include "intro.hpp" #include "language.hpp" // for language_def, etc -#include "loadscreen.hpp" // for loadscreen, etc #include "log.hpp" // for LOG_STREAM, logger, general, etc #include "map/exception.hpp" #include "game_initialization/multiplayer.hpp" // for start_client, etc @@ -1011,8 +1011,8 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload) return; } - loadscreen::global_loadscreen_manager loadscreen_manager(video()); - loadscreen::start_stage("load data"); + gui2::tloadscreen::display(video()); + if(reload == RELOAD_DATA) { try { game_config_manager::get()-> diff --git a/src/game_state.cpp b/src/game_state.cpp index 0d9ab2360b78..e554b1d1e65a 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -18,7 +18,6 @@ #include "game_board.hpp" #include "game_data.hpp" #include "game_events/manager.hpp" -#include "loadscreen.hpp" #include "log.hpp" #include "map/map.hpp" #include "pathfind/pathfind.hpp" @@ -177,7 +176,6 @@ void game_state::init(const config& level, play_controller & pc) } LOG_NG << "initialized teams... " << (SDL_GetTicks() - pc.ticks()) << std::endl; - //loadscreen::start_stage("init teams"); board_.teams_.resize(level.child_count("side")); diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp new file mode 100644 index 000000000000..ab0555412b9d --- /dev/null +++ b/src/gui/dialogs/loadscreen.cpp @@ -0,0 +1,67 @@ +/* + Copyright (C) 2016 by the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +#define GETTEXT_DOMAIN "wesnoth-lib" + +#include "cursor.hpp" +#include "gui/dialogs/loadscreen.hpp" +#include "gui/widgets/window.hpp" +#include "gui/widgets/settings.hpp" +#include "video.hpp" + +namespace gui2 +{ + +REGISTER_DIALOG(loadscreen) + +void tloadscreen::show(CVideo& video) +{ + if(video.faked()) { + return; + } + + window_ = build_window(video); + + pre_show(*window_); + + window_->show_non_modal(); + + post_show(*window_); +} + +void tloadscreen::close() +{ + if(window_) { + window_->undraw(); + delete window_; + window_ = NULL; + } +} + +twindow* tloadscreen::build_window(CVideo& video) const +{ + return build(video, window_id()); +} + +void tloadscreen::pre_show(twindow& /*window*/) +{ + // FIXME + cursor::setter cur(cursor::WAIT); +} + +void tloadscreen::post_show(twindow& /*window*/) +{ + cursor::setter cur(cursor::NORMAL); +} + +} // namespace gui2 diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp new file mode 100644 index 000000000000..70982c8905d3 --- /dev/null +++ b/src/gui/dialogs/loadscreen.hpp @@ -0,0 +1,66 @@ +/* + Copyright (C) 2016 by the Battle for Wesnoth Project http://www.wesnoth.org/ + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY. + + See the COPYING file for more details. +*/ + +#pragma once + +#include "gui/dialogs/dialog.hpp" + +class CVideo; + +namespace gui2 +{ + +class twindow; + +class tloadscreen : public tdialog +{ +public: + tloadscreen() + : window_(NULL) + { + } + + ~tloadscreen() + { + close(); + } + + static void display(CVideo& video) { + tloadscreen().show(video); + } + + void show(CVideo& video); + + /** + * Hides the window. + * + * The hiding also destroys the window. It is save to call the function + * when the window is not shown. + */ + void close(); + +private: + twindow* window_; + + twindow* build_window(CVideo& video) const; + + virtual const std::string& window_id() const; + + /** Inherited from tdialog. */ + void pre_show(twindow& window); + + /** Inherited from tdialog. */ + void post_show(twindow& window); +}; + +} // namespace gui2 diff --git a/src/loadscreen.cpp b/src/loadscreen.cpp deleted file mode 100644 index 6698e5838097..000000000000 --- a/src/loadscreen.cpp +++ /dev/null @@ -1,420 +0,0 @@ -/* - Copyright (C) 2005 - 2016 by Joeri Melis - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -/** - * @file - * Screen with logo and "Loading ..."-progressbar during program-startup. - */ - -#include "loadscreen.hpp" - -#include "log.hpp" -#include "font.hpp" -#include "marked-up_text.hpp" -#include "gettext.hpp" -#include "sdl/rect.hpp" -#include "video.hpp" -#include "image.hpp" -#include "text.hpp" -#include "preferences.hpp" - -#include -#include - -#include - -static lg::log_domain log_display("display"); -static lg::log_domain log_loadscreen("loadscreen"); -#define LOG_LS LOG_STREAM(info, log_loadscreen) -#define ERR_DP LOG_STREAM(err, log_display) - -loadscreen::global_loadscreen_manager* loadscreen::global_loadscreen_manager::manager = NULL; - -loadscreen::global_loadscreen_manager::global_loadscreen_manager(CVideo& screen) - : owns(global_loadscreen == NULL) -{ - if(owns) { - manager = this; - global_loadscreen = new loadscreen(screen); - global_loadscreen->clear_screen(); - } -} - -loadscreen::global_loadscreen_manager::~global_loadscreen_manager() -{ - reset(); -} - -void loadscreen::global_loadscreen_manager::reset() -{ - if(owns) { - owns = false; - manager = NULL; - assert(global_loadscreen); - global_loadscreen->clear_screen(); - delete global_loadscreen; - global_loadscreen = NULL; - } -} - -loadscreen::loadscreen(CVideo &screen, const int percent): - screen_(screen), - textarea_(), -#ifdef SDL_GPU - logo_image_(image::get_texture("misc/logo-bg.png~BLIT(misc/logo.png)")), -#else - logo_surface_(image::get_image("misc/logo-bg.png~BLIT(misc/logo.png)")), -#endif - logo_drawn_(false), - pby_offset_(0), - prcnt_(percent) -{ -#ifdef SDL_GPU - if (logo_image_.null()) { - ERR_DP << "loadscreen: Failed to load the logo" << std::endl; - } -#else - if (logo_surface_.null()) { - ERR_DP << "loadscreen: Failed to load the logo" << std::endl; - } -#endif - textarea_.x = textarea_.y = textarea_.w = textarea_.h = 0; -} -void loadscreen::draw_screen(const std::string &text) -{ - if (screen_.faked()) return; // We seem to encounter segfault in the test executable if this is not done - - // Set progress bar parameters: - // - // RGB-values for finished piece. - int fcr = 21, fcg = 53, fcb = 80; - // Groove. - int lcr = 21, lcg = 22, lcb = 24; - // Border color. - int bcr = 188, bcg = 176, bcb = 136; - // Border width. - int bw = 1; - // Border inner spacing width. - int bispw = 1; - bw = 2*(bw+bispw) > screen_.getx() ? 0: 2*(bw+bispw) > screen_.gety() ? 0: bw; - // Available width. - int scrx = screen_.getx() - 2*(bw+bispw); - // Available height. - int scry = screen_.gety() - 2*(bw+bispw); - // Used width. - int pbw = scrx/2; - // Used height. - int pbh = scry/16; - // Height of the lighting line. - int lightning_thickness = 2; - -#ifdef SDL_GPU - SDL_Rect area; - - // Pump events and make sure to redraw the logo if there's a chance that it's been obscured - SDL_Event ev; - while(SDL_PollEvent(&ev)) { - if(ev.type == SDL_VIDEORESIZE || ev.type == SDL_VIDEOEXPOSE) - { - logo_drawn_ = false; - } - } - - // Draw logo if it was successfully loaded. - if (!logo_image_.null() && !logo_drawn_) { - area.x = (screen_.getx () - logo_image_.width()) / 2; - area.y = ((scry - logo_image_.height()) / 2) - pbh; - area.w = logo_image_.width(); - area.h = logo_image_.height(); - // Check if we have enough pixels to display it. - if (area.x > 0 && area.y > 0) { - pby_offset_ = (pbh + area.h)/2; - screen_.draw_texture(logo_image_, area.x, area.y); - } else { - if (!screen_.faked()) { // Avoid error if --nogui is used. - ERR_DP << "loadscreen: Logo image is too big." << std::endl; - } - } - logo_drawn_ = true; - } - int pbx = (scrx - pbw)/2; // Horizontal location. - int pby = (scry - pbh)/2 + pby_offset_; // Vertical location. - - // Draw top border. - area.x = pbx; area.y = pby; - area.w = pbw + 2*(bw+bispw); area.h = bw; - sdl::fill_rect(screen_, area, bcr, bcg, bcb); - // Draw bottom border. - area.x = pbx; area.y = pby + pbh + bw + 2*bispw; - area.w = pbw + 2*(bw+bispw); area.h = bw; - sdl::fill_rect(screen_, area, bcr, bcg, bcb); - // Draw left border. - area.x = pbx; area.y = pby + bw; - area.w = bw; area.h = pbh + 2*bispw; - sdl::fill_rect(screen_, area, bcr, bcg, bcb); - // Draw right border. - area.x = pbx + pbw + bw + 2*bispw; area.y = pby + bw; - area.w = bw; area.h = pbh + 2*bispw; - sdl::fill_rect(screen_, area, bcr, bcg, bcb); - // Draw the finished bar area. - area.x = pbx + bw + bispw; area.y = pby + bw + bispw; - area.w = (prcnt_ * pbw) / 100; area.h = pbh; - sdl::fill_rect(screen_, area, fcr, fcg, fcb); - - SDL_Rect lightning = area; - lightning.h = lightning_thickness; - //we add 25% of white to the color of the bar to simulate a light effect - sdl::fill_rect(screen_, lightning, (fcr*3+255)/4, (fcg*3+255)/4, (fcb*3+255)/4); - lightning.y = area.y+area.h-lightning.h; - //remove 50% of color to simulate a shadow effect - sdl::fill_rect(screen_, lightning, fcr/2, fcg/2, fcb/2); - - // Draw the leftover bar area. - area.x = pbx + bw + bispw + (prcnt_ * pbw) / 100; area.y = pby + bw + bispw; - area.w = ((100 - prcnt_) * pbw) / 100; area.h = pbh; - sdl::fill_rect(screen_, area, lcr, lcg, lcb); - - // Clear the last text and draw new if text is provided. - if (!text.empty()) - { - sdl::fill_rect(screen_, textarea_, 0, 0, 0); - font::ttext label; - label.set_text(text, false); - sdl::timage txt = label.render_as_texture(); - textarea_.w = txt.width(); - textarea_.h = txt.height(); - textarea_.x = scrx/2 + bw + bispw - textarea_.w / 2; - textarea_.y = pby + pbh + 4*(bw + bispw); - screen_.draw_texture(txt, textarea_.x, textarea_.y); - } - screen_.flip(); -#else - surface& gdis = screen_.getSurface(); - SDL_Rect area; - - // Pump events and make sure to redraw the logo if there's a chance that it's been obscured - SDL_Event ev; - while(SDL_PollEvent(&ev)) { - if (ev.type == SDL_WINDOWEVENT && - ev.window.event == SDL_WINDOWEVENT_RESIZED) { - screen_.update_framebuffer(); - } - if (ev.type == SDL_WINDOWEVENT && - (ev.window.event == SDL_WINDOWEVENT_RESIZED || - ev.window.event == SDL_WINDOWEVENT_EXPOSED)) - { - logo_drawn_ = false; - } - } - - // Draw logo if it was successfully loaded. - if (logo_surface_ && !logo_drawn_) { - area.x = (screen_.getx () - logo_surface_->w) / 2; - area.y = ((scry - logo_surface_->h) / 2) - pbh; - area.w = logo_surface_->w; - area.h = logo_surface_->h; - // Check if we have enough pixels to display it. - if (area.x > 0 && area.y > 0) { - pby_offset_ = (pbh + area.h)/2; - sdl_blit(logo_surface_, 0, gdis, &area); - } else { - if (!screen_.faked()) { // Avoid error if --nogui is used. - ERR_DP << "loadscreen: Logo image is too big." << std::endl; - } - } - logo_drawn_ = true; - update_rect(area.x, area.y, area.w, area.h); - } - int pbx = (scrx - pbw)/2; // Horizontal location. - int pby = (scry - pbh)/2 + pby_offset_; // Vertical location. - - // Draw top border. - area.x = pbx; area.y = pby; - area.w = pbw + 2*(bw+bispw); area.h = bw; - sdl::fill_rect(gdis,&area,SDL_MapRGB(gdis->format,bcr,bcg,bcb)); - // Draw bottom border. - area.x = pbx; area.y = pby + pbh + bw + 2*bispw; - area.w = pbw + 2*(bw+bispw); area.h = bw; - sdl::fill_rect(gdis,&area,SDL_MapRGB(gdis->format,bcr,bcg,bcb)); - // Draw left border. - area.x = pbx; area.y = pby + bw; - area.w = bw; area.h = pbh + 2*bispw; - sdl::fill_rect(gdis,&area,SDL_MapRGB(gdis->format,bcr,bcg,bcb)); - // Draw right border. - area.x = pbx + pbw + bw + 2*bispw; area.y = pby + bw; - area.w = bw; area.h = pbh + 2*bispw; - sdl::fill_rect(gdis,&area,SDL_MapRGB(gdis->format,bcr,bcg,bcb)); - // Draw the finished bar area. - area.x = pbx + bw + bispw; area.y = pby + bw + bispw; - area.w = (prcnt_ * pbw) / 100; area.h = pbh; - sdl::fill_rect(gdis,&area,SDL_MapRGB(gdis->format,fcr,fcg,fcb)); - - SDL_Rect lightning = area; - lightning.h = lightning_thickness; - //we add 25% of white to the color of the bar to simulate a light effect - sdl::fill_rect(gdis,&lightning,SDL_MapRGB(gdis->format,(fcr*3+255)/4,(fcg*3+255)/4,(fcb*3+255)/4)); - lightning.y = area.y+area.h-lightning.h; - //remove 50% of color to simulate a shadow effect - sdl::fill_rect(gdis,&lightning,SDL_MapRGB(gdis->format,fcr/2,fcg/2,fcb/2)); - - // Draw the leftover bar area. - area.x = pbx + bw + bispw + (prcnt_ * pbw) / 100; area.y = pby + bw + bispw; - area.w = ((100 - prcnt_) * pbw) / 100; area.h = pbh; - sdl::fill_rect(gdis,&area,SDL_MapRGB(gdis->format,lcr,lcg,lcb)); - - // Clear the last text and draw new if text is provided. - if (!text.empty()) - { - SDL_Rect oldarea = textarea_; - sdl::fill_rect(gdis,&textarea_,SDL_MapRGB(gdis->format,0,0,0)); - textarea_ = font::line_size(text, preferences::font_scaled(font::SIZE_NORMAL)); - textarea_.x = scrx/2 + bw + bispw - textarea_.w / 2; - textarea_.y = pby + pbh + 4*(bw + bispw); - textarea_ = font::draw_text(&screen_,textarea_,font::SIZE_NORMAL,font::NORMAL_COLOR,text,textarea_.x,textarea_.y); - SDL_Rect refresh = sdl::union_rects(oldarea, textarea_); - update_rect(refresh.x, refresh.y, refresh.w, refresh.h); - } - // Update the rectangle. - update_rect(pbx, pby, pbw + 2*(bw + bispw), pbh + 2*(bw + bispw)); - screen_.flip(); -#endif -} - -void loadscreen::clear_screen() -{ -#ifdef SDL_GPU - GPU_Clear(get_render_target()); -#else - int scrx = screen_.getx(); // Screen width. - int scry = screen_.gety(); // Screen height. - SDL_Rect area = sdl::create_rect(0, 0, scrx, scry); // Screen area. - surface& disp(screen_.getSurface()); // Screen surface. - // Make everything black. - sdl::fill_rect(disp,&area,SDL_MapRGB(disp->format,0,0,0)); - screen_.flip(); -#endif -} - -loadscreen *loadscreen::global_loadscreen = 0; - -struct load_stage -{ - char const *id; - char const *name; - int start_pos, max_count; -}; - -static int const nb_stages = 19; - -/** - * Description of all the stages. - * @note Some of the stages appear twice; this is not a mistake. It - * accounts for their cost at title time and at game time. - * @note The values have been automatically generated by running a cache-hot - * Wesnoth on HttH with the --log-info=loadscreen option. - */ -static load_stage const stages[nb_stages] = -{ - { "init gui", N_("Initializing user interface"), 0, 27089 }, - { "load config", N_("Loading game configuration"), 46, 0 }, - { "verify cache", N_("Verifying cache"), 46, 179 }, - { "create cache", N_("Reading files and creating cache"), 47, 60317 }, - { "load unit types", N_("Reading unit files"), 85, 531 }, - { "init fonts", N_("Reinitialize fonts for the current language"), 96, 21 }, - { "refresh addons", N_("Searching for installed add-ons"), 99, 0 }, - { "titlescreen", N_("Loading title screen"), 100, 0 }, - { "load data", N_("Loading data files"), 0, 0 }, - { "verify cache", N_("Verifying cache"), 0, 0 }, - { "create cache", N_("Reading files and creating cache"), 0, 152852 }, - { "load unit types", N_("Reading unit files"), 38, 553 }, - { "load level", N_("Loading level"), 41, 0 }, - { "init teams", N_("Initializing teams"), 41, 0 }, - { "load units", N_("Loading units"), 43, 0 }, - { "init theme", N_("Initializing display"), 43, 0 }, - { "build terrain", N_("Building terrain rules"), 43, 1545 }, - { "init display", N_("Initializing display"), 99, 0 }, - { "start game", N_("Starting game"), 100, 0 }, -}; - -static int current_stage; -static int stage_counter[nb_stages]; -static unsigned stage_time[nb_stages]; - -void loadscreen::start_stage(char const *id) -{ - assert(global_loadscreen); - - int s = -1; - for (int i = 0; i < nb_stages; ++i) { - int j = (i + current_stage) % nb_stages; - if (strcmp(id, stages[j].id) == 0) { - s = j; - break; - } - } - assert(s >= 0); - - const load_stage &cs = stages[s]; - global_loadscreen->prcnt_ = cs.start_pos; - global_loadscreen->draw_screen(translation::gettext(cs.name)); - stage_counter[s] = 0; - stage_time[s] = SDL_GetTicks(); - current_stage = s; -} - -void loadscreen::increment_progress() -{ - if (!global_loadscreen) return; - - int v = ++stage_counter[current_stage]; - int m = stages[current_stage].max_count; - if (v > m) return; - - int s = stages[current_stage].start_pos; - int percentage = s + v * (stages[current_stage + 1].start_pos - s) / m; - if (percentage == global_loadscreen->prcnt_) return; - - global_loadscreen->prcnt_ = percentage; - global_loadscreen->draw_screen(std::string()); -} - -void loadscreen::dump_counters() const -{ - if (lg::info().dont_log(log_loadscreen)) return; - - std::ostringstream s; - - int i = 0; - while (i < nb_stages) - { - int j; - for (j = i; stages[j].start_pos < 100; ++j) {} - if (stage_time[i] == stage_time[j]) break; - for (int k = i; k <= j; ++k) - { - int v = stages[k].start_pos; - if (i < k && k < j) { - v = stages[i].start_pos + - (100 - stages[i].start_pos) * - (stage_time[k] - stage_time[i]) / - (stage_time[j] - stage_time[i]); - } - s << "\t{ \"" << stages[k].id << "\", N_(\"" - << stages[k].name << "\"), " << v << ", " - << stage_counter[k] << " },\n"; - } - i = j + 1; - } - LOG_LS << "Suggested loadscreen values:\n---\n" << s.str() << "---\n"; -} diff --git a/src/loadscreen.hpp b/src/loadscreen.hpp deleted file mode 100644 index 91e9983802e2..000000000000 --- a/src/loadscreen.hpp +++ /dev/null @@ -1,91 +0,0 @@ -/* - Copyright (C) 2005 - 2016 by Joeri Melis - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -/** @file */ - -#ifndef JM_LOADSCREEN_HPP -#define JM_LOADSCREEN_HPP - -class CVideo; - -#include "sdl/utils.hpp" -#include "sdl/gpu.hpp" -#include "sdl/image.hpp" - -class loadscreen { -public: - // Preferred constructor - explicit loadscreen(CVideo &screen, const int percent = 0); - // Keep default copy constructor - // Keep default copy assignment - // Destructor, dumps the counter values to stderr - ~loadscreen() - { - dump_counters(); - } - - /** - * Starts the stage with identifier @a id. - */ - static void start_stage(char const *id); - - /** - * Increments the current stage for the progress bar. - */ - static void increment_progress(); - - /** Function to draw a blank screen. */ - void clear_screen(); - - /** - * A global loadscreen instance that can be used to avoid - * passing it on to functions that are many levels deep. - */ - static loadscreen *global_loadscreen; - - struct global_loadscreen_manager { - explicit global_loadscreen_manager(CVideo& screen); - ~global_loadscreen_manager(); - static global_loadscreen_manager* get() - { return manager; } - void reset(); - private: - static global_loadscreen_manager* manager; - bool owns; - }; -private: - /** - * Displays a load progress bar. - */ - void draw_screen(const std::string &text); - - // Prohibit default constructor - loadscreen(); - - // Data members - CVideo &screen_; - SDL_Rect textarea_; -#ifdef SDL_GPU - sdl::timage logo_image_; -#else - surface logo_surface_; -#endif - bool logo_drawn_; - int pby_offset_; - int prcnt_; - - void dump_counters() const; -}; - -#endif diff --git a/src/loadscreen_empty.cpp b/src/loadscreen_empty.cpp deleted file mode 100644 index b06434a51022..000000000000 --- a/src/loadscreen_empty.cpp +++ /dev/null @@ -1,23 +0,0 @@ -/* - Copyright (C) 2005 - 2016 by Joeri Melis - Part of the Battle for Wesnoth Project http://www.wesnoth.org/ - - This program is free software; you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or - (at your option) any later version. - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY. - - See the COPYING file for more details. -*/ - -/** @file */ - -#include "loadscreen.hpp" - -void loadscreen::start_stage(char const *) {} -void loadscreen::increment_progress() {} -void loadscreen::clear_screen() {} - -loadscreen *loadscreen::global_loadscreen = 0; diff --git a/src/play_controller.cpp b/src/play_controller.cpp index 2685a34d0d6c..ff15ca62026a 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -38,10 +38,10 @@ #include "hotkey/hotkey_handler.hpp" #include "map/label.hpp" #include "gettext.hpp" +#include "gui/dialogs/loadscreen.hpp" #include "gui/dialogs/transient_message.hpp" #include "halo.hpp" #include "hotkey/command_executor.hpp" -#include "loadscreen.hpp" #include "log.hpp" #include "pathfind/teleport.hpp" #include "preferences_display.hpp" @@ -224,15 +224,7 @@ struct throw_end_level void play_controller::init(CVideo& video, const config& level) { - util::scoped_resource scoped_loadscreen_manager; - loadscreen::global_loadscreen_manager* loadscreen_manager = loadscreen::global_loadscreen_manager::get(); - if (!loadscreen_manager) - { - scoped_loadscreen_manager.assign(new loadscreen::global_loadscreen_manager(video)); - loadscreen_manager = scoped_loadscreen_manager.get(); - } - - loadscreen::start_stage("load level"); + gui2::tloadscreen::display(video); LOG_NG << "initializing game_state..." << (SDL_GetTicks() - ticks()) << std::endl; gamestate_.reset(new game_state(level, *this, tdata_)); @@ -254,15 +246,12 @@ void play_controller::init(CVideo& video, const config& level) resources::whiteboard = whiteboard_manager_; LOG_NG << "loading units..." << (SDL_GetTicks() - ticks()) << std::endl; - loadscreen::start_stage("load units"); preferences::encounter_all_content(gamestate().board_); LOG_NG << "initializing theme... " << (SDL_GetTicks() - ticks()) << std::endl; - loadscreen::start_stage("init theme"); const config& theme_cfg = controller_base::get_theme(game_config_, level["theme"]); LOG_NG << "building terrain rules... " << (SDL_GetTicks() - ticks()) << std::endl; - loadscreen::start_stage("build terrain"); gui_.reset(new game_display(gamestate().board_, video, whiteboard_manager_, *gamestate().reports_, gamestate().tod_manager_, theme_cfg, level)); if (!gui_->video().faked()) { if (saved_game_.mp_settings().mp_countdown) @@ -271,7 +260,6 @@ void play_controller::init(CVideo& video, const config& level) gui_->get_theme().modify_label("time-icon", _ ("current local time")); } - loadscreen::start_stage("init display"); mouse_handler_.set_gui(gui_.get()); menu_handler_.set_gui(gui_.get()); resources::screen = gui_.get(); @@ -279,7 +267,6 @@ void play_controller::init(CVideo& video, const config& level) LOG_NG << "done initializing display... " << (SDL_GetTicks() - ticks()) << std::endl; LOG_NG << "building gamestate to gui and whiteboard... " << (SDL_GetTicks() - ticks()) << std::endl; - //loadscreen::start_stage("build events manager & lua"); // This *needs* to be created before the show_intro and show_map_scene // as that functions use the manager state_of_game // Has to be done before registering any events! @@ -304,8 +291,7 @@ void play_controller::init(CVideo& video, const config& level) } init_managers(); - loadscreen::global_loadscreen->start_stage("start game"); - loadscreen_manager->reset(); + //loadscreen_manager->reset(); gamestate().gamedata_.set_phase(game_data::PRELOAD); gamestate().lua_kernel_->initialize(level); diff --git a/src/serialization/parser.cpp b/src/serialization/parser.cpp index 35a8087e43ad..ed90de51c38f 100644 --- a/src/serialization/parser.cpp +++ b/src/serialization/parser.cpp @@ -25,7 +25,6 @@ #include "config.hpp" #include "log.hpp" #include "gettext.hpp" -#include "loadscreen.hpp" #include "wesconfig.h" #include "serialization/preprocessor.hpp" #include "serialization/tokenizer.hpp" @@ -136,7 +135,6 @@ void parser::operator()() case token::END: break; } - loadscreen::increment_progress(); } while (tok_.current_token().type != token::END); // The main element should be there. If it is not, this is a parser error. diff --git a/src/terrain/builder.cpp b/src/terrain/builder.cpp index 20eac76c83bb..7376a8f64835 100644 --- a/src/terrain/builder.cpp +++ b/src/terrain/builder.cpp @@ -21,7 +21,6 @@ #include "game_preferences.hpp" #include "image.hpp" -#include "loadscreen.hpp" #include "log.hpp" #include "map/map.hpp" #include "serialization/string_utils.hpp" @@ -947,8 +946,6 @@ void terrain_builder::parse_config(const config &cfg, bool local) pbr.precedence = br["precedence"]; add_rotated_rules(building_rules_, pbr, rotations); - - loadscreen::increment_progress(); } // Debug output for the terrain rules diff --git a/src/units/types.cpp b/src/units/types.cpp index 50f722ee46e8..61f4765787a6 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -24,7 +24,6 @@ #include "game_config.hpp" #include "game_errors.hpp" //thrown sometimes //#include "gettext.hpp" -#include "loadscreen.hpp" #include "log.hpp" #include "utils/make_enum.hpp" #include "units/unit.hpp" @@ -1012,14 +1011,12 @@ void unit_type_data::set_config(config &cfg) BOOST_FOREACH(const config &mt, cfg.child_range("movetype")) { movement_types_.insert(std::make_pair(mt["name"].str(), movetype(mt))); - loadscreen::increment_progress(); } BOOST_FOREACH(const config &r, cfg.child_range("race")) { const unit_race race(r); races_.insert(std::pair(race.id(),race)); - loadscreen::increment_progress(); } // Movetype resistance patching @@ -1101,7 +1098,6 @@ void unit_type_data::set_config(config &cfg) if ( !id.empty() ) { std::vector base_tree(1, id); apply_base_unit(ut, cfg, base_tree); - loadscreen::increment_progress(); } } } @@ -1135,8 +1131,6 @@ void unit_type_data::set_config(config &cfg) } else { ERR_CF << "Multiple [unit_type]s with id=" << id << " encountered." << std::endl; } - - loadscreen::increment_progress(); } // Build all unit types. (This was not done within the loop for performance.) @@ -1202,7 +1196,6 @@ void unit_type_data::build_all(unit_type::BUILD_STATUS status) for (unit_type_map::iterator u = types_.begin(), u_end = types_.end(); u != u_end; ++u) { build_unit_type(u->second, status); - loadscreen::increment_progress(); } // Handle [advancefrom] (once) after building to (at least) the CREATED level. // (Currently, this could be simply a test for build_status_ == NOT_BUILT, diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index 5ed1354374de..e432a5e303c8 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -33,12 +33,12 @@ #include "gettext.hpp" #include "gui/core/event/handler.hpp" // for tmanager #include "gui/dialogs/core_selection.hpp" // for tcore_selection +#include "gui/dialogs/loadscreen.hpp" #include "gui/dialogs/title_screen.hpp" // for ttitle_screen, etc #include "gui/dialogs/message.hpp" // for show_error_message #include "gui/widgets/helper.hpp" // for init #include "help/help.hpp" // for help_manager #include "image.hpp" // for flush_cache, etc -#include "loadscreen.hpp" // for loadscreen, etc #include "log.hpp" // for LOG_STREAM, general, logger, etc #include "network.hpp" // for describe_versions #include "preferences.hpp" // for core_id, etc @@ -46,6 +46,7 @@ #include "scripting/plugins/context.hpp" #include "scripting/plugins/manager.hpp" #include "sdl/exception.hpp" // for texception +#include "sdl/rect.hpp" #include "serialization/binary_or_text.hpp" // for config_writer #include "serialization/parser.hpp" // for read #include "serialization/preprocessor.hpp" // for preproc_define, etc @@ -629,28 +630,25 @@ static int do_gameloop(const std::vector& args) check_fpu(); const cursor::manager cursor_manager; - cursor::set(cursor::WAIT); + //cursor::set(cursor::WAIT); #if (defined(_X11) && !defined(__APPLE__)) || defined(_WIN32) SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); #endif - loadscreen::global_loadscreen_manager loadscreen_manager(game->video()); - - loadscreen::start_stage("init gui"); gui2::init(); const gui2::event::tmanager gui_event_manager; + gui2::tloadscreen::display(game->video()); + game_config_manager config_manager(cmdline_opts, game->video(), game->jump_to_editor()); - loadscreen::start_stage("load config"); res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); if(res == false) { std::cerr << "could not initialize game config\n"; return 1; } - loadscreen::start_stage("init fonts"); res = font::load_font_config(); if(res == false) { @@ -658,13 +656,10 @@ static int do_gameloop(const std::vector& args) return 1; } - loadscreen::start_stage("refresh addons"); refresh_addon_version_info_cache(); config tips_of_day; - loadscreen::start_stage("titlescreen"); - LOG_CONFIG << "time elapsed: "<< (SDL_GetTicks() - start_ticks) << " ms\n"; plugins_manager plugins_man(new application_lua_kernel(&game->video())); @@ -705,8 +700,6 @@ static int do_gameloop(const std::vector& args) } } - loadscreen_manager.reset(); - handle_lua_script_args(&*game,cmdline_opts); plugins.play_slice(); @@ -852,7 +845,7 @@ static int do_gameloop(const std::vector& args) } continue; } else if(res == gui2::ttitle_screen::RELOAD_GAME_DATA) { - loadscreen::global_loadscreen_manager loadscreen(game->video()); + gui2::tloadscreen::display(game->video()); config_manager.reload_changed_game_config(); image::flush_cache(); continue; From cc368b18110036360c8a829dcbebfe11b999f32a Mon Sep 17 00:00:00 2001 From: Charles Dang Date: Tue, 29 Mar 2016 21:53:25 +1100 Subject: [PATCH 021/240] Fixup cmake and scons --- src/CMakeLists.txt | 2 +- src/SConscript | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index f6164b877761..12163edbb22c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -837,7 +837,7 @@ set(wesnoth-main_SRC gui/dialogs/gamestate_inspector.cpp gui/dialogs/label_settings.cpp gui/dialogs/language_selection.cpp - gui/dialogs/loadscreen.cpp.cpp + gui/dialogs/loadscreen.cpp gui/dialogs/lobby/data.cpp gui/dialogs/lobby/info.cpp gui/dialogs/lobby/lobby.cpp diff --git a/src/SConscript b/src/SConscript index 925921bf7552..301481c6458f 100644 --- a/src/SConscript +++ b/src/SConscript @@ -373,7 +373,7 @@ wesnoth_sources = Split(""" gui/dialogs/gamestate_inspector.cpp gui/dialogs/label_settings.cpp gui/dialogs/language_selection.cpp - gui/dialogs/loadscreen.cpp.cpp + gui/dialogs/loadscreen.cpp gui/dialogs/lobby/data.cpp gui/dialogs/lobby/info.cpp gui/dialogs/lobby/lobby.cpp From 0eed39ff23be490e8ea1c151cab191bc57b260e2 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Tue, 29 Mar 2016 14:48:25 +0300 Subject: [PATCH 022/240] Changed terrain code of desert mountains from Mdy to Mdd This is because 'y' is reserved for UMC use. --- data/core/terrain-graphics.cfg | 36 ++++++++++---------- data/core/terrain.cfg | 4 +-- data/multiplayer/maps/4p_Siege_Castles.map | 8 ++--- data/multiplayer/maps/5p_The_Wilderlands.map | 6 ++-- data/multiplayer/maps/8p_Mokena_Prairie.map | 8 ++--- 5 files changed, 31 insertions(+), 31 deletions(-) diff --git a/data/core/terrain-graphics.cfg b/data/core/terrain-graphics.cfg index 2fcf8b383efb..b3077efc3700 100644 --- a/data/core/terrain-graphics.cfg +++ b/data/core/terrain-graphics.cfg @@ -253,30 +253,30 @@ {NEW:BASE Ms hills/snow} # Desert Mountains -{OVERLAY_ROTATION_RESTRICTED2_F Mdy (!,Xv,!,C*,K*,X*,Ql,Qx*) base2 desert_mountains/desert-castle} -{OVERLAY_ROTATION_RESTRICTED_F Mdy (!,Xv,!,C*,K*,X*,Ql,Qx*) base2 desert_mountains/desert-castle} -{MOUNTAINS_2x4_NW_SE Mdy 18 base2 desert_mountains/desert_range3} -{MOUNTAINS_1x3_NW_SE Mdy 20 base2 desert_mountains/desert_range1} -{MOUNTAINS_1x3_SW_NE Mdy 20 base2 desert_mountains/desert_range2} -{MOUNTAINS_2x2 Mdy 40 base2 desert_mountains/desert5} -{MOUNTAINS_2x2 Mdy 30 base2 desert_mountains/desert6} - -{MOUNTAIN_SINGLE_RANDOM Mdy base2 desert_mountains/desert} +{OVERLAY_ROTATION_RESTRICTED2_F Mdd (!,Xv,!,C*,K*,X*,Ql,Qx*) base2 desert_mountains/desert-castle} +{OVERLAY_ROTATION_RESTRICTED_F Mdd (!,Xv,!,C*,K*,X*,Ql,Qx*) base2 desert_mountains/desert-castle} +{MOUNTAINS_2x4_NW_SE Mdd 18 base2 desert_mountains/desert_range3} +{MOUNTAINS_1x3_NW_SE Mdd 20 base2 desert_mountains/desert_range1} +{MOUNTAINS_1x3_SW_NE Mdd 20 base2 desert_mountains/desert_range2} +{MOUNTAINS_2x2 Mdd 40 base2 desert_mountains/desert5} +{MOUNTAINS_2x2 Mdd 30 base2 desert_mountains/desert6} + +{MOUNTAIN_SINGLE_RANDOM Mdd base2 desert_mountains/desert} #This one is to fill any "gaps" there might be when next to castles or walls -{NEW:BASE Mdy hills/dry} -{NEW:TRANSITION (Mdy,Mdy^Xm) (!,Md*,Mv,S*) -166 desert_mountains/desert} +{NEW:BASE Mdd hills/dry} +{NEW:TRANSITION (Mdd,Mdd^Xm) (!,Md*,Mv,S*) -166 desert_mountains/desert} # Special Desert Mountain to Chasm Blend transition - the default mountain-chasm transition is white, looks terrible. -{TRANSITION_COMPLETE_LF (Qx*,Ql*) (Mdy,Mdy^Xm) 2 transition3 desert_mountains/blend-from-chasm} +{TRANSITION_COMPLETE_LF (Qx*,Ql*) (Mdd,Mdd^Xm) 2 transition3 desert_mountains/blend-from-chasm} -{TRANSITION_COMPLETE_LF (Mdy,Mdy^Xm) Ai,W*,S* -165 non_submerged desert_mountains/desert-to-water} +{TRANSITION_COMPLETE_LF (Mdd,Mdd^Xm) Ai,W*,S* -165 non_submerged desert_mountains/desert-to-water} # Impassable peaks -{OVERLAY_LF Mdy^Xm 1 clouds mountains/cloud@V} -{PEAKS_1x2_SW_NE Mdy^Xm 15 peaks desert_mountains/peak_range1} -{PEAKS_LARGE Mdy^Xm 25 peaks desert_mountains/peak_large1} -{PEAKS_LARGE Mdy^Xm 33 peaks desert_mountains/peak_large2} -{OVERLAY_RANDOM_LF Mdy^Xm 2 peaks desert_mountains/peak} +{OVERLAY_LF Mdd^Xm 1 clouds mountains/cloud@V} +{PEAKS_1x2_SW_NE Mdd^Xm 15 peaks desert_mountains/peak_range1} +{PEAKS_LARGE Mdd^Xm 25 peaks desert_mountains/peak_large1} +{PEAKS_LARGE Mdd^Xm 33 peaks desert_mountains/peak_large2} +{OVERLAY_RANDOM_LF Mdd^Xm 2 peaks desert_mountains/peak} {OVERLAY_LF *^Xm 1 clouds mountains/cloud@V} {PEAKS_1x2_SW_NE *^Xm 15 peaks mountains/peak_range1} diff --git a/data/core/terrain.cfg b/data/core/terrain.cfg index 69073f511467..082ce3559eb3 100644 --- a/data/core/terrain.cfg +++ b/data/core/terrain.cfg @@ -796,7 +796,7 @@ Most units receive 20 to 40% defense in sand." id=desert_mountains name= _ "Mountains" editor_name= _ "Desert Mountains" - string=Mdy + string=Mdd aliasof=Mt editor_group=rough, desert [/terrain_type] @@ -1061,7 +1061,7 @@ Most units have about 50% defense in rocky caves, whereas cavalry are limited to id=cloud_desert name= _ "Mountains" editor_name= _ "Desert Impassable Mountains" - string=Mdy^Xm + string=Mdd^Xm aliasof=-,Mt,Xt editor_group=rough,obstacle,desert [/terrain_type] diff --git a/data/multiplayer/maps/4p_Siege_Castles.map b/data/multiplayer/maps/4p_Siege_Castles.map index 00ab98ee3d94..c2c34dc1d4f1 100644 --- a/data/multiplayer/maps/4p_Siege_Castles.map +++ b/data/multiplayer/maps/4p_Siege_Castles.map @@ -1,8 +1,8 @@ -Mdy, Mdy, Dd, Dd, Dd, Dd, Dd, Dd, Hd, Mdy, Dd, Dd, Hd, Dd, Dd, Dd, Mm, Hh, Gs^Ft, Gs^Ft, Mm, Hh, Hh, Rd, Gg, Gs^Fp, Hh, Mm, Mm, Hh, Gs^Fp, Mm, Mm, Mm^Xm, Hh, Wwf, Wwf, Wwf -Mdy, Mdy, Dd, Dd, Dd, Hd, Rd, Dd, Rd, Hd, Dd, Dd, Dd, Mdy, Dd, Dd, Mm, Hh, Gs^Ft, Gs^Ft, Mm, Hh, Hh, Rd, Gg, Gs^Fp, Hh, Mm, Mm, Hh, Gs^Fp, Mm, Mm, Mm^Xm, Hh, Wwf, Wwf, Wwf +Mdd, Mdd, Dd, Dd, Dd, Dd, Dd, Dd, Hd, Mdd, Dd, Dd, Hd, Dd, Dd, Dd, Mm, Hh, Gs^Ft, Gs^Ft, Mm, Hh, Hh, Rd, Gg, Gs^Fp, Hh, Mm, Mm, Hh, Gs^Fp, Mm, Mm, Mm^Xm, Hh, Wwf, Wwf, Wwf +Mdd, Mdd, Dd, Dd, Dd, Hd, Rd, Dd, Rd, Hd, Dd, Dd, Dd, Mdd, Dd, Dd, Mm, Hh, Gs^Ft, Gs^Ft, Mm, Hh, Hh, Rd, Gg, Gs^Fp, Hh, Mm, Mm, Hh, Gs^Fp, Mm, Mm, Mm^Xm, Hh, Wwf, Wwf, Wwf Rd, Rd, Rd, Dd^Vda, Rd, Rd, Dd, Rd, Ch, Rd, Rr, Dd^Vda, Rr, Dd, Dd, Gs, Gs, Mm, Mm, Gs^Ft, Gs^Ft, Gs^Ft, Gs, Rd, Gg, Gg, Rr, Rr, Rr, Gs^Fp, Hh^Vhh, Hh, Ds, Ds, Wwf, Wwf, Wwf, Wwf -Mdy, Mdy, Hd, Rd, Dd, Dd, Ch, Ch, Wwt, Rr, Ch, Rr, Dd, Rr, Rr, Rr, Rr, Gs, Hh, Gs^Ft, Gs, Gs, Rr, Rr, Rr, Rr, Gs^Fp, Gs, Gs, Rr, Ds, Ds, Wwf, Ds, Wwf, Wwf, Gs^Fp, Gs^Fp -Mdy, Mdy, Rd, Rd, Dd^Do, Dd, Ch, Ch, 1 Kh, Ww^Bw/, Rr, Dd, Gs, Gs, Hh, Gs^Vht, Gs^Ft, Rr, Rr, Gs^Vht, Rr, Rr, Gs^Fp, Gg^Ve, Rr, Gs^Fp, Mm, Wwt, Wwt, Ww^Bw|, Ww, Ww, Ww, Wwf, Wwf, Wwf, Ch, Gd +Mdd, Mdd, Hd, Rd, Dd, Dd, Ch, Ch, Wwt, Rr, Ch, Rr, Dd, Rr, Rr, Rr, Rr, Gs, Hh, Gs^Ft, Gs, Gs, Rr, Rr, Rr, Rr, Gs^Fp, Gs, Gs, Rr, Ds, Ds, Wwf, Ds, Wwf, Wwf, Gs^Fp, Gs^Fp +Mdd, Mdd, Rd, Rd, Dd^Do, Dd, Ch, Ch, 1 Kh, Ww^Bw/, Rr, Dd, Gs, Gs, Hh, Gs^Vht, Gs^Ft, Rr, Rr, Gs^Vht, Rr, Rr, Gs^Fp, Gg^Ve, Rr, Gs^Fp, Mm, Wwt, Wwt, Ww^Bw|, Ww, Ww, Ww, Wwf, Wwf, Wwf, Ch, Gd Dd, Dd, Dd^Vdt, Dd, Dd, Dd, Ch, Wwt, Ww^Bw|, Ww^Bw\, Ch, Rr, Gs, Mm, Mm, Wwt, Wwt, Gs, Gs, Rr, Gs, Gs^Fp, Hh, Hh, Ww^Bw|, Gs, Wwt, Wwt, Wwt, Ww^Bw|, Ww, Ww, Gg, Ch, Gg, Gg, Gs, Gd Dd, Dd, Rd, Dd, Gs, Gs, Gll, Rr, Ch, Wwt, Rr, Rr, Rr, Gs^Ft, Hh, Wwt, Gs, Gs, Rr, Rr, Gs^Fp, Gg, Wwf, Wwt, Gg, Wwt, Ww^Vm, Wwt, Gg, Gll, Gg^Vh, Gs^Fp, Gg, Gg, Hh, Gg^Fet, Gg^Vh, Gs Gs, Gs, Rd, Rd, Gs, Gd, Gs^Ft, Rr, Gs, Wwf, Gs, Gs, Gs^Vht, Rr, Rr, Gs, Rr, Rr, Gs^Fp, Mm, Hh, Gg, Wwt, Gg, Gs^Fp, Gg, Wwf, Wwr, Gg, Gll, Gs^Fp, Hh, Ch, Ww, Gg^Fet, Hh, Gg, Gs diff --git a/data/multiplayer/maps/5p_The_Wilderlands.map b/data/multiplayer/maps/5p_The_Wilderlands.map index 3522fc134e5f..c1cdb8be3363 100644 --- a/data/multiplayer/maps/5p_The_Wilderlands.map +++ b/data/multiplayer/maps/5p_The_Wilderlands.map @@ -32,10 +32,10 @@ Gs^Ft, Gs^Ft, Gs^Ft, Wwf, Wwf, Gs, Gs^Ft, Rd, Gs, Gs, Gs, Rd, Rd, Gs, Rd, Rd, Gs Xu, Xu, Gs, Gs, Ww, Ww, Ww, Gs, Gs, Gs, Gs, Gs^Ft, Rd, Rd, Gs, Gs, Gs, Hh, Gs, Qxe, Qxe, Gs, Gs^Ft, Rd, Xu, Xu, Rr, Rr, Xu, Xu, Xu, Wwf, Rr, Rr, Rr, Xu, Wwf, Rr, Gs, Gs, Gs, Ww, Gs, Gs, Gs^Vht, Gs, Gs, Gs, Gs, Gs^Ft, Gs, Gs, Xu, Cud, Cud, Ww, Ww, Cud, Xu, Rd, Rd, Rd Uu, Uu^Vu, Gs, Wwf, Wwf, Ww, Wo, Ww, Ww, Gs, Ww, Rd, Gs, Gs^Ft, Gs^Ft, Gs, Wwf, Gs, Gs^Ft, Gs^Ft, Qxe, Gs^Ft, Rd, Rd, Rd, Rd, Cud, Xu, Rd, Uu^Vud, Xu, Xu, Uh, Xu, Xu, Rr, Gs^Ft, Wwf, Wwf, Gs, Ww, Ww, Gs, Gs, Gs, Gs, Gs, Xu, Xu, Gs, Xu, Xu, Uh, Uu, Wwf, Wwf, Wwf, Ww, Ww, Xu, Xu, Xu Xu, Xu, Xu, Gs, Wwf, Ww, Wo, Wo, Wo, Ww, Ww^Bw/, Ww^Bw/, Wwf, Gs^Ft, Gs, Gs^Ft, Wwf, Wwf, Gs, Gs^Ft, Qxe, Gs^Ft, Rd, Rd, Dd, Gs^Ft, Dd, Cud, Cud, Rd, Xu, Gs^Ft, Cud, Xu, Cud, Rd, Gs, Gs, Ww, Ww, Gs, Ww, Ww, Gs, Gs, Gs^Ft, Hh, Gs, Cud, Cud, Uu, Xu, Rr, Uu^Uf, Wwf, Wwf, Rr, Wwf, Wwf, Ww, Uh, Uh -Xu, Xu, Xu, Xu, Wwf, Ww, Ww, Ww, Ww^Bw/, Ww^Bw/, Wo, Ww, Wwf, Wwf, Wwf, Wwf, Gs, Wwf, Gs^Ft, Gs^Ft, Qxe, Gs^Ft, Rd, Gs^Ft, Gs^Ft, Mdy, Gs^Ft, Mdy, Dd, Cud, Cud, Gs^Ft, Cud, Cud, Dd, Gs, Gs, Ww, Ww, Ww, Gs, Gs, Gs, Ww, Wwf, Mm, Wwf, Xu, Xu, Cud, Rd, Rr, Wwf, Wwf, Xu, Xu, Xu, Rr, Rr, Wwf, Ww^Vm, Ww +Xu, Xu, Xu, Xu, Wwf, Ww, Ww, Ww, Ww^Bw/, Ww^Bw/, Wo, Ww, Wwf, Wwf, Wwf, Wwf, Gs, Wwf, Gs^Ft, Gs^Ft, Qxe, Gs^Ft, Rd, Gs^Ft, Gs^Ft, Mdd, Gs^Ft, Mdd, Dd, Cud, Cud, Gs^Ft, Cud, Cud, Dd, Gs, Gs, Ww, Ww, Ww, Gs, Gs, Gs, Ww, Wwf, Mm, Wwf, Xu, Xu, Cud, Rd, Rr, Wwf, Wwf, Xu, Xu, Xu, Rr, Rr, Wwf, Ww^Vm, Ww Ss, Ss, Rr, Wwf, Wwf, Wwf, Gs, Gs, Ww, Wo, Ww^Vm, Ww, Wwf, Gs, Gs, Wwf, Wwf, Gs, Gs, Chr, Khr, Gs^Ft, Rd, Gs, Gs^Ft, Dd, Dd, Dd, Hd, Dd, Cud, Cud, Gs^Ft, Gs^Ft, Dd, Dd^Vdt, Ww, Gs, Ww, Gs, Gs, Gs, Gs, Gs, Hh, Wwf, Wwf, Wwf, Wwf, Xu, Wwf, Wwf, Rr, Xu, Xu, Rd, Rd, Cud, Rr, Wwf, Ww, Ww -Gs^Ft, Gs^Ft, Xu, Xu, Wwf, Xu, Xu, Gs, Gs, Ww, Ww, Wwf, Gs, Wwf, Ww, Gs, Gs, Gs^Ft, Qxe, Chr, Gs^Ft, Chr, Gs, Rd, Dd, Dd, Mdy, Dd^Do, Mdy, Dd, Cud, Dd, Hd, Mdy, Hd, Gs, Gs, Ww, 5 Ww, Gs^Ft, Gs^Ft, Gs^Ft, Gs, Hh, Mm, Mm, Rp, Rp, Rp, Wwf, Uu^Uf, Rr, Rr, Cud, Xu, Xu, Rd, Rd, Xu, Wwf, Uu^Uf, Uu^Uf -Rb, Rb, Rb, Xu, Xu, Wwf, Xu, Ww, Gs, Gs, Rd, Wwf, Gs, Gs, Wwf, Gs, Gs^Ft, Gs^Ft, Qxe, Gs^Ft, Gs^Ft, Rd, Gs, Dd, Dd, Mdy, Mdy, Hd, Dd, Dd, Cud, Dd, Dd, Gs^Ft, Dd, Dd, Gs, Ww, Ww, Gs^Ft, Gs, Gs, Gs, Gs, Gs, Mm, Rp, Xu, Cud, Xu, Cud, Xu, Rd, Rr, Xu, Cud, Cud, Xu, Cud, Xu, Xu, Xu +Gs^Ft, Gs^Ft, Xu, Xu, Wwf, Xu, Xu, Gs, Gs, Ww, Ww, Wwf, Gs, Wwf, Ww, Gs, Gs, Gs^Ft, Qxe, Chr, Gs^Ft, Chr, Gs, Rd, Dd, Dd, Mdd, Dd^Do, Mdd, Dd, Cud, Dd, Hd, Mdd, Hd, Gs, Gs, Ww, 5 Ww, Gs^Ft, Gs^Ft, Gs^Ft, Gs, Hh, Mm, Mm, Rp, Rp, Rp, Wwf, Uu^Uf, Rr, Rr, Cud, Xu, Xu, Rd, Rd, Xu, Wwf, Uu^Uf, Uu^Uf +Rb, Rb, Rb, Xu, Xu, Wwf, Xu, Ww, Gs, Gs, Rd, Wwf, Gs, Gs, Wwf, Gs, Gs^Ft, Gs^Ft, Qxe, Gs^Ft, Gs^Ft, Rd, Gs, Dd, Dd, Mdd, Mdd, Hd, Dd, Dd, Cud, Dd, Dd, Gs^Ft, Dd, Dd, Gs, Ww, Ww, Gs^Ft, Gs, Gs, Gs, Gs, Gs, Mm, Rp, Xu, Cud, Xu, Cud, Xu, Rd, Rr, Xu, Cud, Cud, Xu, Cud, Xu, Xu, Xu Uu^Uf, Uu^Uf, Uu^Uf, Rb, Rb, Rb, Xu, Rb, Rb, Gs^Ft, Gs, Gs^Ft, Gs^Ft, Hh, Ds, Wwf, Wwf, Gs^Ft, Gs^Ft, Qxe, Qxe, Gs^Ft, Gs, Dd, Dd^Vda, Hd, Dd, Dd, Re, Re, Gs^Ft, Dd, Dd, Dd^Do, Dd, Dd, Dd, Gs, Wwf, Ww, Chw, Chw, Ww, Wwf, Rp, Rp, Gs, Xu, Xu, Xu, Xu, Xu, Uu^Uf, Rd, Uh, Xu, Xu, Cud, Rd, Xu, Xu, Xu Uh, Uu^Vu, Rb, Rb, Xu, Wwf, Wwf, Xu, Rb, Rb, Gs, Hh, Gs^Vht, Gs^Ft, Ds, Wwf, Gs, Rd, Rd, Gs^Ft, Re, Qxe, Qxe, Gs, Re, Dd, Re, Dd, Re, Gs^Ft, Hd, Dd, Dd, Dd, Dd, Dd, Gs, Wwf, Chw, Chw, Ww, Kh, Chw, Chw, Gs, Gs, Gs, Gs, Xu, Xu, Uu^Vu, Uu, Uu^Uf, Rd, Rd, Xu, Rr, Rr, Rd, Rr, Rr, Rr Ql, Ql, Rb, Rb, Ql, Xu, Xu, Rb, Gs^Ft, Hh, Gs, Gs, Gs^Ft, Ds, Gs, Ds, Gs, Gs, Re, Re, Gs, Gs^Ft, Qxe, Gs, Gs, Re, Re, Re, Gs, Gs^Ft, Dd, Dd, Dd, Dd, Mm, Hh, Gs, Gs, Wwf, Wwf, Chw, Chw, Ww^Vm, Ww, Ww, Ww, Gs, Gs, Gs, Rd, Rd, Uu^Uf, Rd, Rd, Uu^Uf, Rr, Rr, Rr, Kh, Rd, Rr, Rr diff --git a/data/multiplayer/maps/8p_Mokena_Prairie.map b/data/multiplayer/maps/8p_Mokena_Prairie.map index b226d8004817..f11b7bb7985f 100644 --- a/data/multiplayer/maps/8p_Mokena_Prairie.map +++ b/data/multiplayer/maps/8p_Mokena_Prairie.map @@ -3,8 +3,8 @@ _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _of _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Hhd, Gg^Fet, 6 Ke, Hhd, Gd^Fts, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Dd^Vda, Rd, Rd, Ce, Ce, Ce, Rp, Rp, Gs^Vl, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr -_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Mdy, Rd, Gs^Ftd, Ds, Gs, Gll, Gs, Rp, Gs^Wm, Gd, Hhd, Gs, Ds, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr -_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Mdy, Mdy, Dd, Dd, Gs, Hhd, Gll, Gll, Gll, Rp, Rp, Gg, Hhd, Gg^Fet, Mdy, Dd, Ds, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr +_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Mdd, Rd, Gs^Ftd, Ds, Gs, Gll, Gs, Rp, Gs^Wm, Gd, Hhd, Gs, Ds, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr +_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Mdd, Mdd, Dd, Dd, Gs, Hhd, Gll, Gll, Gll, Rp, Rp, Gg, Hhd, Gg^Fet, Mdd, Dd, Ds, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Dd^Vda, Rd, Dd, Dd, Hhd, Gs, Gll, Gll, Hhd, Gs, Gll, Gg^Fet, Gg^Vl, Rp, Rp, Gd^Fts, Hhd, Gg^Fet, Hhd, Gs, Gg^Vl, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, Gs^Ft, Rd, Ds, Hd, Gs, Gs^Ftd, Gll, Gll, Gs, Gll^Ftr, Gs^Vl, Gs, Gll, Hhd, Gs^Ft, Gg^Efm, Gll, Rp, Rp, Gd^Fts, Gs, Gd, Gs, Hhd, Ww, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, Hhd, Ce, Rd, Gs, Gs^Ftd, Gll, Gll, Gs, Gs, Gll^Ftr, Gs, Wwf, Gs, Gll, Gll, Gll, Gll, Hhd, Gd^Fts, Hhd, Rp, Rp, Gg, Gd^Fts, Wwf, Ce, Gg^Fet, _off^_usr, _off^_usr, _off^_usr @@ -24,8 +24,8 @@ _off^_usr, _off^_usr, Hhd, Ce, Ce, Ww^Bw/, Rp, Hhd, Gg^Vl, Gg, Gll, Gll, Gll, Gl _off^_usr, _off^_usr, _off^_usr, 4 Ke, Ce, Wwf, Gd^Fts, Rp, Rp, Gll, Hhd, Gd^Fts, Hhd, Gll, Gll, Gs^Ft, Gll, Hhd, Wwf, Wwf, Gll^Ftr, Hhd, Gs, Gs, Gll, Gll, Gs, Gll, Ce, 1 Ke, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, Gg^Fet, Ww, Wwf, Gs, Gg, Gs, Rp, Rp, Gd^Fts, Gll, Gll, Gg^Fet, Gll, Gll, Gs, Gs^Vl, Gs, Gs, Gs, Gll, Gll, Gs, Gs^Ftd, Ds, Rd, Gs^Ftd, Hhd, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Hhd, Gg^Vl, Gd, Hhd, Gd^Fts, Hhd, Rp, Rp, Gg, Gg^Vl, Hhd, Gll, Gs, Gs^Ft, Hhd, Gll, Gll, Hhd, Gs^Ftd, Dd, Hd, Dd^Vda, Rd, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr -_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Gs, Ds, Gg^Fet, Mdy, Gd^Fts, Hhd, Rp, Rp, Gs^Ft, Gll, Gs, Gll, Gll, Hhd, Gs, Dd, Dd, Mdy, Rd, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr -_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Dd, Ds, Gg^Fet, Hhd, Gg, Gs^Wm, Rp, Gs, Gll, Gs, Gs, Gs^Ftd, Dd, Mdy, Mdy, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr +_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Gs, Ds, Gg^Fet, Mdd, Gd^Fts, Hhd, Rp, Rp, Gs^Ft, Gll, Gs, Gll, Gll, Hhd, Gs, Dd, Dd, Mdd, Rd, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr +_off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Dd, Ds, Gg^Fet, Hhd, Gg, Gs^Wm, Rp, Gs, Gll, Gs, Gs, Gs^Ftd, Dd, Mdd, Mdd, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Gs, Gg^Vl, Gs, Rp, Rp, Ce, Gll, Rd, Ds, Dd^Vda, Rd, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Rp, Gg^Fet, Ce, 5 Ke, Ce, Hhd, Rd, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, Hhd, _off^_usr, Gd^Fts, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr, _off^_usr From cb2e8bc412ed4134d0e0124c49b879cbeeebb417 Mon Sep 17 00:00:00 2001 From: ln-zookeeper Date: Tue, 29 Mar 2016 14:55:35 +0300 Subject: [PATCH 023/240] Updated changelog --- changelog | 2 ++ 1 file changed, 2 insertions(+) diff --git a/changelog b/changelog index 8ab47e4efd81..7cd2627a63a7 100644 --- a/changelog +++ b/changelog @@ -2,6 +2,8 @@ Version 1.13.4+dev: * Language and i18n: * Updated translations: * Removed support for SDL 1.2. SDL 2 is now the only supported version. + * Terrains: + * Changed terrain code of Desert Mountains from Mdy to Mdd. * WML engine: * Fix some issues with [foreach] * Fix some issues with backstab-like weapon specials From 49fc414cc614bad8c4cf9ca65c4474a4493c65bc Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 09:28:35 -0400 Subject: [PATCH 024/240] Update XCode project --- .../Xcode/Wesnoth.xcodeproj/project.pbxproj | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj index 0f2251b437a4..c9f8adfb2661 100644 --- a/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj +++ b/projectfiles/Xcode/Wesnoth.xcodeproj/project.pbxproj @@ -71,6 +71,8 @@ 8D11072F0486CEB800E47090 /* Cocoa.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 1058C7A1FEA54F0111CA2CBB /* Cocoa.framework */; }; 911F2DAD1BA086A400E3102E /* window.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAB1BA086A400E3102E /* window.cpp */; }; 911F2DB01BA086FA00E3102E /* alpha.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 911F2DAE1BA086F900E3102E /* alpha.cpp */; }; + 9122417C1CAAB7B7008B347F /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9122417A1CAAB7B7008B347F /* loadscreen.cpp */; }; + 9122417D1CAAB7B7008B347F /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 9122417A1CAAB7B7008B347F /* loadscreen.cpp */; }; 91273E8F1C7BF1D7005E7F81 /* _main.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E721C7BF1C0005E7F81 /* _main.cfg */; }; 91273E901C7BF1D7005E7F81 /* advanced_preferences.cfg in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E731C7BF1C0005E7F81 /* advanced_preferences.cfg */; }; 91273E911C7BF1D7005E7F81 /* ai in Copy Data Files */ = {isa = PBXBuildFile; fileRef = 91273E741C7BF1C0005E7F81 /* ai */; }; @@ -353,7 +355,6 @@ B5599B2C0EC62181008DD061 /* label.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999FB0EC62181008DD061 /* label.cpp */; }; B5599B2E0EC62181008DD061 /* map.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A000EC62181008DD061 /* map.cpp */; }; B5599B2F0EC62181008DD061 /* log.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A020EC62181008DD061 /* log.cpp */; }; - B5599B310EC62181008DD061 /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A050EC62181008DD061 /* loadscreen.cpp */; }; B5599B330EC62181008DD061 /* language.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A090EC62181008DD061 /* language.cpp */; }; B5599B340EC62181008DD061 /* key.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0B0EC62181008DD061 /* key.cpp */; }; B5599B350EC62181008DD061 /* intro.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A0D0EC62181008DD061 /* intro.cpp */; }; @@ -470,7 +471,6 @@ B597C5440FACD6CA00CE81F5 /* animation.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559997B0EC62181008DD061 /* animation.cpp */; }; B597C5450FACD6CA00CE81F5 /* config.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599AA80EC62181008DD061 /* config.cpp */; }; B597C5470FACD6CA00CE81F5 /* show_dialog.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999A10EC62181008DD061 /* show_dialog.cpp */; }; - B597C5480FACD6CA00CE81F5 /* loadscreen.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A050EC62181008DD061 /* loadscreen.cpp */; }; B597C54A0FACD6CA00CE81F5 /* spacer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5A9BD0F0ECA805A002BE442 /* spacer.cpp */; }; B597C54D0FACD6CA00CE81F5 /* floating_textbox.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A920EC62181008DD061 /* floating_textbox.cpp */; }; B597C5500FACD6CA00CE81F5 /* drop_target.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B559994B0EC62181008DD061 /* drop_target.cpp */; }; @@ -713,7 +713,6 @@ B5BB6C900F89448100444FBF /* preprocessor.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AD0EC62181008DD061 /* preprocessor.cpp */; }; B5BB6C910F89448200444FBF /* string_utils.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999AF0EC62181008DD061 /* string_utils.cpp */; }; B5BB6C920F89448300444FBF /* tokenizer.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B55999B10EC62181008DD061 /* tokenizer.cpp */; }; - B5BB6C960F8944FB00444FBF /* loadscreen_empty.cpp in Sources */ = {isa = PBXBuildFile; fileRef = B5599A030EC62181008DD061 /* loadscreen_empty.cpp */; }; B5BB6CD90F89470B00444FBF /* server_main.m in Sources */ = {isa = PBXBuildFile; fileRef = B5BB6CD80F89470B00444FBF /* server_main.m */; }; B5BB6D040F8949CF00444FBF /* wesnothd in CopyFiles */ = {isa = PBXBuildFile; fileRef = B5BB6B4B0F890FBA00444FBF /* wesnothd */; }; B5BB6EFE0F93B83500444FBF /* SDLMain.nib in Resources */ = {isa = PBXBuildFile; fileRef = B5BB6EFD0F93B83500444FBF /* SDLMain.nib */; }; @@ -1209,6 +1208,8 @@ 911F2DAE1BA086F900E3102E /* alpha.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = alpha.cpp; sourceTree = ""; }; 911F2DAF1BA086FA00E3102E /* alpha.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = alpha.hpp; sourceTree = ""; }; 911F2DB11BA0870E00E3102E /* compat.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = compat.hpp; sourceTree = ""; }; + 9122417A1CAAB7B7008B347F /* loadscreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = loadscreen.cpp; sourceTree = ""; }; + 9122417B1CAAB7B7008B347F /* loadscreen.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; path = loadscreen.hpp; sourceTree = ""; }; 91273E721C7BF1C0005E7F81 /* _main.cfg */ = {isa = PBXFileReference; lastKnownFileType = text; path = _main.cfg; sourceTree = ""; }; 91273E731C7BF1C0005E7F81 /* advanced_preferences.cfg */ = {isa = PBXFileReference; lastKnownFileType = text; path = advanced_preferences.cfg; sourceTree = ""; }; 91273E741C7BF1C0005E7F81 /* ai */ = {isa = PBXFileReference; lastKnownFileType = folder; path = ai; sourceTree = ""; }; @@ -1670,9 +1671,6 @@ B5599A000EC62181008DD061 /* map.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = map.cpp; sourceTree = ""; }; B5599A010EC62181008DD061 /* log.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = log.hpp; path = ../src/log.hpp; sourceTree = ""; }; B5599A020EC62181008DD061 /* log.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = log.cpp; path = ../src/log.cpp; sourceTree = ""; }; - B5599A030EC62181008DD061 /* loadscreen_empty.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = loadscreen_empty.cpp; path = ../src/loadscreen_empty.cpp; sourceTree = ""; }; - B5599A040EC62181008DD061 /* loadscreen.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = loadscreen.hpp; path = ../src/loadscreen.hpp; sourceTree = ""; }; - B5599A050EC62181008DD061 /* loadscreen.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = loadscreen.cpp; path = ../src/loadscreen.cpp; sourceTree = ""; }; B5599A080EC62181008DD061 /* language.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = language.hpp; path = ../src/language.hpp; sourceTree = ""; }; B5599A090EC62181008DD061 /* language.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; name = language.cpp; path = ../src/language.cpp; sourceTree = ""; }; B5599A0A0EC62181008DD061 /* key.hpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.h; name = key.hpp; path = ../src/key.hpp; sourceTree = ""; }; @@ -2597,9 +2595,6 @@ 49E84DC017384EF800A4F376 /* leader_scroll_dialog.cpp */, 49E84DC117384EF800A4F376 /* leader_scroll_dialog.hpp */, B52EE8B1121359A600CFBDAB /* lexical_cast.hpp */, - B5599A050EC62181008DD061 /* loadscreen.cpp */, - B5599A040EC62181008DD061 /* loadscreen.hpp */, - B5599A030EC62181008DD061 /* loadscreen_empty.cpp */, B52EE8B2121359A600CFBDAB /* lobby_preferences.cpp */, B52EE8B3121359A600CFBDAB /* lobby_preferences.hpp */, B5599A020EC62181008DD061 /* log.cpp */, @@ -3940,6 +3935,8 @@ 91B6217B1B74E6D100B00E0F /* label_settings.hpp */, B5A9BCBF0ECA805A002BE442 /* language_selection.cpp */, B5A9BCC00ECA805A002BE442 /* language_selection.hpp */, + 9122417A1CAAB7B7008B347F /* loadscreen.cpp */, + 9122417B1CAAB7B7008B347F /* loadscreen.hpp */, B55BE04611234B1A00154E6C /* lobby */, EC2F9A031A18112D00A14878 /* lua_interpreter.cpp */, 91B621DC1B76B71800B00E0F /* lua_interpreter.hpp */, @@ -4537,7 +4534,6 @@ EC89A1391879D17D00A3B0B1 /* lmathlib.cpp in Sources */, EC89A13A1879D17D00A3B0B1 /* lmem.cpp in Sources */, EC89A13B1879D17D00A3B0B1 /* loadlib.cpp in Sources */, - B5599B310EC62181008DD061 /* loadscreen.cpp in Sources */, B55BE04B11234B1A00154E6C /* data.cpp in Sources */, B55BE04C11234B1A00154E6C /* info.cpp in Sources */, B54AC6F50FEA9F92006F6FBD /* lobby.cpp in Sources */, @@ -4837,6 +4833,7 @@ 9130A4601C73BB6100852782 /* select_orb_colors.cpp in Sources */, 91DCA6891C9066CC0030F8D0 /* unit_preview_pane.cpp in Sources */, 91DCA68D1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */, + 9122417C1CAAB7B7008B347F /* loadscreen.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -4952,7 +4949,6 @@ B597C5E20FACD6CA00CE81F5 /* language.cpp in Sources */, B52EE89F1213590500CFBDAB /* list.cpp in Sources */, B597C59B0FACD6CA00CE81F5 /* listbox.cpp in Sources */, - B597C5480FACD6CA00CE81F5 /* loadscreen.cpp in Sources */, B55BE04D11234B1A00154E6C /* data.cpp in Sources */, B55BE04E11234B1A00154E6C /* info.cpp in Sources */, B54AC6F30FEA9F92006F6FBD /* lobby.cpp in Sources */, @@ -5118,6 +5114,7 @@ 91DCA68E1C9066EC0030F8D0 /* unit_recruit.cpp in Sources */, 91DCA6901C9360610030F8D0 /* test_formula_core.cpp in Sources */, 91EF6C051C9E22EA00E2A733 /* sha1.cpp in Sources */, + 9122417D1CAAB7B7008B347F /* loadscreen.cpp in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -5137,7 +5134,6 @@ B5BB6B7D0F893E7500444FBF /* game.cpp in Sources */, EC4DF45619FEA7A8000EC086 /* gettext_boost.cpp in Sources */, B5BB6B7E0F893E7500444FBF /* input_stream.cpp in Sources */, - B5BB6C960F8944FB00444FBF /* loadscreen_empty.cpp in Sources */, B5BB6C800F89435300444FBF /* log.cpp in Sources */, B5BB6B880F893E7500444FBF /* metrics.cpp in Sources */, EC64D7661A085F120092EF75 /* mt_rng.cpp in Sources */, From 7b6dea55c848f6e30b90d5681491c218968b41d9 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 09:37:57 -0400 Subject: [PATCH 025/240] Move filtering code out of the unit formula manager. --- src/units/filter.cpp | 13 ++++++++++++- src/units/formula_manager.cpp | 16 ---------------- src/units/formula_manager.hpp | 2 -- 3 files changed, 12 insertions(+), 19 deletions(-) diff --git a/src/units/filter.cpp b/src/units/filter.cpp index e96ad007d617..de40708ee040 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -35,6 +35,8 @@ #include "units/types.hpp" #include "variable.hpp" // needed for vconfig, scoped unit #include "wml_exception.hpp" // needed for FAIL +#include "formula/callable_objects.hpp" +#include "formula/formula.hpp" #include #include @@ -551,7 +553,16 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l } } if (!vcfg["formula"].blank()) { - if (!u.formula_manager().matches_filter(vcfg["formula"], loc, u)) { + try { + const unit_callable callable(loc,u); + const game_logic::formula form(vcfg["formula"]); + if(!form.evaluate(callable).as_bool()) { + return false; + } + return true; + } catch(game_logic::formula_error& e) { + lg::wml_error() << "Formula error in unit filter: " << e.type << " at " << e.filename << ':' << e.line << ")\n"; + // Formulae with syntax errors match nothing return false; } } diff --git a/src/units/formula_manager.cpp b/src/units/formula_manager.cpp index 8a107cae0114..5f62bfa306f9 100644 --- a/src/units/formula_manager.cpp +++ b/src/units/formula_manager.cpp @@ -23,22 +23,6 @@ #include -bool unit_formula_manager::matches_filter(const std::string & cfg_formula, const map_location & loc, const unit & me) -{ - try { - const unit_callable callable(loc,me); - const game_logic::formula form(cfg_formula); - if(!form.evaluate(callable).as_bool()) {///@todo use formula_ai - return false; - } - return true; - } catch(game_logic::formula_error& e) { - lg::wml_error() << "Formula error in unit filter: " << e.type << " at " << e.filename << ':' << e.line << ")\n"; - // Formulae with syntax errors match nothing - return false; - } -} - void unit_formula_manager::add_formula_var(std::string str, variant var) { if(!formula_vars_) formula_vars_ = new game_logic::map_formula_callable; diff --git a/src/units/formula_manager.hpp b/src/units/formula_manager.hpp index 70b80edef0ac..370f3330fc3d 100644 --- a/src/units/formula_manager.hpp +++ b/src/units/formula_manager.hpp @@ -43,8 +43,6 @@ class unit_formula_manager { const std::string& get_loop_formula() const { return unit_loop_formula_; } const std::string& get_priority_formula() const { return unit_priority_formula_; } - bool matches_filter( const std::string & cfg_formula, const map_location & loc, const unit & me); - void read(const config & ai); void write(config & cfg); From d8ee9dca290e260d2fe95fce74ee3a892949b6d1 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 10:29:56 -0400 Subject: [PATCH 026/240] Expose second unit to unit filter formulas --- changelog | 1 + src/units/filter.cpp | 18 ++++++++++++------ 2 files changed, 13 insertions(+), 6 deletions(-) diff --git a/changelog b/changelog index 7cd2627a63a7..09caf203f520 100644 --- a/changelog +++ b/changelog @@ -16,6 +16,7 @@ Version 1.13.4+dev: * New ~SCALE_INTO_SHARP(w,h) IPF which preserves aspect ratio, using nearest neighbor scaling. * Support delayed_variable_substitution= in [on_undo], [on_redo] + * formula= in SUF can now reference $other_unit via the formula variable "other" * AiWML: * Simplified aspect syntax which works for all aspects, present and future: * All aspects with simple values can be specified as key=value diff --git a/src/units/filter.cpp b/src/units/filter.cpp index de40708ee040..1f78f8bb7396 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -187,7 +187,7 @@ class basic_unit_filter_impl : public unit_filter_abstract_impl { std::vector cond_children_; std::vector cond_child_types_; - bool internal_matches_filter(const unit & u, const map_location & loc) const; + bool internal_matches_filter(const unit & u, const map_location & loc, const unit* u2) const; }; /** "Factory" method which constructs an appropriate implementation @@ -233,13 +233,13 @@ bool basic_unit_filter_impl::matches(const unit & u, const map_location& loc, co if (u2) { const map_location& loc2 = u2->get_location(); scoped_xy_unit auto_store("other_unit", loc2.x, loc2.y, fc_.get_disp_context().units()); - matches = internal_matches_filter(u, loc); + matches = internal_matches_filter(u, loc, u2); } else { - matches = internal_matches_filter(u, loc); + matches = internal_matches_filter(u, loc, u2); } } else { // If loc is invalid, then this is a recall list unit (already been scoped) - matches = internal_matches_filter(u, loc); + matches = internal_matches_filter(u, loc, NULL); } // Handle [and], [or], and [not] with in-order precedence @@ -258,7 +258,7 @@ bool basic_unit_filter_impl::matches(const unit & u, const map_location& loc, co return matches; } -bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_location& loc) const +bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_location& loc, const unit* u2) const { if (!vcfg["name"].blank() && vcfg["name"].t_str() != u.name()) { return false; @@ -554,7 +554,13 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l } if (!vcfg["formula"].blank()) { try { - const unit_callable callable(loc,u); + const unit_callable main(loc,u); + game_logic::map_formula_callable callable(&main); + if (u2) { + boost::intrusive_ptr secondary(new unit_callable(*u2)); + callable.add("other", variant(secondary.get())); + // It's not destroyed upon scope exit because the variant holds a reference + } const game_logic::formula form(vcfg["formula"]); if(!form.evaluate(callable).as_bool()) { return false; From 0f072f34f2da7f2d38c6d265443b73374ff3e161 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 12:36:00 -0400 Subject: [PATCH 027/240] Several expansions to filters - Side, location, and weapon filters now support formulas - Additional keys in weapon filters; now covers everything except weights - [has_attack] in unit filters - Formula view of sides, terrain, and weapons expanded to mostly match Lua view --- changelog | 7 ++++ src/formula/callable_objects.cpp | 69 +++++++++++++++++++++++++++----- src/formula/callable_objects.hpp | 44 +++++++++++++++++++- src/side_filter.cpp | 17 ++++++++ src/terrain/filter.cpp | 20 +++++++++ src/units/attack_type.cpp | 34 ++++++++++++++++ src/units/filter.cpp | 16 +++++++- 7 files changed, 195 insertions(+), 12 deletions(-) diff --git a/changelog b/changelog index 09caf203f520..9c5229a8c25b 100644 --- a/changelog +++ b/changelog @@ -17,6 +17,10 @@ Version 1.13.4+dev: nearest neighbor scaling. * Support delayed_variable_substitution= in [on_undo], [on_redo] * formula= in SUF can now reference $other_unit via the formula variable "other" + * formula= now supported in location, side, and weapon filters + * Weapon filters now support number, parry, accuracy, and movement_used + * New [has_attack] in standard unit filters; supercedes has_weapon= and + uses full weapon filter. * AiWML: * Simplified aspect syntax which works for all aspects, present and future: * All aspects with simple values can be specified as key=value @@ -156,6 +160,9 @@ Version 1.13.4+dev: parameter and returns true or false. * Wesnoth formula engine: * Formulas in unit filters can now access nearly all unit attributes + * Nearly All side, weapon, and terrain attributes available to Lua code + are now also exposed to WFL. The exceptions are mainly translatable + strings. * New syntax features: * String interpolation syntax. Within a formula string (enclosed in 'single quotes'), the syntax [some_formula] interpolates the result diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index d76f23ee8992..4eafc80e38c8 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -15,6 +15,7 @@ #include "formula/callable_objects.hpp" #include "units/unit.hpp" #include "units/formula_manager.hpp" +#include "utils/foreach.hpp" template variant convert_map( const std::map& input_map ) { @@ -80,22 +81,38 @@ void location_callable::serialize_to_string(std::string& str) const variant attack_type_callable::get_value(const std::string& key) const { - if(key == "id") { + if(key == "id" || key == "name") { return variant(att_.id()); + } else if(key == "description") { + return variant(att_.name()); } else if(key == "type") { return variant(att_.type()); + } else if(key == "icon") { + return variant(att_.icon()); } else if(key == "range") { return variant(att_.range()); } else if(key == "damage") { return variant(att_.damage()); - } else if(key == "number_of_attacks") { + } else if(key == "number_of_attacks" || key == "number" || key == "num_attacks" || key == "attacks") { return variant(att_.num_attacks()); - } else if(key == "special") { - std::vector > specials = att_.special_tooltips(); + } else if(key == "attack_weight") { + return variant(att_.attack_weight(), variant::DECIMAL_VARIANT); + } else if(key == "defense_weight") { + return variant(att_.defense_weight(), variant::DECIMAL_VARIANT); + } else if(key == "accuracy") { + return variant(att_.accuracy()); + } else if(key == "parry") { + return variant(att_.parry()); + } else if(key == "movement_used") { + return variant(att_.movement_used()); + } else if(key == "specials" || key == "special") { + const config specials = att_.specials(); std::vector res; - for( size_t i = 0; i != specials.size(); ++i ) { - res.push_back( variant(specials[i].first.base_str()) ); + FOREACH(const AUTO& special , specials.all_children_range()) { + if(!special.cfg["id"].empty()) { + res.push_back(variant(special.cfg["id"].str())); + } } return variant(&res); } @@ -106,12 +123,19 @@ variant attack_type_callable::get_value(const std::string& key) const void attack_type_callable::get_inputs(std::vector* inputs) const { using game_logic::FORMULA_READ_ONLY; - inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("name", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("description", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("icon", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("range", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("damage", FORMULA_READ_ONLY)); - inputs->push_back(game_logic::formula_input("number_of_attacks", FORMULA_READ_ONLY)); - inputs->push_back(game_logic::formula_input("special", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("number", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("accuracy", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("parry", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("movement_used", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("attack_weight", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("defense_weight", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("specials", FORMULA_READ_ONLY)); } int attack_type_callable::do_compare(const formula_callable* callable) const @@ -431,6 +455,24 @@ variant terrain_callable::get_value(const std::string& key) const return variant(new location_callable(loc_)); } else if(key == "id") { return variant(std::string(t_.id())); + } else if(key == "name") { + return variant(t_.name()); + } else if(key == "editor_name") { + return variant(t_.editor_name()); + } else if(key == "description") { + return variant(t_.description()); + } else if(key == "icon") { + return variant(t_.icon_image()); + } else if(key == "light") { + return variant(t_.light_bonus(0)); + } else if(key == "village") { + return variant(t_.is_village()); + } else if(key == "castle") { + return variant(t_.is_castle()); + } else if(key == "keep") { + return variant(t_.is_keep()); + } else if(key == "healing") { + return variant(t_.gives_healing()); } else return variant(); } @@ -442,6 +484,15 @@ void terrain_callable::get_inputs(std::vector* inputs inputs->push_back(game_logic::formula_input("y", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("loc", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("name", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("editor_name", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("description", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("icon", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("light", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("village", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("castle", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("keep", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("healing", FORMULA_READ_ONLY)); } int terrain_callable::do_compare(const formula_callable* callable) const diff --git a/src/formula/callable_objects.hpp b/src/formula/callable_objects.hpp index 1a8aeded583f..e1a5aef82782 100644 --- a/src/formula/callable_objects.hpp +++ b/src/formula/callable_objects.hpp @@ -188,26 +188,66 @@ class unit_type_callable : public game_logic::formula_callable { CALLABLE_WRAPPER_START(team) +CALLABLE_WRAPPER_INPUT(side) +CALLABLE_WRAPPER_INPUT(id) CALLABLE_WRAPPER_INPUT(gold) CALLABLE_WRAPPER_INPUT(start_gold) CALLABLE_WRAPPER_INPUT(base_income) +CALLABLE_WRAPPER_INPUT(total_income) CALLABLE_WRAPPER_INPUT(village_gold) CALLABLE_WRAPPER_INPUT(village_support) +CALLABLE_WRAPPER_INPUT(recall_cost) CALLABLE_WRAPPER_INPUT(name) CALLABLE_WRAPPER_INPUT(is_human) CALLABLE_WRAPPER_INPUT(is_ai) CALLABLE_WRAPPER_INPUT(is_network) +CALLABLE_WRAPPER_INPUT(fog) +CALLABLE_WRAPPER_INPUT(shroud) +CALLABLE_WRAPPER_INPUT(hidden) +CALLABLE_WRAPPER_INPUT(flag) +CALLABLE_WRAPPER_INPUT(flag_icon) +CALLABLE_WRAPPER_INPUT(team_name) +CALLABLE_WRAPPER_INPUT(color) +CALLABLE_WRAPPER_INPUT(share_vision) +CALLABLE_WRAPPER_INPUT(carryover_bonus) +CALLABLE_WRAPPER_INPUT(carryover_percentage) +CALLABLE_WRAPPER_INPUT(carryover_add) +CALLABLE_WRAPPER_INPUT(recruit) CALLABLE_WRAPPER_INPUT_END +CALLABLE_WRAPPER_FN(side) +CALLABLE_WRAPPER_FN2(id, save_id) +CALLABLE_WRAPPER_FN(save_id) CALLABLE_WRAPPER_FN(gold) - if(key == "start_gold") { \ - return variant(lexical_cast(object_.start_gold())); \ + if(key == "start_gold") { + return variant(lexical_cast(object_.start_gold())); } else CALLABLE_WRAPPER_FN(base_income) +CALLABLE_WRAPPER_FN(total_income) CALLABLE_WRAPPER_FN(village_gold) CALLABLE_WRAPPER_FN(village_support) +CALLABLE_WRAPPER_FN(recall_cost) CALLABLE_WRAPPER_FN2(is_human, is_local_human) CALLABLE_WRAPPER_FN2(is_ai, is_local_ai) CALLABLE_WRAPPER_FN(is_network) +CALLABLE_WRAPPER_FN2(fog, uses_fog) +CALLABLE_WRAPPER_FN2(shroud, uses_shroud) +CALLABLE_WRAPPER_FN(hidden) +CALLABLE_WRAPPER_FN(flag) +CALLABLE_WRAPPER_FN(flag_icon) +CALLABLE_WRAPPER_FN(team_name) +CALLABLE_WRAPPER_FN(color) +CALLABLE_WRAPPER_FN2(share_vision, share_vision().to_string) +CALLABLE_WRAPPER_FN(carryover_bonus) +CALLABLE_WRAPPER_FN(carryover_percentage) +CALLABLE_WRAPPER_FN(carryover_add) + if(key == "recruit") { + const std::set& recruits = object_.recruits(); + std::vector result; + for(std::set::const_iterator it = recruits.begin(); it != recruits.end(); ++it) { + result.push_back(variant(*it)); + } + return variant(&result); + } else CALLABLE_WRAPPER_END #endif diff --git a/src/side_filter.cpp b/src/side_filter.cpp index 4de7909cf971..1cca678cd677 100644 --- a/src/side_filter.cpp +++ b/src/side_filter.cpp @@ -31,6 +31,8 @@ #include "units/filter.hpp" #include "units/map.hpp" #include "variable.hpp" +#include "formula/callable_objects.hpp" +#include "formula/formula.hpp" #include @@ -241,6 +243,21 @@ bool side_filter::match_internal(const team &t) const } } } + + if (cfg_.has_attribute("formula")) { + try { + const team_callable callable(t); + const game_logic::formula form(cfg_["formula"]); + if(!form.evaluate(callable).as_bool()) { + return false; + } + return true; + } catch(game_logic::formula_error& e) { + lg::wml_error() << "Formula error in side filter: " << e.type << " at " << e.filename << ':' << e.line << ")\n"; + // Formulae with syntax errors match nothing + return false; + } + } return true; } diff --git a/src/terrain/filter.cpp b/src/terrain/filter.cpp index 948fa87d197a..818fe34d308f 100644 --- a/src/terrain/filter.cpp +++ b/src/terrain/filter.cpp @@ -30,6 +30,8 @@ #include "units/unit.hpp" #include "units/filter.hpp" #include "variable.hpp" +#include "formula/callable_objects.hpp" +#include "formula/formula.hpp" #include @@ -325,6 +327,24 @@ bool terrain_filter::match_internal(const map_location& loc, const bool ignore_x return false; } } + + if(cfg_.has_attribute("formula")) { + try { + const gamemap& map = fc_->get_disp_context().map(); + t_translation::t_terrain t = map.get_terrain(loc); + const terrain_type& ter = map.tdata()->get_terrain_info(t); + const terrain_callable callable(ter,loc); + const game_logic::formula form(cfg_["formula"]); + if(!form.evaluate(callable).as_bool()) { + return false; + } + return true; + } catch(game_logic::formula_error& e) { + lg::wml_error() << "Formula error in location filter: " << e.type << " at " << e.filename << ':' << e.line << ")\n"; + // Formulae with syntax errors match nothing + return false; + } + } return true; } diff --git a/src/units/attack_type.cpp b/src/units/attack_type.cpp index 06ba029b5b6a..4508bc278610 100644 --- a/src/units/attack_type.cpp +++ b/src/units/attack_type.cpp @@ -20,6 +20,8 @@ #include "global.hpp" #include "units/attack_type.hpp" +#include "formula/callable_objects.hpp" +#include "formula/formula.hpp" #include "log.hpp" #include "serialization/string_utils.hpp" @@ -96,9 +98,14 @@ static bool matches_simple_filter(const attack_type & attack, const config & fil { const std::vector& filter_range = utils::split(filter["range"]); const std::string& filter_damage = filter["damage"]; + const std::string& filter_attacks = filter["number"]; + const std::string& filter_accuracy = filter["accuracy"]; + const std::string& filter_parry = filter["parry"]; + const std::string& filter_movement = filter["movement_used"]; const std::vector filter_name = utils::split(filter["name"]); const std::vector filter_type = utils::split(filter["type"]); const std::string filter_special = filter["special"]; + const std::string filter_formula = filter["formula"]; if ( !filter_range.empty() && std::find(filter_range.begin(), filter_range.end(), attack.range()) == filter_range.end() ) return false; @@ -106,6 +113,18 @@ static bool matches_simple_filter(const attack_type & attack, const config & fil if ( !filter_damage.empty() && !in_ranges(attack.damage(), utils::parse_ranges(filter_damage)) ) return false; + if (!filter_attacks.empty() && !in_ranges(attack.num_attacks(), utils::parse_ranges(filter_attacks))) + return false; + + if (!filter_accuracy.empty() && !in_ranges(attack.accuracy(), utils::parse_ranges(filter_accuracy))) + return false; + + if (!filter_parry.empty() && !in_ranges(attack.parry(), utils::parse_ranges(filter_parry))) + return false; + + if (!filter_movement.empty() && !in_ranges(attack.movement_used(), utils::parse_ranges(filter_movement))) + return false; + if ( !filter_name.empty() && std::find(filter_name.begin(), filter_name.end(), attack.id()) == filter_name.end() ) return false; @@ -114,6 +133,21 @@ static bool matches_simple_filter(const attack_type & attack, const config & fil if ( !filter_special.empty() && !attack.get_special_bool(filter_special, true) ) return false; + + if (!filter_formula.empty()) { + try { + const attack_type_callable callable(attack); + const game_logic::formula form(filter_formula); + if(!form.evaluate(callable).as_bool()) { + return false; + } + return true; + } catch(game_logic::formula_error& e) { + lg::wml_error() << "Formula error in weapon filter: " << e.type << " at " << e.filename << ':' << e.line << ")\n"; + // Formulae with syntax errors match nothing + return false; + } + } // Passed all tests. return true; diff --git a/src/units/filter.cpp b/src/units/filter.cpp index 1f78f8bb7396..2664dacbb306 100644 --- a/src/units/filter.cpp +++ b/src/units/filter.cpp @@ -399,7 +399,21 @@ bool basic_unit_filter_impl::internal_matches_filter(const unit & u, const map_l } } - if (!vcfg["has_weapon"].blank()) { + if (vcfg.has_child("has_attack")) { + const vconfig& weap_filter = vcfg.child("has_attack"); + bool has_weapon = false; + const std::vector& attacks = u.attacks(); + for(std::vector::const_iterator i = attacks.begin(); + i != attacks.end(); ++i) { + if(i->matches_filter(weap_filter.get_parsed_config())) { + has_weapon = true; + break; + } + } + if(!has_weapon) { + return false; + } + } else if (!vcfg["has_weapon"].blank()) { std::string weapon = vcfg["has_weapon"]; bool has_weapon = false; const std::vector& attacks = u.attacks(); From 07116154812be3cebfee1055adb741b95bffcfb5 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 12:45:55 -0400 Subject: [PATCH 028/240] tlua_interpreter: Eliminate horizontal scrollbar on 800x600 --- data/gui/window/lua_interpreter.cfg | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data/gui/window/lua_interpreter.cfg b/data/gui/window/lua_interpreter.cfg index 59a225449fcf..2e716eb3b9a5 100644 --- a/data/gui/window/lua_interpreter.cfg +++ b/data/gui/window/lua_interpreter.cfg @@ -75,7 +75,7 @@ # dialog-spanning scrollbars to appear on 800x480. # - {GUI_FORCE_WIDGET_MINIMUM_SIZE 800 400 ( + {GUI_FORCE_WIDGET_MINIMUM_SIZE 760 400 ( [scroll_label] id = "msg" definition = "verbatim" From 7c5c79aa207cdb6b6e6b92c9e0456a6c465d3148 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 13:04:21 -0400 Subject: [PATCH 029/240] Update all FormulaAI scripts for renamed keys Also, note the changes in the changelog and RN --- RELEASE_NOTES | 2 ++ changelog | 7 +++++++ data/ai/formula/new_recruitment.fai | 8 ++++---- data/ai/formula/opening.fai | 4 ++-- data/ai/formula/patrol.fai | 4 ++-- data/ai/formula/poisoner_attack.fai | 2 +- data/ai/formula/poisoner_eval.fai | 2 +- data/ai/formula/recruitment.fai | 10 +++++----- data/ai/formula/scouting_eval.fai | 4 ++-- data/campaigns/Legend_of_Wesmere/ai/patrol.fai | 4 ++-- 10 files changed, 28 insertions(+), 19 deletions(-) diff --git a/RELEASE_NOTES b/RELEASE_NOTES index 0f90d026e577..bdd706456a5e 100644 --- a/RELEASE_NOTES +++ b/RELEASE_NOTES @@ -40,6 +40,8 @@ The Wesnoth formula language used by $(...) substitution, the formula= key in st [*]Improved formula debugger [/list] The "fai" and "faiend" keywords are deprecated in favour of "wfl" and "wflend" respectively. This is part of a move to more clearly distinguish [wiki]Wesnoth Formula Language[/wiki], the language itself, from [wiki]FormulaAI[/wiki], which is just one use of the language in Wesnoth. + +The attributes leader, total_movement, movement_left, and states in WFL unit variables were renamed to canrecruit, max_moves, moves, and status respectively; this was done to make them match the Lua and WML names for the same things. Also, the special attribute in WFL weapon variables is now specials. The old names will continue to work for now, but they may be removed in a future version. [/rasection] [rasection="Changes to the AI"] diff --git a/changelog b/changelog index 9c5229a8c25b..cc2921d5a2cd 100644 --- a/changelog +++ b/changelog @@ -160,9 +160,16 @@ Version 1.13.4+dev: parameter and returns true or false. * Wesnoth formula engine: * Formulas in unit filters can now access nearly all unit attributes + The following attributes were renamed (old names still work, for now): + leader -> canrecruit + total_movement -> max_moves + movement_left -> moves + states -> status * Nearly All side, weapon, and terrain attributes available to Lua code are now also exposed to WFL. The exceptions are mainly translatable strings. + * The 'special' attribute of weapons was renamed to 'specials', and it now + contains the special IDs rather than their translateable names. * New syntax features: * String interpolation syntax. Within a formula string (enclosed in 'single quotes'), the syntax [some_formula] interpolates the result diff --git a/data/ai/formula/new_recruitment.fai b/data/ai/formula/new_recruitment.fai index a7125a98edd3..6083c7c5eb96 100644 --- a/data/ai/formula/new_recruitment.fai +++ b/data/ai/formula/new_recruitment.fai @@ -35,7 +35,7 @@ def get_important_locations(ai* ) def enemy_leaders( ai* ) sum( map( enemies, 'enemy', - filter( units_of_side[enemy], leader ) + filter( units_of_side[enemy], canrecruit ) ) ); @@ -123,7 +123,7 @@ def locally_normalize_to_lowest( input_map ) # Returns a List of all enemy leaders # # (for some reason this function is defined twice) # def enemy_leaders(ai*) - map( enemies, 'enemy_side', find(units_of_side[enemy_side], leader ) ); + map( enemies, 'enemy_side', find(units_of_side[enemy_side], canrecruit ) ); # UNUSED FUNCTION # # Returns a Map. # @@ -249,7 +249,7 @@ def movement_eval(ai*, recruits_id_map) my_recruits_movement_cost( ai ), tomap( recruits_id_map, map( my_recruits, - total_movement + max_moves ) ) ), @@ -357,7 +357,7 @@ if( vars.side_terrain, mark_important_locations( self, calculate_map_ownership( recruits_of_side, - map(filter(sum(units_of_side), leader), loc), + map(filter(sum(units_of_side), canrecruit), loc), 4, 7, 4 ) ) diff --git a/data/ai/formula/opening.fai b/data/ai/formula/opening.fai index caaa587d0211..036ada0c32ed 100644 --- a/data/ai/formula/opening.fai +++ b/data/ai/formula/opening.fai @@ -8,7 +8,7 @@ def opening(ai*) move(loc(11,23), loc(14,22)) ], if(turn = 2, [ move(loc(11,21),loc(13,17)), - if(unit_at(loc(11,22)).total_movement = 6, + if(unit_at(loc(11,22)).max_moves = 6, move(loc(11,22),loc(13,18)), move(loc(11,22),loc(15,19))), move(loc(10,22),loc(7,19)), @@ -75,7 +75,7 @@ def rate_village_capture(ai*,src,dst) village_value(ai); def rate_village_proximity(ai*, unit, dst) if(distance = 1, 0, - village_value(ai)/(distance/unit.total_movement + 1)) + village_value(ai)/(distance/unit.max_moves + 1)) where distance = distance_to_nearest_unowned_village(dst); def rate_move(ai*,src,dst) diff --git a/data/ai/formula/patrol.fai b/data/ai/formula/patrol.fai index 4acfaee4d180..df76577ca1cb 100644 --- a/data/ai/formula/patrol.fai +++ b/data/ai/formula/patrol.fai @@ -25,7 +25,7 @@ where desired_path = shortest_path( me.loc, me.vars.next_step ); def move_ahead(ai*, me) if( enemy_units, - if( distance_between( closest_unit(ai, me).loc, me.loc ) > me.movement_left-1, + if( distance_between( closest_unit(ai, me).loc, me.loc ) > me.moves-1, move_partial( me.loc, me.vars.next_step @@ -50,7 +50,7 @@ def patrol_move(ai*, me) move_ahead(ai,me) ); -if( me.movement_left = 0, +if( me.moves = 0, end, if(attack, attack, diff --git a/data/ai/formula/poisoner_attack.fai b/data/ai/formula/poisoner_attack.fai index 6fb6d1dfb1db..bec1dc0913ab 100644 --- a/data/ai/formula/poisoner_attack.fai +++ b/data/ai/formula/poisoner_attack.fai @@ -8,6 +8,6 @@ def get_best_defense_loc(moves, attacker, enemy) attack(me.loc, get_best_defense_loc(my_moves.moves, me, target), target.loc, att_weap) - where att_weap = index_of(['poison'],map(me.attacks,special)) + where att_weap = index_of(['poison'],map(me.attacks,specials)) faiend diff --git a/data/ai/formula/poisoner_eval.fai b/data/ai/formula/poisoner_eval.fai index 955e928c7bdb..6987fb34a4e9 100644 --- a/data/ai/formula/poisoner_eval.fai +++ b/data/ai/formula/poisoner_eval.fai @@ -16,7 +16,7 @@ min( map( ) ) + #leader is always a good target! # -if( target.leader, 50, 0 ) + +if( target.canrecruit, 50, 0 ) + # consider target abilities if needed # if( target.abilities, if( index_of('regenerates', target.abilities) != -1, -10, 0 ) + diff --git a/data/ai/formula/recruitment.fai b/data/ai/formula/recruitment.fai index 375172526eb3..e1c8fcad3ce9 100644 --- a/data/ai/formula/recruitment.fai +++ b/data/ai/formula/recruitment.fai @@ -32,7 +32,7 @@ def get_important_locations(ai* ) def enemy_leaders( ai* ) sum( map( enemies, 'enemy', - filter( units_of_side[enemy], leader ) + filter( units_of_side[enemy], canrecruit ) ) ); @@ -112,7 +112,7 @@ def locally_normalize_to_lowest( input_map ) # look for who we fight against # def enemy_leaders(ai*) - map( enemies, 'enemy_side', find(units_of_side[enemy_side], leader ) ); + map( enemies, 'enemy_side', find(units_of_side[enemy_side], canrecruit ) ); def distance_to_enemies(ai*) @@ -206,7 +206,7 @@ def combine_maps_div( map_A, map_B ) [ locally_normalize_to_highest(my_recruits_defense(self)), tomap(map(my_recruits, id),map(my_recruits, hitpoints) ), locally_normalize_to_lowest(my_recruits_movement_cost(self)), -tomap(map(my_recruits, id),map(my_recruits, total_movement))] +tomap(map(my_recruits, id),map(my_recruits, max_moves))] # def consider_unit_cost(ai*) @@ -233,7 +233,7 @@ def movement_eval(ai*, recruits_id_map) my_recruits_movement_cost( ai ), tomap( recruits_id_map, map( my_recruits, - total_movement + max_moves ) ) ), @@ -324,7 +324,7 @@ if( vars.side_terrain, mark_important_locations( self, calculate_map_ownership( recruits_of_side, - map(filter(sum(units_of_side), leader), loc), + map(filter(sum(units_of_side), canrecruit), loc), 4, 7, 4 ) ) diff --git a/data/ai/formula/scouting_eval.fai b/data/ai/formula/scouting_eval.fai index 034527d416af..1a15b3d78d20 100644 --- a/data/ai/formula/scouting_eval.fai +++ b/data/ai/formula/scouting_eval.fai @@ -6,10 +6,10 @@ if( size(shroud) = 0, -5, if( size(enemies_in_range) != 0, -5, -if( me.total_movement > 5, +if( me.max_moves > 5, 50, -5)))) -where enemies_in_range = filter( enemy_units, 'enemy', distance_between( me.loc, enemy.loc ) < me.total_movement), +where enemies_in_range = filter( enemy_units, 'enemy', distance_between( me.loc, enemy.loc ) < me.max_moves), shroud = find_shroud() faiend diff --git a/data/campaigns/Legend_of_Wesmere/ai/patrol.fai b/data/campaigns/Legend_of_Wesmere/ai/patrol.fai index 4acfaee4d180..df76577ca1cb 100644 --- a/data/campaigns/Legend_of_Wesmere/ai/patrol.fai +++ b/data/campaigns/Legend_of_Wesmere/ai/patrol.fai @@ -25,7 +25,7 @@ where desired_path = shortest_path( me.loc, me.vars.next_step ); def move_ahead(ai*, me) if( enemy_units, - if( distance_between( closest_unit(ai, me).loc, me.loc ) > me.movement_left-1, + if( distance_between( closest_unit(ai, me).loc, me.loc ) > me.moves-1, move_partial( me.loc, me.vars.next_step @@ -50,7 +50,7 @@ def patrol_move(ai*, me) move_ahead(ai,me) ); -if( me.movement_left = 0, +if( me.moves = 0, end, if(attack, attack, From 41095c11e6a49745849ec6481a1b634547bc5949 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 18:36:54 -0400 Subject: [PATCH 030/240] MSVC fixups --- projectfiles/VC9/wesnoth.vcproj | 24 ++++++++++++------------ src/ai/lua/lua_object.cpp | 3 +++ 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/projectfiles/VC9/wesnoth.vcproj b/projectfiles/VC9/wesnoth.vcproj index b99d2c3dbb7a..fbc3155ed62e 100644 --- a/projectfiles/VC9/wesnoth.vcproj +++ b/projectfiles/VC9/wesnoth.vcproj @@ -14824,7 +14824,7 @@ > @@ -14884,7 +14884,7 @@ > diff --git a/src/ai/lua/lua_object.cpp b/src/ai/lua/lua_object.cpp index 64dc52b43358..f2014b2d9a29 100644 --- a/src/ai/lua/lua_object.cpp +++ b/src/ai/lua/lua_object.cpp @@ -35,6 +35,9 @@ namespace ai { // empty } + // MSVC fails to compile without this line + template class lua_object; + template <> boost::shared_ptr lua_object::to_type(lua_State *L, int n) { From d535ec4fa9eb052304cd7bf68cceb18f063046b3 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 18:47:11 -0400 Subject: [PATCH 031/240] tloadscreen: Stub for progress/stage indicator --- src/game_config_manager.cpp | 3 +++ src/game_launcher.cpp | 1 + src/game_state.cpp | 2 ++ src/gui/dialogs/loadscreen.cpp | 15 +++++++++++++++ src/gui/dialogs/loadscreen.hpp | 10 ++++++++++ src/play_controller.cpp | 8 ++++++++ src/terrain/builder.cpp | 7 +++++++ src/units/types.cpp | 7 +++++++ src/wesnoth.cpp | 8 +++++++- 9 files changed, 60 insertions(+), 1 deletion(-) diff --git a/src/game_config_manager.cpp b/src/game_config_manager.cpp index a028c7b9b44c..0629f6ad3a62 100644 --- a/src/game_config_manager.cpp +++ b/src/game_config_manager.cpp @@ -150,7 +150,9 @@ void game_config_manager::load_game_config(FORCE_RELOAD_CONFIG force_reload, // Load the selected core. // Handle terrains so that they are last loaded from the core. // Load every compatible addon. + gui2::tloadscreen::progress("verify cache"); filesystem::data_tree_checksum(); + gui2::tloadscreen::progress("create cache"); // Start transaction so macros are shared. game_config::config_cache_transaction main_transaction; @@ -470,6 +472,7 @@ void game_config_manager::set_color_info() void game_config_manager::set_unit_data() { game_config_.merge_children("units"); + gui2::tloadscreen::progress("load unit types"); if(config &units = game_config_.child("units")) { unit_types.set_config(units); } diff --git a/src/game_launcher.cpp b/src/game_launcher.cpp index b09c50194cc1..68d06549343d 100644 --- a/src/game_launcher.cpp +++ b/src/game_launcher.cpp @@ -1012,6 +1012,7 @@ void game_launcher::launch_game(RELOAD_GAME_DATA reload) } gui2::tloadscreen::display(video()); + gui2::tloadscreen::progress("load data"); if(reload == RELOAD_DATA) { try { diff --git a/src/game_state.cpp b/src/game_state.cpp index e554b1d1e65a..4e8e1205e498 100644 --- a/src/game_state.cpp +++ b/src/game_state.cpp @@ -30,6 +30,7 @@ #include "teambuilder.hpp" #include "units/unit.hpp" #include "whiteboard/manager.hpp" +#include "gui/dialogs/loadscreen.hpp" #include #include @@ -165,6 +166,7 @@ void game_state::place_sides_in_preferred_locations(const config& level) void game_state::init(const config& level, play_controller & pc) { events_manager_->read_scenario(level); + gui2::tloadscreen::progress("init teams"); if (level["modify_placing"].to_bool()) { LOG_NG << "modifying placing..." << std::endl; place_sides_in_preferred_locations(level); diff --git a/src/gui/dialogs/loadscreen.cpp b/src/gui/dialogs/loadscreen.cpp index ab0555412b9d..8825aa1ff33b 100644 --- a/src/gui/dialogs/loadscreen.cpp +++ b/src/gui/dialogs/loadscreen.cpp @@ -64,4 +64,19 @@ void tloadscreen::post_show(twindow& /*window*/) cursor::setter cur(cursor::NORMAL); } +void tloadscreen::progress(const char* stage) +{ + if(!current_load) { + return; + } + // Currently this is a no-op stub + if(stage) { + // TODO: Update displayed stage + current_load->current_stage = stage; + } + // TODO: Indicate progress somehow +} + +tloadscreen* tloadscreen::current_load = NULL; + } // namespace gui2 diff --git a/src/gui/dialogs/loadscreen.hpp b/src/gui/dialogs/loadscreen.hpp index 70982c8905d3..ed55b7a70c58 100644 --- a/src/gui/dialogs/loadscreen.hpp +++ b/src/gui/dialogs/loadscreen.hpp @@ -27,12 +27,16 @@ class tloadscreen : public tdialog public: tloadscreen() : window_(NULL) + , previous_load(current_load) + , current_stage(NULL) { + current_load = this; } ~tloadscreen() { close(); + current_load = previous_load; } static void display(CVideo& video) { @@ -40,6 +44,8 @@ class tloadscreen : public tdialog } void show(CVideo& video); + + static void progress(const char* stage_name = NULL); /** * Hides the window. @@ -61,6 +67,10 @@ class tloadscreen : public tdialog /** Inherited from tdialog. */ void post_show(twindow& window); + + static tloadscreen* current_load; + tloadscreen*const previous_load; + const char* current_stage; }; } // namespace gui2 diff --git a/src/play_controller.cpp b/src/play_controller.cpp index ff15ca62026a..ad744920ff28 100644 --- a/src/play_controller.cpp +++ b/src/play_controller.cpp @@ -225,6 +225,7 @@ struct throw_end_level void play_controller::init(CVideo& video, const config& level) { gui2::tloadscreen::display(video); + gui2::tloadscreen::progress("load level"); LOG_NG << "initializing game_state..." << (SDL_GetTicks() - ticks()) << std::endl; gamestate_.reset(new game_state(level, *this, tdata_)); @@ -246,12 +247,15 @@ void play_controller::init(CVideo& video, const config& level) resources::whiteboard = whiteboard_manager_; LOG_NG << "loading units..." << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("load units"); preferences::encounter_all_content(gamestate().board_); LOG_NG << "initializing theme... " << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("init theme"); const config& theme_cfg = controller_base::get_theme(game_config_, level["theme"]); LOG_NG << "building terrain rules... " << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("build terrain"); gui_.reset(new game_display(gamestate().board_, video, whiteboard_manager_, *gamestate().reports_, gamestate().tod_manager_, theme_cfg, level)); if (!gui_->video().faked()) { if (saved_game_.mp_settings().mp_countdown) @@ -260,6 +264,7 @@ void play_controller::init(CVideo& video, const config& level) gui_->get_theme().modify_label("time-icon", _ ("current local time")); } + gui2::tloadscreen::progress("init display"); mouse_handler_.set_gui(gui_.get()); menu_handler_.set_gui(gui_.get()); resources::screen = gui_.get(); @@ -267,10 +272,12 @@ void play_controller::init(CVideo& video, const config& level) LOG_NG << "done initializing display... " << (SDL_GetTicks() - ticks()) << std::endl; LOG_NG << "building gamestate to gui and whiteboard... " << (SDL_GetTicks() - ticks()) << std::endl; + gui2::tloadscreen::progress("init whiteboard"); // This *needs* to be created before the show_intro and show_map_scene // as that functions use the manager state_of_game // Has to be done before registering any events! gamestate().bind(whiteboard_manager_.get(), gui_.get()); + gui2::tloadscreen::progress("init lua"); resources::lua_kernel = gamestate().lua_kernel_.get(); if(gamestate().first_human_team_ != -1) { @@ -291,6 +298,7 @@ void play_controller::init(CVideo& video, const config& level) } init_managers(); + gui2::tloadscreen::progress("start game"); //loadscreen_manager->reset(); gamestate().gamedata_.set_phase(game_data::PRELOAD); gamestate().lua_kernel_->initialize(level); diff --git a/src/terrain/builder.cpp b/src/terrain/builder.cpp index 7376a8f64835..f779e3600890 100644 --- a/src/terrain/builder.cpp +++ b/src/terrain/builder.cpp @@ -24,6 +24,7 @@ #include "log.hpp" #include "map/map.hpp" #include "serialization/string_utils.hpp" +#include "gui/dialogs/loadscreen.hpp" #include @@ -866,6 +867,7 @@ void terrain_builder::add_rotated_rules(building_ruleset &rules, building_rule & void terrain_builder::parse_config(const config &cfg, bool local) { log_scope("terrain_builder::parse_config"); + int n = 0; // Parses the list of building rules (BRs) BOOST_FOREACH(const config &br, cfg.child_range("terrain_graphics")) @@ -946,6 +948,11 @@ void terrain_builder::parse_config(const config &cfg, bool local) pbr.precedence = br["precedence"]; add_rotated_rules(building_rules_, pbr, rotations); + + n++; + if(n % 10 == 0) { + gui2::tloadscreen::progress(); + } } // Debug output for the terrain rules diff --git a/src/units/types.cpp b/src/units/types.cpp index 61f4765787a6..7f5bf407e649 100644 --- a/src/units/types.cpp +++ b/src/units/types.cpp @@ -32,6 +32,7 @@ #include "util.hpp" #include "gui/auxiliary/formula.hpp" +#include "gui/dialogs/loadscreen.hpp" #include #include @@ -1011,12 +1012,14 @@ void unit_type_data::set_config(config &cfg) BOOST_FOREACH(const config &mt, cfg.child_range("movetype")) { movement_types_.insert(std::make_pair(mt["name"].str(), movetype(mt))); + gui2::tloadscreen::progress(); } BOOST_FOREACH(const config &r, cfg.child_range("race")) { const unit_race race(r); races_.insert(std::pair(race.id(),race)); + gui2::tloadscreen::progress(); } // Movetype resistance patching @@ -1098,6 +1101,7 @@ void unit_type_data::set_config(config &cfg) if ( !id.empty() ) { std::vector base_tree(1, id); apply_base_unit(ut, cfg, base_tree); + gui2::tloadscreen::progress(); } } } @@ -1131,6 +1135,8 @@ void unit_type_data::set_config(config &cfg) } else { ERR_CF << "Multiple [unit_type]s with id=" << id << " encountered." << std::endl; } + + gui2::tloadscreen::progress(); } // Build all unit types. (This was not done within the loop for performance.) @@ -1196,6 +1202,7 @@ void unit_type_data::build_all(unit_type::BUILD_STATUS status) for (unit_type_map::iterator u = types_.begin(), u_end = types_.end(); u != u_end; ++u) { build_unit_type(u->second, status); + gui2::tloadscreen::progress(); } // Handle [advancefrom] (once) after building to (at least) the CREATED level. // (Currently, this could be simply a test for build_status_ == NOT_BUILT, diff --git a/src/wesnoth.cpp b/src/wesnoth.cpp index e432a5e303c8..8115d255cdfa 100644 --- a/src/wesnoth.cpp +++ b/src/wesnoth.cpp @@ -630,12 +630,13 @@ static int do_gameloop(const std::vector& args) check_fpu(); const cursor::manager cursor_manager; - //cursor::set(cursor::WAIT); + cursor::set(cursor::WAIT); #if (defined(_X11) && !defined(__APPLE__)) || defined(_WIN32) SDL_EventState(SDL_SYSWMEVENT, SDL_ENABLE); #endif + gui2::tloadscreen::progress("init gui"); // Does nothing since there's no loadscreen yet gui2::init(); const gui2::event::tmanager gui_event_manager; @@ -644,11 +645,13 @@ static int do_gameloop(const std::vector& args) game_config_manager config_manager(cmdline_opts, game->video(), game->jump_to_editor()); + gui2::tloadscreen::progress("load config"); res = config_manager.init_game_config(game_config_manager::NO_FORCE_RELOAD); if(res == false) { std::cerr << "could not initialize game config\n"; return 1; } + gui2::tloadscreen::progress("init fonts"); res = font::load_font_config(); if(res == false) { @@ -656,10 +659,13 @@ static int do_gameloop(const std::vector& args) return 1; } + gui2::tloadscreen::progress("refresh addons"); refresh_addon_version_info_cache(); config tips_of_day; + gui2::tloadscreen::progress("titlescreen"); + LOG_CONFIG << "time elapsed: "<< (SDL_GetTicks() - start_ticks) << " ms\n"; plugins_manager plugins_man(new application_lua_kernel(&game->video())); From 85a498ba159a7cf586369d8a64ce07755d87d8e9 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 23:35:58 -0400 Subject: [PATCH 032/240] Fast MAI: Correctly honour the attacks aspect if set --- .../ai/micro_ais/cas/ca_fast_attack_utils.lua | 143 ++++++++++++++++++ data/ai/micro_ais/cas/ca_fast_combat.lua | 46 +++--- .../micro_ais/cas/ca_fast_combat_leader.lua | 36 ++--- 3 files changed, 179 insertions(+), 46 deletions(-) diff --git a/data/ai/micro_ais/cas/ca_fast_attack_utils.lua b/data/ai/micro_ais/cas/ca_fast_attack_utils.lua index c4a05f390c4b..a87b102b79fc 100644 --- a/data/ai/micro_ais/cas/ca_fast_attack_utils.lua +++ b/data/ai/micro_ais/cas/ca_fast_attack_utils.lua @@ -1,6 +1,7 @@ local H = wesnoth.require "lua/helper.lua" local AH = wesnoth.require "ai/lua/ai_helper.lua" local LS = wesnoth.require "lua/location_set.lua" +local T = H.set_wml_tag_metatable{} -- Functions to perform fast evaluation of attacks and attack combinations. -- The emphasis with all of this is on speed, not elegance. @@ -29,6 +30,148 @@ function ca_fast_attack_utils.get_avoid_map(cfg) return LS.of_pairs(wesnoth.get_locations(avoid_tag)) end +local function attack_filter(which, filter, is_leader) + if (which == 'leader') then + which = 'own' + is_leader = true + end + if (which == 'own') then + return { + side = wesnoth.current.side, + canrecruit = is_leader, + { "and", filter or {} } + } + elseif (which == 'enemy') then + return { + T.filter_side { T.enemy_of { side = wesnoth.current.side } }, + { "not", filter or {} } + } + else + return filter + end +end + +ca_fast_attack_utils.build_attack_filter = attack_filter + +local function get_attack_filter_from_aspect(aspect, which, data, is_leader) + if (aspect.name == "composite_aspect") then + --print("Found composite aspect") + for facet in H.child_range(aspect, 'facet') do + local active = true + if facet.turns then + active = false + local turns = AH.split(facet.turns) + local current_turn = tostring(wesnoth.current.turn) + --print("Found facet with turns requirement (current turn is '" .. current_turn .. "')") + for i,v in ipairs(turns) do + if current_turn == v then + --print(" Matched with '" .. v .. "'") + active = true + break + end + end + end + if facet.time_of_day then + active = false + local times = AH.split(facet.time_of_day) + local current_time = wesnoth.get_time_of_day().id + --print("Found facet with time requirement (current time is '" .. current_time .. "')") + for i,v in ipairs(times) do + if current_time == v then + --print(" Matched with '" .. v .. "'") + active = true + break + end + end + end + if active then + return get_attack_filter_from_aspect(facet, which, data, is_leader) + end + end + elseif (aspect.name == "lua_aspect") then + --print("Found lua aspect") + local filter = loadstring(aspect.code)(nil, H.get_child(aspect, 'args'), data) + if (type(filter[which]) == 'function') then + temporary_attacks_filter_fcn = filter[which] + local units = wesnoth.get_units(attack_filter(which, { + lua_function = 'temporary_attacks_filter_fcn' + }, is_leader)) + temporary_attacks_filter_fcn = nil + return units + else + return wesnoth.get_units(attack_filter(which, filter[which], is_leader)) + end + else -- Standard attacks aspect (though not name=standard_aspect) + --print("Found standard aspect") + return wesnoth.get_units(attack_filter(which, + H.get_child(aspect, 'filter_' .. which), is_leader)) + end + return wesnoth.get_units(attack_filter(which, {}, is_leader)) +end + +function ca_fast_attack_utils.get_attackers(data, which) + local ai_tag = H.get_child(wesnoth.sides[wesnoth.current.side].__cfg, 'ai') + for aspect in H.child_range(ai_tag, 'aspect') do + if (aspect.id == 'attacks') then + if (which == 'leader') then + return get_attack_filter_from_aspect(aspect, 'own', data, true) + else + return get_attack_filter_from_aspect(aspect, which, data) + end + end + end + return {} +end + +--[[ +This is a benchmarking function to compare the old, incorrect method of +fetching the attacks aspect to the new method and the standard method. +It's meant to be called from the Lua console. + +Example usage: +$ my_ai = wesnoth.debug_ai(1).ai +$ FAU = wesnoth.dofile "ai/micro_ais/cas/ca_fast_attack_utils.lua" +$ FAU.test_attacks(my_ai, 2000) +]] +function ca_fast_attack_utils.test_attacks(my_ai, times) + local t1, t2 = os.clock() + for i = 1,times do + my_ai.get_attacks() + end + t2 = os.clock() + print("get_attacks() executed in average time " .. (os.difftime(t2,t1) / times)) + t1 = os.clock() + for i = 1,times do + local ai_tag = H.get_child(wesnoth.sides[wesnoth.current.side].__cfg, 'ai') + for aspect in H.child_range(ai_tag, 'aspect') do + if (aspect.id == 'attacks') then + local facet = H.get_child(aspect, 'facet') + if facet then + wesnoth.get_units{ + side = wesnoth.current.side, + canrecruit = false, + { "and", H.get_child(facet, 'filter_own') } + } + wesnoth.get_units{ + side = wesnoth.current.side, + canrecruit = false, + { "and", H.get_child(facet, 'filter_enemy') } + } + end + end + end + end + t2 = os.clock() + print("original sloppy method executed in time " .. (os.difftime(t2,t1) / times)) + t1 = os.clock() + for i = 1,times do + ca_fast_attack_utils.get_attackers(nil, "own", false) + ca_fast_attack_utils.get_attackers(nil, "enemy", false) + end + t2 = os.clock() + print("new method executed in time " .. (os.difftime(t2,t1) / times)) +end + function ca_fast_attack_utils.gamedata_setup() -- Keep game data in a table for faster access. -- This is currently re-done on every move. Could be optimized by only diff --git a/data/ai/micro_ais/cas/ca_fast_combat.lua b/data/ai/micro_ais/cas/ca_fast_combat.lua index d34cf8670a77..24053388bb29 100644 --- a/data/ai/micro_ais/cas/ca_fast_combat.lua +++ b/data/ai/micro_ais/cas/ca_fast_combat.lua @@ -11,28 +11,31 @@ function ca_fast_combat:evaluation(cfg, data) local filter_own = H.get_child(cfg, "filter") local filter_enemy = H.get_child(cfg, "filter_second") + local excluded_enemies + local units_sorted = true if (not filter_own) and (not filter_enemy) then - local ai_tag = H.get_child(wesnoth.sides[wesnoth.current.side].__cfg, 'ai') - for aspect in H.child_range(ai_tag, 'aspect') do - if (aspect.id == 'attacks') then - local facet = H.get_child(aspect, 'facet') - if facet then - filter_own = H.get_child(facet, 'filter_own') - filter_enemy = H.get_child(facet, 'filter_enemy') - end - end + if (not data.fast_combat_units) or (not data.fast_combat_units[1]) then + data.fast_combat_units = FAU.get_attackers(data, "own") + if (not data.fast_combat_units[1]) then return 0 end + units_sorted = false + end + excluded_enemies = FAU.get_attackers(data, "enemy") + else + if (not data.fast_combat_units) or (not data.fast_combat_units[1]) then + data.fast_combat_units = wesnoth.get_units( + FAU.build_attack_filter("own", filter_own) + ) + if (not data.fast_combat_units[1]) then return 0 end + units_sorted = false end + if filter_enemy then + excluded_enemies = wesnoth.get_units( + FAU.build_attack_filter("enemy", filter_enemy) + ) + end end - if (not data.fast_combat_units) or (not data.fast_combat_units[1]) then - data.fast_combat_units = wesnoth.get_units { - side = wesnoth.current.side, - canrecruit = 'no', - { "and", filter_own } - } - - if (not data.fast_combat_units[1]) then return 0 end - + if not units_sorted then -- For speed reasons, we'll go through the arrays from the end, so they are sorted backwards if cfg.weak_units_first then table.sort(data.fast_combat_units, function(a,b) return a.hitpoints > b.hitpoints end) @@ -44,12 +47,7 @@ function ca_fast_combat:evaluation(cfg, data) local excluded_enemies_map = LS.create() -- Exclude enemies not matching [filter_enemy] - if filter_enemy then - local excluded_enemies = wesnoth.get_units { - { "filter_side", { { "enemy_of", { side = wesnoth.current.side } } } }, - { "not", filter_enemy } - } - + if excluded_enemies then for _,e in ipairs(excluded_enemies) do excluded_enemies_map:insert(e.x, e.y) end diff --git a/data/ai/micro_ais/cas/ca_fast_combat_leader.lua b/data/ai/micro_ais/cas/ca_fast_combat_leader.lua index 6bab7bf3c582..2a32e2924c57 100644 --- a/data/ai/micro_ais/cas/ca_fast_combat_leader.lua +++ b/data/ai/micro_ais/cas/ca_fast_combat_leader.lua @@ -20,37 +20,29 @@ function ca_fast_combat_leader:evaluation(cfg, data) local filter_own = H.get_child(cfg, "filter") local filter_enemy = H.get_child(cfg, "filter_second") + local excluded_enemies, leader if (not filter_own) and (not filter_enemy) then - local ai_tag = H.get_child(wesnoth.sides[wesnoth.current.side].__cfg, 'ai') - for aspect in H.child_range(ai_tag, 'aspect') do - if (aspect.id == 'attacks') then - local facet = H.get_child(aspect, 'facet') - if facet then - filter_own = H.get_child(facet, 'filter_own') - filter_enemy = H.get_child(facet, 'filter_enemy') - end - end + leader = FAU.get_attackers(data, "leader")[1] + if (not leader) then return 0 end + excluded_enemies = FAU.get_attackers(data, "enemy") + else + leader = wesnoth.get_units( + FAU.build_attack_filter("leader", filter_own) + )[1] + if (not leader) then return 0 end + if filter_enemy then + excluded_enemies = wesnoth.get_units( + FAU.build_attack_filter("enemy", filter_enemy) + ) end end - local leader = wesnoth.get_units { - side = wesnoth.current.side, - canrecruit = 'yes', - { "and", filter_own } - }[1] - - if (not leader) then return 0 end if (leader.attacks_left == 0) or (not H.get_child(leader.__cfg, 'attack')) then return 0 end local excluded_enemies_map = LS.create() -- Exclude enemies not matching [filter_enemy] - if filter_enemy then - local excluded_enemies = wesnoth.get_units { - { "filter_side", { { "enemy_of", { side = wesnoth.current.side } } } }, - { "not", filter_enemy } - } - + if excluded_enemies then for _,e in ipairs(excluded_enemies) do excluded_enemies_map:insert(e.x, e.y) end From 74ce7454d98210894a9f83950f3fe608cfd8125c Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Tue, 29 Mar 2016 23:36:39 -0400 Subject: [PATCH 033/240] Random Recruit MAI test: Add second [probability] tag --- data/ai/micro_ais/scenarios/recruiting.cfg | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/data/ai/micro_ais/scenarios/recruiting.cfg b/data/ai/micro_ais/scenarios/recruiting.cfg index 281cf5e970df..c4da46dee754 100644 --- a/data/ai/micro_ais/scenarios/recruiting.cfg +++ b/data/ai/micro_ais/scenarios/recruiting.cfg @@ -64,6 +64,10 @@ type=Swordsman,Peasant probability=8 [/probability] + [probability] + type=Mage + probability=4 + [/probability] skip_low_gold_recruiting=yes [/micro_ai] @@ -83,7 +87,7 @@ {MESSAGE Langzhar "" "" _"Just watch the recruiting of both sides and see if it is what you would expect. The recruitment lists cover level 0 to level 2 units, in order to make differences more obvious."} # wmllint: unbalanced-on - {MESSAGE narrator "wesnoth-icon.png" "Notes" _"If you have not changed anything in the scenario code, Side 1 uses the Random Recruitment Micro AI, with swordsmen and peasants having been given higher probability than the other units. This is not meant as a good recruitment pattern, it simply serves as a demonstration how to use the AI. + {MESSAGE narrator "wesnoth-icon.png" "Notes" _"If you have not changed anything in the scenario code, Side 1 uses the Random Recruitment Micro AI, with swordsmen and peasants having been given higher probability than the other units, and mages a middling probability. This is not meant as a good recruitment pattern, it simply serves as a demonstration how to use the AI. Side 2 uses the Rush Recruitment Micro AI (which is also used in the Experimental AI). From d7c58276c2cba60c1b15d7be7c2ffae8f2aae7a2 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 00:01:01 -0400 Subject: [PATCH 034/240] Travis: Make all builds C++11 --- .travis.yml | 12 +++++------- 1 file changed, 5 insertions(+), 7 deletions(-) diff --git a/.travis.yml b/.travis.yml index e87cbc91ce25..be7f65cc84e4 100644 --- a/.travis.yml +++ b/.travis.yml @@ -11,7 +11,6 @@ compiler: env: - BUILD="-O0" - BUILD="-O2" - - BUILD="C++11 -O0" - BUILD="translations" matrix: @@ -32,17 +31,16 @@ before_install: - export EXTRA_FLAGS_RELEASE="-O0" - export WML_TEST_TIME=20 - export NLS=false - - export CXX11=false + - export CXX11=true - if [ "$BUILD" == "-O2" ]; then export STRICT_COMPILATION=false; fi - if [ "$BUILD" == "-O2" ]; then export EXTRA_FLAGS_RELEASE=""; fi - if [ "$BUILD" == "-O2" ]; then export WML_TEST_TIME=15; fi - - if [ "$BUILD" == "C++11 -O0" ]; then export CXX11=true; fi - - if [ "$BUILD" == "C++11 -O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations"; fi - - if [[ "$BUILD" == "C++11 -O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations -Wno-deprecated-register"; fi - - if [ "$BUILD" == "C++11 -O0" ]; then export PLAY_TEST=false; fi - - if [ "$BUILD" == "C++11 -O0" ]; then export MP_TEST=false; fi + - if [ "$BUILD" == "-O0" ]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations"; fi + - if [[ "$BUILD" == "-O0" ]] && [[ "$CXX" == "clang++" ]]; then export EXTRA_FLAGS_RELEASE="-O0 -Wno-literal-suffix -Wno-deprecated-declarations -Wno-deprecated-register"; fi + - if [ "$BUILD" == "-O0" ]; then export PLAY_TEST=false; fi + - if [ "$BUILD" == "-O0" ]; then export MP_TEST=false; fi - if [ "$BUILD" == "translations" ]; then export NLS=true; fi - if [ "$BUILD" == "translations" ]; then export TARGETS="translations"; fi From 64892b8c81c3da7af87c820508c6cef9cf98adf5 Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 02:15:21 -0400 Subject: [PATCH 035/240] Align formula and Lua views of unit types - New key in both - race --- changelog | 10 +++++++--- src/formula/callable_objects.cpp | 21 ++++++++++++++++++--- src/scripting/game_lua_kernel.cpp | 9 +++++---- src/scripting/lua_unit_type.cpp | 18 ++++++++++++++++++ 4 files changed, 48 insertions(+), 10 deletions(-) diff --git a/changelog b/changelog index cc2921d5a2cd..8ea39cd7ef6e 100644 --- a/changelog +++ b/changelog @@ -127,6 +127,10 @@ Version 1.13.4+dev: * abilities - list of the IDs of all abilities * Additional fields in table returned by wesnoth.get_terrain_info: * icon, editor_image, light + * Additional fields in unit type proxu: + * race, id, alignment + * attacks, which returns the same thing as unit.attacks + * abilities, same as unit.abilities * LuaAI: * The table returned by check_*() now has a "result" field which gives a description of the action's result; similar to "status" @@ -165,9 +169,9 @@ Version 1.13.4+dev: total_movement -> max_moves movement_left -> moves states -> status - * Nearly All side, weapon, and terrain attributes available to Lua code - are now also exposed to WFL. The exceptions are mainly translatable - strings. + * Nearly all unit type, side, weapon, and terrain attributes available + to Lua code are now also exposed to WFL. The exceptions are mainly + translatable strings. * The 'special' attribute of weapons was renamed to 'specials', and it now contains the special IDs rather than their translateable names. * New syntax features: diff --git a/src/formula/callable_objects.cpp b/src/formula/callable_objects.cpp index 4eafc80e38c8..0f4b8c339868 100644 --- a/src/formula/callable_objects.cpp +++ b/src/formula/callable_objects.cpp @@ -376,6 +376,8 @@ variant unit_type_callable::get_value(const std::string& key) const return variant(u_.type_name()); } else if(key == "alignment") { return variant(lexical_cast(u_.alignment())); + } else if(key == "race") { + return variant(u_.race_id()); } else if(key == "abilities") { std::vector abilities = u_.get_ability_list(); std::vector res; @@ -388,6 +390,14 @@ variant unit_type_callable::get_value(const std::string& key) const res.push_back( variant(*it) ); } return variant( &res ); + } else if(key == "traits") { + std::vector res; + + FOREACH(const AUTO& config , u_.possible_traits()) + { + res.push_back(variant(config["id"].str())); + } + return variant(&res); } else if(key == "attacks") { std::vector att = u_.attacks(); std::vector res; @@ -395,13 +405,13 @@ variant unit_type_callable::get_value(const std::string& key) const for( std::vector::iterator i = att.begin(); i != att.end(); ++i) res.push_back(variant(new attack_type_callable(*i))); return variant(&res); - } else if(key == "hitpoints") { + } else if(key == "hitpoints" || key == "max_hitpoints") { return variant(u_.hitpoints()); - } else if(key == "experience") { + } else if(key == "experience" || key == "max_experience") { return variant(u_.experience_needed(true)); } else if(key == "level") { return variant(u_.level()); - } else if(key == "total_movement") { + } else if(key == "total_movement" || key == "max_moves" || key == "moves") { return variant(u_.movement()); } else if(key == "unpoisonable") { return variant(u_.musthave_status("unpoisonable")); @@ -411,6 +421,8 @@ variant unit_type_callable::get_value(const std::string& key) const return variant(u_.musthave_status("unplagueable")); } else if(key == "cost") { return variant(u_.cost()); + } else if(key == "recall_cost") { + return variant(u_.recall_cost()); } else if(key == "usage") { return variant(u_.usage()); } else { @@ -423,8 +435,10 @@ void unit_type_callable::get_inputs(std::vector* inpu using game_logic::FORMULA_READ_ONLY; inputs->push_back(game_logic::formula_input("id", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("type", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("race", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("alignment", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("abilities", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("traits", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("attacks", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("hitpoints", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("experience", FORMULA_READ_ONLY)); @@ -432,6 +446,7 @@ void unit_type_callable::get_inputs(std::vector* inpu inputs->push_back(game_logic::formula_input("total_movement", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("undead", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("cost", FORMULA_READ_ONLY)); + inputs->push_back(game_logic::formula_input("recall_cost", FORMULA_READ_ONLY)); inputs->push_back(game_logic::formula_input("usage", FORMULA_READ_ONLY)); } diff --git a/src/scripting/game_lua_kernel.cpp b/src/scripting/game_lua_kernel.cpp index 83c6ac9558b9..861de7a573cf 100644 --- a/src/scripting/game_lua_kernel.cpp +++ b/src/scripting/game_lua_kernel.cpp @@ -518,8 +518,8 @@ static int impl_unit_variables_get(lua_State *L) return luaW_pushvariable(L, v) ? 1 : 0; } /** - * Gets the attacks of a unit (__index metamethod). - * - Arg 1: table containing the userdata containing the unit id. + * Gets the attacks of a unit or unit type (__index metamethod). + * - Arg 1: table containing the userdata containing the unit or unit type. * - Arg 2: index (int) or id (string) identifying a particular attack. * - Ret 1: the unit's attacks. */ @@ -530,11 +530,12 @@ static int impl_unit_attacks_get(lua_State *L) } lua_rawgeti(L, 1, -1); const unit* u = luaW_tounit(L, -1); - if (!u) { + const unit_type* ut = static_cast(luaL_testudata(L, -1, "unit type")); + if (!u && !ut) { return luaL_argerror(L, 1, "unknown unit"); } const attack_type* attack = NULL; - const std::vector& attacks = u->attacks(); + const std::vector& attacks = u ? u->attacks() : ut->attacks(); if(!lua_isnumber(L,2)) { std::string attack_id = luaL_checkstring(L, 2); BOOST_FOREACH(const attack_type& at, attacks) { diff --git a/src/scripting/lua_unit_type.cpp b/src/scripting/lua_unit_type.cpp index 2ee9d8b6ddb9..478db31e07eb 100644 --- a/src/scripting/lua_unit_type.cpp +++ b/src/scripting/lua_unit_type.cpp @@ -15,6 +15,7 @@ #include "scripting/lua_unit_type.hpp" #include "scripting/lua_common.hpp" +#include "scripting/push_check.hpp" #include "units/types.hpp" #include @@ -47,6 +48,9 @@ static int impl_unit_type_get(lua_State *L) // Find the corresponding attribute. return_tstring_attrib("name", ut.type_name()); + return_string_attrib("id", ut.id()); + return_string_attrib("alignment", ut.alignment().to_string()); + return_string_attrib("race", ut.race_id()); return_int_attrib("max_hitpoints", ut.hitpoints()); return_int_attrib("max_moves", ut.movement()); return_int_attrib("max_experience", ut.experience_needed()); @@ -64,6 +68,20 @@ static int impl_unit_type_get(lua_State *L) } return 1; } + if (strcmp(m, "abilities") == 0) { + lua_push(L, ut.get_ability_list()); + return 1; + } + if (strcmp(m, "attacks") == 0) { + lua_createtable(L, 1, 0); + lua_pushvalue(L, 1); + // hack: store the unit_type at -1 because we want positive indices to refer to the attacks. + lua_rawseti(L, -2, -1); + lua_pushlightuserdata(L, uattacksKey); + lua_rawget(L, LUA_REGISTRYINDEX); + lua_setmetatable(L, -2); + return 1; + } return 0; } From de270e4d1d25d35f9668afffeb8c1b9ff3804d0d Mon Sep 17 00:00:00 2001 From: Celtic Minstrel Date: Wed, 30 Mar 2016 02:32:05 -0400 Subject: [PATCH 036/240] Remove duplicate file --- .../campaigns/Legend_of_Wesmere/ai/patrol.fai | 73 ------------------- .../chapter4/16_The_Chief_Must_Die.cfg | 12 +-- 2 files changed, 6 insertions(+), 79 deletions(-) delete mode 100644 data/campaigns/Legend_of_Wesmere/ai/patrol.fai diff --git a/data/campaigns/Legend_of_Wesmere/ai/patrol.fai b/data/campaigns/Legend_of_Wesmere/ai/patrol.fai deleted file mode 100644 index df76577ca1cb..000000000000 --- a/data/campaigns/Legend_of_Wesmere/ai/patrol.fai +++ /dev/null @@ -1,73 +0,0 @@ -fai 'patrol.fai' - -def closest_unit(ai*, me) - choose( - enemy_units, 'unit', - -distance_between(me.loc, unit.loc) - ); - -def step_move(me) - if( unit_at( desired_path[0] ), - if( desired_path.size > 1, - move_partial( - me.loc, - desired_path[1] - ), - end - ), - move_partial( - me.loc, - desired_path[0] - ) - ) - -where desired_path = shortest_path( me.loc, me.vars.next_step ); - -def move_ahead(ai*, me) - if( enemy_units, - if( distance_between( closest_unit(ai, me).loc, me.loc ) > me.moves-1, - move_partial( - me.loc, - me.vars.next_step - ), - - step_move(me) - - ), - move_partial( - me.loc, - me.vars.next_step - ) - ); - -def patrol_move(ai*, me) - if( me.vars.next_step = me.loc, - set_unit_var('next_step', - me.vars.waypoints[ me.vars.next_step ], - me.loc - ), - - move_ahead(ai,me) - ); - -if( me.moves = 0, - end, - if(attack, - attack, - patrol_move(self, me) - ) -) - -where attack = if( path_to, - if(path_to.size <= me.vars.guard_radius, - attack( me.loc, path_to.last, closest_unit(self, me).loc ), - 0 - ), - 0 - ) - -where path_to = if( enemy_units, - shortest_path( me.loc, closest_unit(self, me).loc ), - [] - ) -faiend \ No newline at end of file diff --git a/data/campaigns/Legend_of_Wesmere/scenarios/chapter4/16_The_Chief_Must_Die.cfg b/data/campaigns/Legend_of_Wesmere/scenarios/chapter4/16_The_Chief_Must_Die.cfg index 35a04cadc60c..4567529daf29 100644 --- a/data/campaigns/Legend_of_Wesmere/scenarios/chapter4/16_The_Chief_Must_Die.cfg +++ b/data/campaigns/Legend_of_Wesmere/scenarios/chapter4/16_The_Chief_Must_Die.cfg @@ -279,7 +279,7 @@ side=7 x,y=25,4 [ai] - loop_formula="{campaigns/Legend_of_Wesmere/ai/patrol.fai}" + loop_formula="{ai/formula/patrol.fai}" [vars] guard_radius=3 waypoints=[ loc(25,4) -> loc(14,2), loc(14,2) -> loc(9,12), loc(9,12) -> loc(6,19), loc(6,19) -> loc(25,4) ] @@ -295,7 +295,7 @@ side=7 x,y=10,20 [ai] - loop_formula="{campaigns/Legend_of_Wesmere/ai/patrol.fai}" + loop_formula="{ai/formula/patrol.fai}" [vars] guard_radius=3 waypoints=[ loc(10,20) -> loc(18,24), loc(18,24) -> loc(21,19), loc(21,19) -> loc(18,11), loc(18,11) -> loc(10,20) ] @@ -311,7 +311,7 @@ side=7 x,y=22,27 [ai] - loop_formula="{campaigns/Legend_of_Wesmere/ai/patrol.fai}" + loop_formula="{ai/formula/patrol.fai}" [vars] guard_radius=3 waypoints=[ loc(22,27) -> loc(27,24), loc(27,24) -> loc(21,16),loc(21,16) -> loc(22,27), loc(22,27) -> loc(6,24), loc(6,24)-> loc(22,27)] @@ -327,7 +327,7 @@ side=7 x,y=13,19 [ai] - loop_formula="{campaigns/Legend_of_Wesmere/ai/patrol.fai}" + loop_formula="{ai/formula/patrol.fai}" [vars] guard_radius=3 waypoints=[ loc(13,19) -> loc(16,15), loc(16,15) -> loc(25,4), loc(25,4) -> loc(13,19) ] @@ -343,7 +343,7 @@ side=7 x,y=29,24 [ai] - loop_formula="{campaigns/Legend_of_Wesmere/ai/patrol.fai}" + loop_formula="{ai/formula/patrol.fai}" [vars] guard_radius=3 waypoints=[ loc(29,24) -> loc(16,15), loc(16,15) -> loc(29,24) ] @@ -359,7 +359,7 @@ side=7 x,y=17,8 [ai] - loop_formula="{campaigns/Legend_of_Wesmere/ai/patrol.fai}" + loop_formula="{ai/formula/patrol.fai}" [vars] guard_radius=3 waypoints=[ loc(25,4) -> loc(16,15), loc(16,15) -> loc(25,4) ] From 353a9c38e7893bafbd166153ef216482d34aa895 Mon Sep 17 00:00:00 2001 From: ancestral Date: Wed, 30 Mar 2016 01:46:02 -0500 Subject: [PATCH 037/240] Lato is now the new game font. Initially, this will be limited to GUI2, but as tech is updated in the project, we hope to make Lato the new default everywhere in the game. --- data/gui/macros/_initial.cfg | 12 ++++++------ data/hardwired/fonts.cfg | 11 +++++++++-- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/data/gui/macros/_initial.cfg b/data/gui/macros/_initial.cfg index 9bf9f6d738d7..26fff748039c 100644 --- a/data/gui/macros/_initial.cfg +++ b/data/gui/macros/_initial.cfg @@ -29,7 +29,7 @@ # If the text is too high it returns the top side. # Rounding happens to the bottom side. #define GUI__TEXT_VERTICALLY_CENTRED - "(if(text_height < height, (height - text_height + 1) / 2, 0))" + "(if(text_height < height, (height - text_height - 2) / 2, 0))" #enddef #define GUI__CENTERED_TEXT FONT_SIZE FONT_STYLE FONT_COLOR @@ -291,21 +291,21 @@ #enddef #define GUI_NORMAL__FONT_SIZE__TINY - 10 + 13 #enddef #define GUI_NORMAL__FONT_SIZE__SMALL - 12 + 15 #enddef #define GUI_NORMAL__FONT_SIZE__DEFAULT - 14 + 17 #enddef #define GUI_NORMAL__FONT_SIZE__LARGE - 18 + 20 #enddef #define GUI_NORMAL__FONT_SIZE__TITLE - 20 + 22 #enddef diff --git a/data/hardwired/fonts.cfg b/data/hardwired/fonts.cfg index b6d850283709..bf193e5fcc64 100644 --- a/data/hardwired/fonts.cfg +++ b/data/hardwired/fonts.cfg @@ -4,13 +4,20 @@ # This is marked as translatable, to allow translators to # provide different font orders: one just has to install the # missing fonts without needing to change the gmo files - order=_ "DejaVuSans.ttf,Andagii.ttf,DroidSansJapanese.ttf,DroidSansFallbackFull.ttf,Junicode-Regular.ttf" - family_order=_ "DejaVu Sans,Andagii,Droid Sans Japanese,Droid Sans Fallback,Junicode" + order=_ "Lato-Regular.ttf,DejaVuSans.ttf,Andagii.ttf,DroidSansJapanese.ttf,DroidSansFallbackFull.ttf,Junicode-Regular.ttf" + family_order=_ "Lato" # Used by GUI2 only, hence no [font] blocks for these. The font files are # also automatically determined. family_order_monospace=_ "DejaVu Sans Mono" + [font] + name="Lato-Regular.ttf" + bold_name="Lato-Bold.ttf" + italic_name="Lato-Italic.ttf" + codepoints="32-126,160-831,834,837-879,885,890-893,900-902,904-906,908,910-929,931-974,976-1158,1160-1299,3647,7424-7626,7678-7835,7838,7840-7929,7936-7957,7960-7965,7968-8005,8008-8013,8016-8023,8025,8027,8029,8031-8048,8050,8052,8054,8056,8058,8060,8064-8116,8118-8122,8124-8125,8127-8132,8134-8136,8138,8140-8146,8150-8154,8157-8162,8164-8170,8172-8173,8178-8180,8182-8184,8186,8188,8190,8194-8208,8210-8226,8230,8239-8240,8242-8244,8249-8250,8252-8254,8260,8286-8287,8304-8305,8308-8340,8352-8373,8376-8378,8413,8453,8467,8470-8471,8480,8482,8494,8498,8525-8526,8531-8543,8579-8580,8592-8601,8616,8706,8710,8719,8721-8722,8725,8729-8730,8734-8735,8745,8747,8776,8800-8801,8804-8805,8962,8976,8992-8993,9312-9331,9450-9460,9471-9472,9474,9484,9488,9492,9496,9633,9642-9643,9674-9676,9679,9702,9728,9788,9833,10102-10111,11360-11372,11380-11383,11799,42775-42778,42784-42785,63743,64256-64260,65056-65059,65279" + [/font] + [font] name="DejaVuSans.ttf" bold_name="DejaVuSans-Bold.ttf" From 280c5fe69a2d1b4a2039c8f1bd6a70f1de7b21a4 Mon Sep 17 00:00:00 2001 From: ancestral Date: Wed, 30 Mar 2016 02:01:13 -0500 Subject: [PATCH 038/240] Minor formatting change to _initial.cfg Added font files for Lato, and SIL OFL license --- data/gui/macros/_initial.cfg | 2 +- fonts/Lato-Bold.ttf | Bin 0 -> 657188 bytes fonts/Lato-Italic.ttf | Bin 0 -> 723544 bytes fonts/Lato-Regular.ttf | Bin 0 -> 657212 bytes fonts/OFL | 94 +++++++++++++++++++++++++++++++++++ 5 files changed, 95 insertions(+), 1 deletion(-) create mode 100644 fonts/Lato-Bold.ttf create mode 100644 fonts/Lato-Italic.ttf create mode 100644 fonts/Lato-Regular.ttf create mode 100755 fonts/OFL diff --git a/data/gui/macros/_initial.cfg b/data/gui/macros/_initial.cfg index 26fff748039c..bac5a187870d 100644 --- a/data/gui/macros/_initial.cfg +++ b/data/gui/macros/_initial.cfg @@ -303,7 +303,7 @@ #enddef #define GUI_NORMAL__FONT_SIZE__LARGE - 20 + 20 #enddef #define GUI_NORMAL__FONT_SIZE__TITLE diff --git a/fonts/Lato-Bold.ttf b/fonts/Lato-Bold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..ef5ae3b43e99637fe8c09fe8eafd2302df88759e GIT binary patch literal 657188 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