diff --git a/src/game_initialization/connect_engine.cpp b/src/game_initialization/connect_engine.cpp index 16c4d665bb41..9bec55999771 100644 --- a/src/game_initialization/connect_engine.cpp +++ b/src/game_initialization/connect_engine.cpp @@ -24,7 +24,7 @@ #include "mp_game_utils.hpp" #include "mt_rng.hpp" #include "tod_manager.hpp" - +#include "multiplayer_ui.hpp" // For get_color_string #include #include #include @@ -851,7 +851,8 @@ side_engine::side_engine(const config& cfg, connect_engine& parent_engine, chose_random_(cfg["chose_random"].to_bool(false)), disallow_shuffle_(cfg["disallow_shuffle"].to_bool(false)), flg_(parent_.era_factions_, cfg_, parent_.force_lock_settings_, - parent_.params_.use_map_settings, parent_.params_.saved_game, color_) + parent_.params_.use_map_settings, parent_.params_.saved_game, color_), + custom_color_() { // Check if this side should give its control to some other side. const size_t side_cntr_index = cfg_["controller"].to_int(-1) - 1; @@ -918,7 +919,13 @@ side_engine::side_engine(const config& cfg, connect_engine& parent_engine, team_ = team_name_index; } if (!cfg["color"].empty()) { - color_ = game_config::color_info(cfg["color"]).index() - 1; + if(cfg["color"].to_int()) { + color_ = cfg["color"].to_int() - 1; + } + else { + custom_color_ = cfg["color"]; + color_ = 0; + } } // Initialize ai algorithm. @@ -1064,7 +1071,7 @@ config side_engine::new_config() const res["team_name"] = parent_.team_names_[team_]; res["user_team_name"] = parent_.user_team_names_[team_]; res["allow_player"] = allow_player_; - res["color"] = color_ + 1; + res["color"] = get_color(color_); res["gold"] = gold_; res["income"] = income_; @@ -1327,4 +1334,29 @@ void side_engine::add_controller_option(ng::controller controller, controller_options_.push_back(std::make_pair(controller, name)); } +std::vector side_engine::get_colors() const +{ + std::vector res; + for (int i = 0; i < num_colors(); ++i) { + res.push_back(mp::get_color_string(get_color(i))); + } + return res; +} + +std::string side_engine::get_color(size_t index) const +{ + if(!custom_color_.empty()) { + if(index == 0) { + return custom_color_; + } + index -= 1; + } + return lexical_cast(index + 1); +} + +int side_engine::num_colors() const +{ + return custom_color_.empty() ? gamemap::MAX_PLAYERS : gamemap::MAX_PLAYERS + 1; +} + } // end namespace ng diff --git a/src/game_initialization/connect_engine.hpp b/src/game_initialization/connect_engine.hpp index 579cd4d98537..1a69754e760f 100644 --- a/src/game_initialization/connect_engine.hpp +++ b/src/game_initialization/connect_engine.hpp @@ -219,6 +219,9 @@ class side_engine { return parent_.player_teams_; } flg_manager& flg() { return flg_; } + std::vector get_colors() const; + std::string get_color(size_t index) const; + int num_colors() const; private: side_engine(const side_engine& engine); void operator=(const side_engine&); @@ -255,6 +258,7 @@ class side_engine bool chose_random_; bool disallow_shuffle_; flg_manager flg_; + std::string custom_color_; }; } // end namespace ng diff --git a/src/game_initialization/multiplayer_connect.cpp b/src/game_initialization/multiplayer_connect.cpp index e3a458cd6385..812a1f567f0a 100644 --- a/src/game_initialization/multiplayer_connect.cpp +++ b/src/game_initialization/multiplayer_connect.cpp @@ -91,7 +91,7 @@ connect::side::side(connect& parent, ng::side_engine_ptr engine) : combo_leader_(parent.disp(), std::vector()), combo_gender_(parent.disp(), std::vector()), combo_team_(parent.disp(), engine_->player_teams()), - combo_color_(parent.disp(), parent.player_colors_), + combo_color_(parent.disp(), engine->get_colors()), slider_gold_(parent.video()), slider_income_(parent.video()) { @@ -371,7 +371,6 @@ connect::connect(game_display& disp, const std::string& game_name, const config& game_config, chat& c, config& gamelist, ng::connect_engine& engine) : mp::ui(disp, _("Game Lobby: ") + game_name, game_config, c, gamelist), - player_colors_(), ai_algorithms_(), sides_(), engine_(engine), @@ -410,11 +409,6 @@ connect::connect(game_display& disp, const std::string& game_name, ai_algorithms_ = ai::configuration::get_available_ais(); - // Colors. - for(int i = 0; i < gamemap::MAX_PLAYERS; ++i) { - player_colors_.push_back(get_color_string(i)); - } - // Sides. BOOST_FOREACH(ng::side_engine_ptr s, engine_.side_engines()) { sides_.push_back(side(*this, s)); diff --git a/src/game_initialization/multiplayer_connect.hpp b/src/game_initialization/multiplayer_connect.hpp index 1a0d6c841b21..313b3f797c98 100644 --- a/src/game_initialization/multiplayer_connect.hpp +++ b/src/game_initialization/multiplayer_connect.hpp @@ -123,8 +123,6 @@ class connect : public mp::ui const mp_game_settings& params() { return engine_.params(); } bool force_lock_settings() const { return engine_.force_lock_settings(); } - // Lists used for combos. - std::vector player_colors_; std::vector ai_algorithms_; side_list sides_; diff --git a/src/game_initialization/multiplayer_ui.cpp b/src/game_initialization/multiplayer_ui.cpp index dc2b821778ff..d94a9005733b 100644 --- a/src/game_initialization/multiplayer_ui.cpp +++ b/src/game_initialization/multiplayer_ui.cpp @@ -87,6 +87,16 @@ std::string get_color_string(int id) } } +std::string get_color_string(const std::string& id) +{ + std::map::iterator i_color = game_config::team_rgb_range.find(id); + std::map::iterator i_name = game_config::team_rgb_name.find(id); + bool has_color = i_color != game_config::team_rgb_range.end(); + bool has_name= i_name != game_config::team_rgb_name.end(); + + return rgb2highlight(has_color ? i_color->second.mid() : 0x00FF0000) + (has_name ? std::string(i_name->second) : _("Invalid Color")); +} + chat::chat() : message_history_(), last_update_() diff --git a/src/game_initialization/multiplayer_ui.hpp b/src/game_initialization/multiplayer_ui.hpp index 0a6794458b0c..9f93f4a1f7c5 100644 --- a/src/game_initialization/multiplayer_ui.hpp +++ b/src/game_initialization/multiplayer_ui.hpp @@ -36,6 +36,7 @@ class plugins_context; namespace mp { std::string get_color_string(int id); +std::string get_color_string(const std::string& id); /** this class memorizes a chat session. */ class chat